@@ -44,8 +44,10 @@ sil [ossa] @synchronization_point : $@convention(thin) () -> ()
4444// Hoist over br.
4545// CHECK-LABEL: sil [ossa] @hoist_over_branch_1 : {{.*}} {
4646// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
47+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
4748// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
48- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
49+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
50+ // CHECK: end_borrow [[LIFETIME]]
4951// CHECK: br [[EXIT:bb[0-9]+]]
5052// CHECK: [[EXIT]]:
5153// CHECK: return [[INSTANCE]]
6466// Hoist over cond_br.
6567// CHECK-LABEL: sil [ossa] @hoist_over_branch_2 : {{.*}} {
6668// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
69+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
6770// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
68- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
71+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
72+ // CHECK: end_borrow [[LIFETIME]]
6973// CHECK: cond_br undef, [[BL1:bb[0-9]+]], [[BL2:bb[0-9]+]]
7074// CHECK: [[BL1]]:
7175// CHECK: br [[EXIT:bb[0-9]+]]
9397// Hoist over two brs.
9498// CHECK-LABEL: sil [ossa] @hoist_over_branch_3 : {{.*}} {
9599// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
100+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
96101// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
97- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
102+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
103+ // CHECK: end_borrow [[LIFETIME]]
98104// CHECK: cond_br undef, [[BL1:bb[0-9]+]], [[BL2:bb[0-9]+]]
99105// CHECK: [[BL1]]:
100106// CHECK: br [[EXIT:bb[0-9]+]]
@@ -121,12 +127,15 @@ exit:
121127// Don't hoist over 1 / 2 brs.
122128// CHECK-LABEL: sil [ossa] @hoist_over_branch_4 : {{.*}} {
123129// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
130+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
124131// CHECK: cond_br undef, [[BL1:bb[0-9]+]], [[BL2:bb[0-9]+]]
125132// CHECK: [[BL1]]:
126133// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
127- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
134+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
135+ // CHECK: end_borrow [[LIFETIME]]
128136// CHECK: br [[EXIT:bb[0-9]+]]
129137// CHECK: [[BL2]]:
138+ // CHECK: end_borrow [[LIFETIME]]
130139// CHECK: br [[EXIT]]
131140// CHECK: [[EXIT]]:
132141// CHECK: return [[INSTANCE]]
@@ -149,8 +158,10 @@ exit:
149158// Hoist over switch_enum destinations.
150159// CHECK-LABEL: sil [ossa] @hoist_over_branch_5 : {{.*}} {
151160// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C, [[CASE:%[^,]+]] : $OneOfThree):
161+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
152162// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
153- // CHECK: {{%[0-9]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
163+ // CHECK: {{%[0-9]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
164+ // CHECK: end_borrow [[LIFETIME]]
154165// CHECK: switch_enum [[CASE]] : $OneOfThree, case #OneOfThree.one!enumelt: [[ONE_DEST:bb[0-9]+]], case #OneOfThree.two!enumelt: [[TWO_DEST:bb[0-9]+]], case #OneOfThree.three!enumelt: [[THREE_DEST:bb[0-9]+]]
155166// CHECK: [[ONE_DEST]]:
156167// CHECK: br [[EXIT:bb[0-9]+]]
@@ -590,11 +601,15 @@ entry(%instance : @guaranteed $C):
590601 return %result : $()
591602}
592603
593- // Hoist over an apply that uses a copy of the borrow.
594- // CHECK-LABEL: sil [ossa] @hoist_over_apply_at_copy : {{.*}} {
595- // CHECK-NOT: copy_value
596- // CHECK-LABEL: // end sil function 'hoist_over_apply_at_copy'
597- sil [ossa] @hoist_over_apply_at_copy : $@convention(thin) (@owned C) -> () {
604+ // Don't hoist over an apply that uses a copy of the borrow.
605+ // CHECK-LABEL: sil [ossa] @dont_hoist_over_apply_at_copy : {{.*}} {
606+ // CHECK: begin_borrow
607+ // CHECK: copy_value
608+ // CHECK: apply
609+ // CHECK: end_borrow
610+ // CHECK: destroy_value
611+ // CHECK-LABEL: } // end sil function 'dont_hoist_over_apply_at_copy'
612+ sil [ossa] @dont_hoist_over_apply_at_copy : $@convention(thin) (@owned C) -> () {
598613entry(%instance : @owned $C):
599614 %synchronization_point = function_ref @synchronization_point : $@convention(thin) () -> ()
600615 %callee_owned = function_ref @callee_owned : $@convention(thin) (@owned C) -> ()
@@ -612,13 +627,13 @@ entry(%instance : @owned $C):
612627 return %result : $()
613628}
614629
615- // Hoist over an apply that uses the borrow.
630+ // Don't hoist over an apply that uses the borrow.
616631// CHECK-LABEL: sil [ossa] @hoist_over_apply_at_borrow : {{.*}} {
617632// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
618633// CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
634+ // CHECK: apply {{%[^,]+}}([[LIFETIME]])
619635// CHECK: end_borrow [[LIFETIME]]
620- // CHECK: apply {{%[^,]+}}([[INSTANCE]])
621- // CHECK-LABEL: // end sil function 'hoist_over_apply_at_borrow'
636+ // CHECK-LABEL: } // end sil function 'hoist_over_apply_at_borrow'
622637sil [ossa] @hoist_over_apply_at_borrow : $@convention(thin) (@owned C) -> () {
623638entry(%instance : @owned $C):
624639 %lifetime = begin_borrow %instance : $C
@@ -645,7 +660,7 @@ entry(%instance : @owned $C):
645660// CHECK: [[COPY:%[^,]+]] = copy_value [[LIFETIME]]
646661// CHECK: end_borrow [[LIFETIME]]
647662// CHECK: begin_borrow [[COPY]]
648- // CHECK-LABEL: // end sil function 'hoist_over_borrow_of_copy'
663+ // CHECK-LABEL: } // end sil function 'hoist_over_borrow_of_copy'
649664sil [ossa] @hoist_over_borrow_of_copy : $@convention(thin) (@owned C) -> () {
650665entry(%instance : @owned $C):
651666 %lifetime_1 = begin_borrow %instance : $C
@@ -695,11 +710,18 @@ entry(%instance : @owned $C):
695710 return %result : $()
696711}
697712
698- // CHECK-LABEL: sil [ossa] @hoist_over_try_apply_at_borrow : {{.*}} {
713+ // CHECK-LABEL: sil [ossa] @dont_hoist_over_try_apply_at_borrow : {{.*}} {
699714// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
700- // CHECK-NEXT: try_apply undef([[INSTANCE]]) : $@convention(thin) (@guaranteed C) -> @error Error, normal bb1, error bb2
701- // CHECK-LABEL: } // end sil function 'hoist_over_try_apply_at_borrow'
702- sil [ossa] @hoist_over_try_apply_at_borrow : $@convention(thin) (@owned C) -> @error Error {
715+ // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
716+ // CHECK: try_apply undef([[LIFETIME]]) : {{.*}}, normal [[GOOD:bb[0-9]+]], error [[BAD:bb[0-9]+]]
717+ // CHECK: [[GOOD]]
718+ // CHECK: end_borrow [[LIFETIME]]
719+ // CHECK: destroy_value [[INSTANCE]]
720+ // CHECK: [[BAD]]
721+ // CHECK: end_borrow [[LIFETIME]]
722+ // CHECK: destroy_value [[INSTANCE]]
723+ // CHECK-LABEL: } // end sil function 'dont_hoist_over_try_apply_at_borrow'
724+ sil [ossa] @dont_hoist_over_try_apply_at_borrow : $@convention(thin) (@owned C) -> @error Error {
703725bb0(%instance : @owned $C):
704726 %lifetime = begin_borrow %instance : $C
705727 try_apply undef(%lifetime) : $@convention(thin) (@guaranteed C) -> @error Error, normal good, error bad
@@ -716,6 +738,74 @@ bad(%15 : @owned $Error):
716738 throw %15 : $Error
717739}
718740
741+ // CHECK-LABEL: sil [ossa] @dont_hoist_over_try_apply_barrier : {{.*}} {
742+ // CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
743+ // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
744+ // CHECK: try_apply undef() : {{.*}}, normal [[GOOD:bb[0-9]+]], error [[BAD:bb[0-9]+]]
745+ // CHECK: [[GOOD]]([[REGISTER_3:%[^,]+]] : $()):
746+ // CHECK: end_borrow [[LIFETIME]]
747+ // CHECK: destroy_value [[INSTANCE]]
748+ // CHECK: [[BAD]]([[ERROR:%[^,]+]] : @owned $Error):
749+ // CHECK: end_borrow [[LIFETIME]]
750+ // CHECK: destroy_value [[INSTANCE]]
751+ // CHECK: throw [[ERROR]]
752+ // CHECK-LABEL: } // end sil function 'dont_hoist_over_try_apply_barrier'
753+ sil [ossa] @dont_hoist_over_try_apply_barrier : $@convention(thin) (@owned C) -> @error Error {
754+ bb0(%instance : @owned $C):
755+ %lifetime = begin_borrow %instance : $C
756+ %_ = apply undef(%lifetime) : $@convention(thin) (@guaranteed C) -> ()
757+ try_apply undef() : $@convention(thin) () -> @error Error, normal good, error bad
758+
759+ good(%8 : $()):
760+ end_borrow %lifetime : $C
761+ destroy_value %instance : $C
762+ %13 = tuple ()
763+ return %13 : $()
764+
765+ bad(%15 : @owned $Error):
766+ end_borrow %lifetime : $C
767+ destroy_value %instance : $C
768+ throw %15 : $Error
769+ }
770+
771+ // Hoist up to two parallel barrier applies from a block with two predecessors.
772+ //
773+ // CHECK-LABEL: sil [ossa] @hoist_up_to_two_barrier_applies : $@convention(thin) (@owned C) -> () {
774+ // CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
775+ // CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [lexical] [[INSTANCE]]
776+ // CHECK: cond_br undef, [[LEFT:bb[0-9]+]], [[RIGHT:bb[0-9]+]]
777+ // CHECK: [[LEFT]]:
778+ // CHECK: [[REGISTER_3:%[^,]+]] = apply undef()
779+ // CHECK: end_borrow [[LIFETIME]]
780+ // CHECK: br [[EXIT:bb[0-9]+]]
781+ // CHECK: [[RIGHT]]:
782+ // CHECK: [[REGISTER_6:%[^,]+]] = apply undef()
783+ // CHECK: end_borrow [[LIFETIME]]
784+ // CHECK: br [[EXIT]]
785+ // CHECK: [[EXIT]]:
786+ // CHECK: destroy_value [[INSTANCE]]
787+ // CHECK-LABEL: } // end sil function 'hoist_up_to_two_barrier_applies'
788+ sil [ossa] @hoist_up_to_two_barrier_applies : $@convention(thin) (@owned C) -> () {
789+ entry(%instance : @owned $C):
790+ %lifetime = begin_borrow [lexical] %instance : $C
791+ %_ = apply undef(%lifetime) : $@convention(thin) (@guaranteed C) -> ()
792+ cond_br undef, left, right
793+
794+ left:
795+ %result_left = apply undef() : $@convention(thin) () -> ()
796+ br exit
797+
798+ right:
799+ %result_right = apply undef() : $@convention(thin) () -> ()
800+ br exit
801+
802+ exit:
803+ end_borrow %lifetime : $C
804+ destroy_value %instance : $C
805+ %retval = tuple ()
806+ return %retval : $()
807+ }
808+
719809// =============================================================================
720810// instruction tests }}
721811// =============================================================================
0 commit comments