@@ -44,8 +44,10 @@ sil [ossa] @synchronization_point : $@convention(thin) () -> ()
44
44
// Hoist over br.
45
45
// CHECK-LABEL: sil [ossa] @hoist_over_branch_1 : {{.*}} {
46
46
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
47
+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
47
48
// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
48
- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
49
+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
50
+ // CHECK: end_borrow [[LIFETIME]]
49
51
// CHECK: br [[EXIT:bb[0-9]+]]
50
52
// CHECK: [[EXIT]]:
51
53
// CHECK: return [[INSTANCE]]
64
66
// Hoist over cond_br.
65
67
// CHECK-LABEL: sil [ossa] @hoist_over_branch_2 : {{.*}} {
66
68
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
69
+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
67
70
// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
68
- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
71
+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
72
+ // CHECK: end_borrow [[LIFETIME]]
69
73
// CHECK: cond_br undef, [[BL1:bb[0-9]+]], [[BL2:bb[0-9]+]]
70
74
// CHECK: [[BL1]]:
71
75
// CHECK: br [[EXIT:bb[0-9]+]]
93
97
// Hoist over two brs.
94
98
// CHECK-LABEL: sil [ossa] @hoist_over_branch_3 : {{.*}} {
95
99
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
100
+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
96
101
// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
97
- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
102
+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
103
+ // CHECK: end_borrow [[LIFETIME]]
98
104
// CHECK: cond_br undef, [[BL1:bb[0-9]+]], [[BL2:bb[0-9]+]]
99
105
// CHECK: [[BL1]]:
100
106
// CHECK: br [[EXIT:bb[0-9]+]]
@@ -121,12 +127,15 @@ exit:
121
127
// Don't hoist over 1 / 2 brs.
122
128
// CHECK-LABEL: sil [ossa] @hoist_over_branch_4 : {{.*}} {
123
129
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
130
+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
124
131
// CHECK: cond_br undef, [[BL1:bb[0-9]+]], [[BL2:bb[0-9]+]]
125
132
// CHECK: [[BL1]]:
126
133
// CHECK: [[CALLEE_GUARANTEED:%[^,]+]] = function_ref @callee_guaranteed
127
- // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[INSTANCE]])
134
+ // CHECK: {{%[^,]+}} = apply [[CALLEE_GUARANTEED]]([[LIFETIME]])
135
+ // CHECK: end_borrow [[LIFETIME]]
128
136
// CHECK: br [[EXIT:bb[0-9]+]]
129
137
// CHECK: [[BL2]]:
138
+ // CHECK: end_borrow [[LIFETIME]]
130
139
// CHECK: br [[EXIT]]
131
140
// CHECK: [[EXIT]]:
132
141
// CHECK: return [[INSTANCE]]
@@ -149,8 +158,10 @@ exit:
149
158
// Hoist over switch_enum destinations.
150
159
// CHECK-LABEL: sil [ossa] @hoist_over_branch_5 : {{.*}} {
151
160
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C, [[CASE:%[^,]+]] : $OneOfThree):
161
+ // CHECK: [[LIFETIME:%[^,]]] = begin_borrow [[INSTANCE]]
152
162
// 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]]
154
165
// 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]+]]
155
166
// CHECK: [[ONE_DEST]]:
156
167
// CHECK: br [[EXIT:bb[0-9]+]]
@@ -590,11 +601,15 @@ entry(%instance : @guaranteed $C):
590
601
return %result : $()
591
602
}
592
603
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) -> () {
598
613
entry(%instance : @owned $C):
599
614
%synchronization_point = function_ref @synchronization_point : $@convention(thin) () -> ()
600
615
%callee_owned = function_ref @callee_owned : $@convention(thin) (@owned C) -> ()
@@ -612,13 +627,13 @@ entry(%instance : @owned $C):
612
627
return %result : $()
613
628
}
614
629
615
- // Hoist over an apply that uses the borrow.
630
+ // Don't hoist over an apply that uses the borrow.
616
631
// CHECK-LABEL: sil [ossa] @hoist_over_apply_at_borrow : {{.*}} {
617
632
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] : @owned $C):
618
633
// CHECK: [[LIFETIME:%[^,]+]] = begin_borrow [[INSTANCE]]
634
+ // CHECK: apply {{%[^,]+}}([[LIFETIME]])
619
635
// 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'
622
637
sil [ossa] @hoist_over_apply_at_borrow : $@convention(thin) (@owned C) -> () {
623
638
entry(%instance : @owned $C):
624
639
%lifetime = begin_borrow %instance : $C
@@ -645,7 +660,7 @@ entry(%instance : @owned $C):
645
660
// CHECK: [[COPY:%[^,]+]] = copy_value [[LIFETIME]]
646
661
// CHECK: end_borrow [[LIFETIME]]
647
662
// 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'
649
664
sil [ossa] @hoist_over_borrow_of_copy : $@convention(thin) (@owned C) -> () {
650
665
entry(%instance : @owned $C):
651
666
%lifetime_1 = begin_borrow %instance : $C
@@ -695,11 +710,18 @@ entry(%instance : @owned $C):
695
710
return %result : $()
696
711
}
697
712
698
- // CHECK-LABEL: sil [ossa] @hoist_over_try_apply_at_borrow : {{.*}} {
713
+ // CHECK-LABEL: sil [ossa] @dont_hoist_over_try_apply_at_borrow : {{.*}} {
699
714
// 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 {
703
725
bb0(%instance : @owned $C):
704
726
%lifetime = begin_borrow %instance : $C
705
727
try_apply undef(%lifetime) : $@convention(thin) (@guaranteed C) -> @error Error, normal good, error bad
@@ -716,6 +738,74 @@ bad(%15 : @owned $Error):
716
738
throw %15 : $Error
717
739
}
718
740
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
+
719
809
// =============================================================================
720
810
// instruction tests }}
721
811
// =============================================================================
0 commit comments