@@ -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,12 +627,12 @@ 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]])
621636// 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):
@@ -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
0 commit comments