@@ -29,6 +29,9 @@ public protocol P {
29
29
func doSomething( )
30
30
}
31
31
32
+ public var trueValue : Bool { true }
33
+ public var falseValue : Bool { false }
34
+
32
35
///////////
33
36
// Tests //
34
37
///////////
@@ -40,12 +43,14 @@ public protocol P {
40
43
//
41
44
// We should have a llvm.dbg.addr for k since we moved it.
42
45
// 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
43
47
//
44
48
// Our undef should be an llvm.dbg.value. Counter-intuitively this works for
45
49
// both llvm.dbg.addr /and/ llvm.dbg.value. Importantly though its metadata
46
50
// should be for k since that is the variable that we are telling the debugger
47
51
// is no longer defined.
48
52
// 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
49
54
//
50
55
// CHECK: ret void
51
56
// CHECK-NEXT: }
@@ -83,9 +88,11 @@ public func copyableValueTest() {
83
88
// CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo15copyableVarTestyyF"()
84
89
// CHECK: call void @llvm.dbg.declare(metadata %T21move_function_dbginfo5KlassC** %m.debug,
85
90
// 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
86
92
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
87
93
// TODO: Should this be a deref like the original?
88
94
// 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
89
96
// CHECK: ret void
90
97
// CHECK-NEXT: }
91
98
//
@@ -127,6 +134,7 @@ public func copyableVarTest() {
127
134
// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
128
135
// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
129
136
// 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
130
138
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDR_LET_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
131
139
// CHECK: ret void
132
140
// CHECK-NEXT: }
@@ -177,8 +185,10 @@ public func addressOnlyValueTest<T : P>(_ x: T) {
177
185
// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
178
186
// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
179
187
// 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
180
189
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
181
190
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
191
+ // CHECK-NEXT: br
182
192
// CHECK: ret void
183
193
// CHECK-NEXT: }
184
194
//
@@ -226,6 +236,143 @@ public func addressOnlyVarTest<T : P>(_ x: T) {
226
236
k. doSomething ( )
227
237
}
228
238
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
+
229
376
//////////////////////////
230
377
// Late Metadata Checks //
231
378
//////////////////////////
@@ -234,3 +381,7 @@ public func addressOnlyVarTest<T : P>(_ x: T) {
234
381
// CHECK-DAG: ![[K_COPYABLE_VAR_METADATA]] = !DILocalVariable(name: "k",
235
382
// CHECK-DAG: ![[K_ADDR_LET_METADATA]] = !DILocalVariable(name: "k",
236
383
// 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