@@ -456,6 +456,57 @@ bb1(%newcopy : @owned $Klass, %newborrow1 : @guaranteed $Klass, %newborrow2 : @g
456456 end_borrow %newborrow2 : $Klass
457457 destroy_value %newcopy : $Klass
458458 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
459510 %res = tuple ()
460511 return %res : $()
461512}
0 commit comments