@@ -29,6 +29,9 @@ public protocol P {
2929 func doSomething( )
3030}
3131
32+ public var trueValue : Bool { true }
33+ public var falseValue : Bool { false }
34+
3235///////////
3336// Tests //
3437///////////
@@ -40,12 +43,14 @@ public protocol P {
4043//
4144// We should have a llvm.dbg.addr for k since we moved it.
4245// CHECK: call void @llvm.dbg.addr(metadata {{.*}}** %k.debug, metadata ![[K_COPYABLE_VALUE_METADATA:[0-9]*]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
46+ // CHECK-NEXT: br
4347//
4448// Our undef should be an llvm.dbg.value. Counter-intuitively this works for
4549// both llvm.dbg.addr /and/ llvm.dbg.value. Importantly though its metadata
4650// should be for k since that is the variable that we are telling the debugger
4751// is no longer defined.
4852// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC* undef, metadata ![[K_COPYABLE_VALUE_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
53+ // CHECK-NOT: br label
4954//
5055// CHECK: ret void
5156// CHECK-NEXT: }
@@ -83,9 +88,11 @@ public func copyableValueTest() {
8388// CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo15copyableVarTestyyF"()
8489// CHECK: call void @llvm.dbg.declare(metadata %T21move_function_dbginfo5KlassC** %m.debug,
8590// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
91+ // CHECK-NEXT: br
8692// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
8793// TODO: Should this be a deref like the original?
8894// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
95+ // CHECK-NEXT: br
8996// CHECK: ret void
9097// CHECK-NEXT: }
9198//
@@ -127,6 +134,7 @@ public func copyableVarTest() {
127134// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
128135// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
129136// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDR_LET_METADATA:[0-9]+]], metadata !DIExpression(DW_OP_deref)), !dbg ![[ADDR_LOC:[0-9]*]]
137+ // CHECK-NEXT: br
130138// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDR_LET_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
131139// CHECK: ret void
132140// CHECK-NEXT: }
@@ -177,8 +185,10 @@ public func addressOnlyValueTest<T : P>(_ x: T) {
177185// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
178186// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
179187// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA:[0-9]+]], metadata !DIExpression(DW_OP_deref)), !dbg ![[ADDR_LOC:[0-9]*]]
188+ // CHECK-NEXT: br
180189// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
181190// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
191+ // CHECK-NEXT: br
182192// CHECK: ret void
183193// CHECK-NEXT: }
184194//
@@ -226,6 +236,143 @@ public func addressOnlyVarTest<T : P>(_ x: T) {
226236 k. doSomething ( )
227237}
228238
239+ ///////////////////////
240+ // Conditional Tests //
241+ ///////////////////////
242+
243+ // CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo037copyableVarTestCCFlowReinitOutOfBlockF0yyF"(
244+ // CHECK: call void @llvm.dbg.declare(metadata %T21move_function_dbginfo5KlassC** %m.debug,
245+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
246+ // CHECK-NEXT: br label %[[BB_NEXT:[0-9]+]],
247+ //
248+ // CHECK: [[BB_NEXT]]:
249+ // CHECK: br i1 %{{[0-9]+}}, label %[[LHS:[0-9]+]], label %[[RHS:[0-9]+]],
250+ //
251+ // CHECK: [[LHS]]:
252+ // CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
253+ // CHECK: br label %[[CONT_BB:[0-9]+]],
254+ //
255+ // CHECK: [[RHS]]:
256+ // CHECK: br label %[[CONT_BB]],
257+ //
258+ // CHECK: [[CONT_BB]]:
259+ // TODO: Should this be a deref like the original?
260+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
261+ // CHECK-NEXT: br
262+ // CHECK: ret void
263+ // CHECK-NEXT: }
264+ public func copyableVarTestCCFlowReinitOutOfBlockTest( ) {
265+ var k = Klass ( )
266+ k. doSomething ( )
267+ if trueValue {
268+ let m = _move ( k)
269+ m. doSomething ( )
270+ }
271+ k = Klass ( )
272+ k. doSomething ( )
273+ }
274+
275+ // CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo034copyableVarTestCCFlowReinitInBlockF0yyF"(
276+ // CHECK: entry:
277+ // CHECK: call void @llvm.dbg.declare(metadata %T21move_function_dbginfo5KlassC** %m.debug,
278+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
279+ // CHECK-NEXT: br label %[[BB_NEXT:[0-9]+]],
280+ //
281+ // CHECK: [[BB_NEXT]]:
282+ // CHECK: br i1 %{{[0-9]+}}, label %[[LHS:[0-9]+]], label %[[RHS:[0-9]+]],
283+ //
284+ // CHECK: [[LHS]]:
285+ // CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
286+ // TODO: Should this be a deref like the original?
287+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
288+ // CHECK-NEXT: br label %[[BB_NEXT_2:[0-9]+]],
289+ //
290+ // CHECK: [[BB_NEXT_2]]:
291+ // CHECK: br label %[[CONT_BB:[0-9]+]],
292+ //
293+ // CHECK: [[RHS]]:
294+ // CHECK: br label %[[CONT_BB]],
295+ //
296+ // CHECK: [[CONT_BB]]:
297+ // CHECK: ret void
298+ // CHECK-NEXT: }
299+ public func copyableVarTestCCFlowReinitInBlockTest( ) {
300+ var k = Klass ( )
301+ k. doSomething ( )
302+ if trueValue {
303+ let m = _move ( k)
304+ m. doSomething ( )
305+ k = Klass ( )
306+ }
307+ k. doSomething ( )
308+ }
309+
310+ // CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo040addressOnlyVarTestCCFlowReinitOutOfBlockG0yyxmAA1PRzlF"(
311+ // CHECK: entry:
312+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo1PP* %k, metadata ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
313+ // CHECK-NEXT: br label %[[BB_NEXT:[0-9]+]],
314+ //
315+ // CHECK: [[BB_NEXT]]:
316+ // CHECK: br i1 %{{[0-9]+}}, label %[[LHS:[0-9]+]], label %[[RHS:[0-9]+]],
317+ //
318+ // CHECK: [[LHS]]:
319+ // CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo1PP* undef, metadata ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
320+ // CHECK: br label %[[CONT_BB:[0-9]+]],
321+ //
322+ // CHECK: [[RHS]]:
323+ // CHECK: br label %[[CONT_BB]],
324+ //
325+ // CHECK: [[CONT_BB]]:
326+ // TODO: Should this be a deref like the original?
327+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo1PP* %k, metadata ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
328+ // CHECK-NEXT: br
329+ // CHECK: ret void
330+ // CHECK-NEXT: }
331+ public func addressOnlyVarTestCCFlowReinitOutOfBlockTest< T : P > ( _ x: T . Type ) {
332+ var k = T . value
333+ k. doSomething ( )
334+ if trueValue {
335+ let m = _move ( k)
336+ m. doSomething ( )
337+ }
338+ k = T . value
339+ k. doSomething ( )
340+ }
341+
342+ // CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo037addressOnlyVarTestCCFlowReinitInBlockG0yyxmAA1PRzlF"(
343+ // CHECK: entry:
344+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo1PP* %k, metadata ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
345+ // CHECK-NEXT: br label %[[BB_NEXT:[0-9]+]],
346+ //
347+ // CHECK: [[BB_NEXT]]:
348+ // CHECK: br i1 %{{[0-9]+}}, label %[[LHS:[0-9]+]], label %[[RHS:[0-9]+]],
349+ //
350+ // CHECK: [[LHS]]:
351+ // CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo1PP* undef, metadata ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
352+ // TODO: Should this be a deref like the original?
353+ // CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo1PP* %k, metadata ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
354+ // CHECK-NEXT: br label %[[BB_NEXT_2:[0-9]+]],
355+ //
356+ // CHECK: [[BB_NEXT_2]]:
357+ // CHECK: br label %[[CONT_BB:[0-9]+]],
358+ //
359+ // CHECK: [[RHS]]:
360+ // CHECK: br label %[[CONT_BB]],
361+ //
362+ // CHECK: [[CONT_BB]]:
363+ // CHECK: ret void
364+ // CHECK-NEXT: }
365+ public func addressOnlyVarTestCCFlowReinitInBlockTest< T : P > ( _ x: T . Type ) {
366+ var k = T . value
367+ k. doSomething ( )
368+ if trueValue {
369+ let m = _move ( k)
370+ m. doSomething ( )
371+ k = T . value
372+ }
373+ k. doSomething ( )
374+ }
375+
229376//////////////////////////
230377// Late Metadata Checks //
231378//////////////////////////
@@ -234,3 +381,7 @@ public func addressOnlyVarTest<T : P>(_ x: T) {
234381// CHECK-DAG: ![[K_COPYABLE_VAR_METADATA]] = !DILocalVariable(name: "k",
235382// CHECK-DAG: ![[K_ADDR_LET_METADATA]] = !DILocalVariable(name: "k",
236383// CHECK-DAG: ![[K_ADDRONLY_VAR_METADATA]] = !DILocalVariable(name: "k",
384+ // CHECK-DAG: ![[K_COPYABLE_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA]] = !DILocalVariable(name: "k",
385+ // CHECK-DAG: ![[K_COPYABLE_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA]] = !DILocalVariable(name: "k",
386+ // CHECK-DAG: ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_OUT_BLOCK_METADATA]] = !DILocalVariable(name: "k",
387+ // CHECK-DAG: ![[K_ADDRESSONLY_VAR_CCFLOW_REINIT_IN_BLOCK_METADATA]] = !DILocalVariable(name: "k",
0 commit comments