@@ -456,6 +456,57 @@ bb1(%newcopy : @owned $Klass, %newborrow1 : @guaranteed $Klass, %newborrow2 : @g
456
456
end_borrow %newborrow2 : $Klass
457
457
destroy_value %newcopy : $Klass
458
458
destroy_value %copy2 : $Klass
459
+ %res = tuple ()
460
+ return %res : $()
461
+ }
462
+
463
+ // Nested borrows are currently not optimized in DCE
464
+ sil [ossa] @dce_nestedborrowlifetime1 : $@convention(thin) (@guaranteed NonTrivialStruct) -> @owned NonTrivialStruct {
465
+ bb0(%0 : @guaranteed $NonTrivialStruct):
466
+ %borrowo = begin_borrow %0 : $NonTrivialStruct
467
+ %borrow = begin_borrow %borrowo : $NonTrivialStruct
468
+ br bb1(%borrowo : $NonTrivialStruct, %borrow : $NonTrivialStruct)
469
+
470
+ bb1(%newborrowo : @guaranteed $NonTrivialStruct, %borrow2 : @guaranteed $NonTrivialStruct):
471
+ %newcopy = copy_value %borrow2 : $NonTrivialStruct
472
+ end_borrow %borrow2 : $NonTrivialStruct
473
+ end_borrow %newborrowo : $NonTrivialStruct
474
+ return %newcopy : $NonTrivialStruct
475
+ }
476
+
477
+ sil [ossa] @dce_nestedborrowlifetime2 : $@convention(thin) (@guaranteed Klass) -> () {
478
+ bb0(%0 : @guaranteed $Klass):
479
+ %borrowo = begin_borrow %0 : $Klass
480
+ %borrow = begin_borrow %borrowo : $Klass
481
+ %2 = function_ref @$use_klass2 : $@convention(thin) (@guaranteed Klass) -> ()
482
+ %3 = apply %2(%borrow) : $@convention(thin) (@guaranteed Klass) -> ()
483
+ %5 = apply %2(%borrowo) : $@convention(thin) (@guaranteed Klass) -> ()
484
+ br bb1(%borrowo : $Klass, %borrow : $Klass)
485
+
486
+ bb1(%newborrow : @guaranteed $Klass, %borrow2 : @guaranteed $Klass):
487
+ end_borrow %borrow2 : $Klass
488
+ end_borrow %newborrow : $Klass
489
+ %res = tuple ()
490
+ return %res : $()
491
+ }
492
+
493
+ // This test shows it is non trivial to find the insert point of an outer reborrow.
494
+ // Here %newborrowo and %newborrowi are both dead phis.
495
+ // First end_borrow for the incoming value of %newborrowi is added
496
+ // It is non straight forward to find the insert pt for the end_borrow of the incoming value of %newborrowo
497
+ // This may not be important once CanonicalizeOSSALifetime supports rewrite of multi-block borrows.
498
+ sil [ossa] @dce_nestedborrowlifetime3 : $@convention(thin) (@guaranteed Klass) -> () {
499
+ bb0(%0 : @guaranteed $Klass):
500
+ %borrowo = begin_borrow %0 : $Klass
501
+ %borrow = begin_borrow %borrowo : $Klass
502
+ %2 = function_ref @$use_klass2 : $@convention(thin) (@guaranteed Klass) -> ()
503
+ %3 = apply %2(%borrow) : $@convention(thin) (@guaranteed Klass) -> ()
504
+ %5 = apply %2(%borrowo) : $@convention(thin) (@guaranteed Klass) -> ()
505
+ br bb1(%borrow : $Klass, %borrowo : $Klass)
506
+
507
+ bb1(%newborrowi : @guaranteed $Klass, %newborrowo : @guaranteed $Klass):
508
+ end_borrow %newborrowi : $Klass
509
+ end_borrow %newborrowo : $Klass
459
510
%res = tuple ()
460
511
return %res : $()
461
512
}
0 commit comments