@@ -384,12 +384,12 @@ bb3:
384384 return %res : $()
385385}
386386
387+ // Test to check no dead args are passed to bb3 as phi arg
387388// CHECK-LABEL: sil [ossa] @multi_basic_block_stack_deallocated_phiarg :
388389// CHECK-NOT: alloc_stack
389390// CHECK-LABEL: bb2:
390- // CHECK: br bb3(undef : $Klass)
391- // CHECK: bb3([[PHI:%.*]] : @owned $Klass):
392- // CHECK-NEXT: end_lifetime [[PHI]] : $Klass
391+ // CHECK: br bb3
392+ // CHECK: bb3:
393393// CHECK-LABEL: } // end sil function 'multi_basic_block_stack_deallocated_phiarg'
394394sil [ossa] @multi_basic_block_stack_deallocated_phiarg : $@convention(thin) (@owned Klass) -> () {
395395bb0(%0 : @owned $Klass):
@@ -410,13 +410,12 @@ bb3:
410410 return %res : $()
411411}
412412
413+ // Test to check no dead args are passed to bb3 as phi arg
413414// CHECK-LABEL: sil [ossa] @multi_asi_basic_block_stack_deallocated_phiarg :
414415// CHECK-NOT: alloc_stack
415416// CHECK-LABEL: bb2:
416- // CHECK: br bb3(undef : $Klass, undef : $Klass)
417- // CHECK: bb3([[PHI1:%.*]] : @owned $Klass, [[PHI2:%.*]] : @owned $Klass):
418- // CHECK-NEXT: end_lifetime [[PHI2]] : $Klass
419- // CHECK-NEXT: end_lifetime [[PHI1]] : $Klass
417+ // CHECK: br bb3
418+ // CHECK: bb3:
420419// CHECK-LABEL: } // end sil function 'multi_asi_basic_block_stack_deallocated_phiarg'
421420sil [ossa] @multi_asi_basic_block_stack_deallocated_phiarg : $@convention(thin) (@owned Klass, @owned Klass) -> () {
422421bb0(%0 : @owned $Klass, %1 : @owned $Klass):
446445
447446// CHECK-LABEL: sil [ossa] @multi_basic_block_destroyed_last_stored_val_phiarg :
448447// CHECK-NOT: alloc_stack
449- // CHECK-LABEL: bb2:
450- // CHECK: br bb3(undef : $Klass)
448+ // CHECK-LABEL: bb3:
451449// CHECK-LABEL: } // end sil function 'multi_basic_block_destroyed_last_stored_val_phiarg'
452450sil [ossa] @multi_basic_block_destroyed_last_stored_val_phiarg : $@convention(thin) (@owned Klass) -> () {
453451bb0(%0 : @owned $Klass):
@@ -630,3 +628,51 @@ bb0(%0 : @owned $Klass):
630628 return %7 : $()
631629}
632630
631+ // CHECK-LABEL: sil [ossa] @multi_basic_block_bug1 :
632+ // CHECK-NOT: alloc_stack
633+ // CHECK-LABEL: } // end sil function 'multi_basic_block_bug1'
634+ sil [ossa] @multi_basic_block_bug1 : $@convention(thin) (@owned Klass, @owned Klass) -> @owned Klass {
635+ bb0(%0 : @owned $Klass, %1 : @owned $Klass):
636+ %stk1 = alloc_stack $Klass
637+ store %0 to [init] %stk1 : $*Klass
638+ cond_br undef, bb1, bb2
639+
640+ bb1:
641+ %new1 = load [take] %stk1 : $*Klass
642+ destroy_value %1 : $Klass
643+ dealloc_stack %stk1 : $*Klass
644+ br bbret(%new1 : $Klass)
645+
646+ bb2:
647+ store %1 to [assign] %stk1 : $*Klass
648+ %new2 = load [take] %stk1 : $*Klass
649+ dealloc_stack %stk1 : $*Klass
650+ br bbret(%new2 : $Klass)
651+
652+ bbret(%new : @owned $Klass):
653+ return %new : $Klass
654+ }
655+
656+ // CHECK-LABEL: sil [ossa] @multi_basic_block_bug2 :
657+ // CHECK-NOT: alloc_stack
658+ // CHECK-LABEL: } // end sil function 'multi_basic_block_bug2'
659+ sil [ossa] @multi_basic_block_bug2 : $@convention(thin) (@owned Klass, @owned Klass) -> @owned Klass {
660+ bb0(%0 : @owned $Klass, %1 : @owned $Klass):
661+ %stk1 = alloc_stack $Klass
662+ store %0 to [init] %stk1 : $*Klass
663+ cond_br undef, bb1, bb2
664+
665+ bb1:
666+ %new1 = load [take] %stk1 : $*Klass
667+ destroy_value %1 : $Klass
668+ br bbret(%new1 : $Klass)
669+
670+ bb2:
671+ store %1 to [assign] %stk1 : $*Klass
672+ %new2 = load [take] %stk1 : $*Klass
673+ br bbret(%new2 : $Klass)
674+
675+ bbret(%new : @owned $Klass):
676+ dealloc_stack %stk1 : $*Klass
677+ return %new : $Klass
678+ }
0 commit comments