@@ -339,3 +339,86 @@ bb4:
339
339
return %res : $()
340
340
}
341
341
342
+ struct TestStruct {
343
+ var val:Klass
344
+ var index:Int
345
+ }
346
+
347
+ // CHECK-LABEL: sil [ossa] @dce_destructurenotfullydead :
348
+ // CHECK-NOT: copy_value
349
+ // CHECK-LABEL: } // end sil function 'dce_destructurenotfullydead'
350
+ sil [ossa] @dce_destructurenotfullydead : $@convention(thin) (@owned TestStruct) -> Int {
351
+ bb0(%0 : @owned $TestStruct):
352
+ %stk = alloc_stack $TestStruct
353
+ store %0 to [init] %stk : $*TestStruct
354
+ %copy = load [take] %stk : $*TestStruct
355
+ (%2, %3) = destructure_struct %copy : $TestStruct
356
+ %4 = struct $TestStruct (%2 : $Klass, %3 : $Int)
357
+ destroy_value %4 : $TestStruct
358
+ dealloc_stack %stk : $*TestStruct
359
+ return %3 : $Int
360
+ }
361
+
362
+ // CHECK-LABEL: sil [ossa] @dce_borrowlifetime1 :
363
+ // CHECK: bb1([[ARG1:%.*]] : @owned $NonTrivialStruct, [[ARG2:%.*]] : @guaranteed $NonTrivialStruct):
364
+ // CHECK-LABEL: } // end sil function 'dce_borrowlifetime1'
365
+ sil [ossa] @dce_borrowlifetime1 : $@convention(thin) (@guaranteed NonTrivialStruct) -> @owned NonTrivialStruct {
366
+ bb0(%0 : @guaranteed $NonTrivialStruct):
367
+ %copy = copy_value %0 : $NonTrivialStruct
368
+ %borrow = begin_borrow %copy : $NonTrivialStruct
369
+ br bb1(%copy : $NonTrivialStruct, %borrow : $NonTrivialStruct)
370
+
371
+ bb1(%copy2 : @owned $NonTrivialStruct, %borrow2 : @guaranteed $NonTrivialStruct):
372
+ %newcopy = copy_value %borrow2 : $NonTrivialStruct
373
+ end_borrow %borrow2 : $NonTrivialStruct
374
+ destroy_value %copy2 : $NonTrivialStruct
375
+ return %newcopy : $NonTrivialStruct
376
+ }
377
+
378
+ // CHECK-LABEL: sil [ossa] @infinite_loop :
379
+ // CHECK-NOT: copy_value
380
+ // CHECK-LABEL: } // end sil function 'infinite_loop'
381
+ sil [ossa] @infinite_loop : $@convention(thin) (@guaranteed NonTrivialStruct, @guaranteed NonTrivialStruct) -> () {
382
+ bb0(%0 : @guaranteed $NonTrivialStruct, %1 : @guaranteed $NonTrivialStruct):
383
+ cond_br undef, bb1, bb4
384
+
385
+ bb1:
386
+ %copy0 = copy_value %0 : $NonTrivialStruct
387
+ %borrow0 = begin_borrow %copy0 : $NonTrivialStruct
388
+ br bb3(%borrow0 : $NonTrivialStruct, %copy0 : $NonTrivialStruct)
389
+
390
+ bb3(%newborrow : @guaranteed $NonTrivialStruct, %newowned : @owned $NonTrivialStruct):
391
+ br bb3(%newborrow : $NonTrivialStruct, %newowned : $NonTrivialStruct)
392
+
393
+ bb4:
394
+ %ret = tuple ()
395
+ return %ret : $()
396
+ }
397
+
398
+ // CHECK-LABEL: sil [ossa] @dce_reborrow_with_different_basevalues :
399
+ // CHECK: bb3([[ARG1:%.*]] : @guaranteed $NonTrivialStruct, [[ARG2:%.*]] : @owned $NonTrivialStruct, [[ARG3:%.*]] : @owned $NonTrivialStruct):
400
+ // CHECK-LABEL: } // end sil function 'dce_reborrow_with_different_basevalues'
401
+ sil [ossa] @dce_reborrow_with_different_basevalues : $@convention(thin) (@guaranteed NonTrivialStruct, @guaranteed NonTrivialStruct) -> @owned NonTrivialStruct {
402
+ bb0(%0 : @guaranteed $NonTrivialStruct, %1 : @guaranteed $NonTrivialStruct):
403
+ cond_br undef, bb1, bb2
404
+
405
+ bb1:
406
+ %copy0a = copy_value %0 : $NonTrivialStruct
407
+ %borrow0a = begin_borrow %copy0a : $NonTrivialStruct
408
+ %copy1a = copy_value %1 : $NonTrivialStruct
409
+ br bb3(%borrow0a : $NonTrivialStruct, %copy0a : $NonTrivialStruct, %copy1a : $NonTrivialStruct)
410
+
411
+ bb2:
412
+ %copy1b = copy_value %1 : $NonTrivialStruct
413
+ %borrow0b = begin_borrow %copy1b : $NonTrivialStruct
414
+ %copy0b = copy_value %0 : $NonTrivialStruct
415
+ br bb3(%borrow0b : $NonTrivialStruct, %copy0b : $NonTrivialStruct, %copy1b : $NonTrivialStruct)
416
+
417
+ bb3(%newborrow : @guaranteed $NonTrivialStruct, %newowned1 : @owned $NonTrivialStruct, %newowned2 : @owned $NonTrivialStruct):
418
+ %res = copy_value %newborrow : $NonTrivialStruct
419
+ end_borrow %newborrow : $NonTrivialStruct
420
+ destroy_value %newowned1 : $NonTrivialStruct
421
+ destroy_value %newowned2 : $NonTrivialStruct
422
+ return %res : $NonTrivialStruct
423
+ }
424
+
0 commit comments