@@ -115,3 +115,107 @@ split:
115
115
exit:
116
116
ret void
117
117
}
118
+
119
+ ; Variants of the above test with swapped branch destinations.
120
+
121
+ define void @test1_swapped (i1 %c ) {
122
+ ; CHECK-LABEL: define void @test1_swapped(
123
+ ; CHECK-SAME: i1 [[C:%.*]]) {
124
+ ; CHECK-NEXT: start:
125
+ ; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
126
+ ; CHECK-NEXT: br i1 [[C_FR]], label [[START_SPLIT_US:%.*]], label [[START_SPLIT:%.*]]
127
+ ; CHECK: start.split.us:
128
+ ; CHECK-NEXT: br label [[LOOP_US:%.*]]
129
+ ; CHECK: loop.us:
130
+ ; CHECK-NEXT: call void @foo()
131
+ ; CHECK-NEXT: br label [[LOOP_US]]
132
+ ; CHECK: start.split:
133
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
134
+ ; CHECK: loop:
135
+ ; CHECK-NEXT: call void @foo()
136
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
137
+ ; CHECK: exit:
138
+ ; CHECK-NEXT: ret void
139
+ ;
140
+ start:
141
+ br label %loop
142
+
143
+ loop:
144
+ %fn = load ptr , ptr @vtable , align 8
145
+ call void %fn ()
146
+ br i1 %c , label %loop , label %exit
147
+
148
+ exit:
149
+ ret void
150
+ }
151
+
152
+ define void @test2_swapped (i1 %c , ptr %p ) {
153
+ ; CHECK-LABEL: define void @test2_swapped(
154
+ ; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) {
155
+ ; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
156
+ ; CHECK-NEXT: br i1 [[C_FR]], label [[DOTSPLIT_US:%.*]], label [[DOTSPLIT:%.*]]
157
+ ; CHECK: .split.us:
158
+ ; CHECK-NEXT: br label [[LOOP_US:%.*]]
159
+ ; CHECK: loop.us:
160
+ ; CHECK-NEXT: call void @foo()
161
+ ; CHECK-NEXT: call void @bar()
162
+ ; CHECK-NEXT: br label [[LOOP_US]]
163
+ ; CHECK: .split:
164
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
165
+ ; CHECK: loop:
166
+ ; CHECK-NEXT: call void @foo()
167
+ ; CHECK-NEXT: call void @bar()
168
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
169
+ ; CHECK: exit:
170
+ ; CHECK-NEXT: ret void
171
+ ;
172
+ br label %loop
173
+
174
+ loop:
175
+ %fn = load ptr , ptr @vtable , align 8
176
+ call void %fn ()
177
+ call void @bar ()
178
+ br i1 %c , label %loop , label %exit
179
+
180
+ exit:
181
+ ret void
182
+ }
183
+
184
+ define void @test3_swapped (i1 %c , ptr %p ) {
185
+ ; CHECK-LABEL: define void @test3_swapped(
186
+ ; CHECK-SAME: i1 [[C:%.*]], ptr [[P:%.*]]) {
187
+ ; CHECK-NEXT: [[C_FR:%.*]] = freeze i1 [[C]]
188
+ ; CHECK-NEXT: br i1 [[C_FR]], label [[DOTSPLIT_US:%.*]], label [[DOTSPLIT:%.*]]
189
+ ; CHECK: .split.us:
190
+ ; CHECK-NEXT: br label [[LOOP_US:%.*]]
191
+ ; CHECK: loop.us:
192
+ ; CHECK-NEXT: br label [[SPLIT_US:%.*]]
193
+ ; CHECK: split.us:
194
+ ; CHECK-NEXT: call void @foo()
195
+ ; CHECK-NEXT: call void @bar()
196
+ ; CHECK-NEXT: br label [[LOOP_US]]
197
+ ; CHECK: .split:
198
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
199
+ ; CHECK: loop:
200
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
201
+ ; CHECK: split:
202
+ ; CHECK-NEXT: call void @foo()
203
+ ; CHECK-NEXT: call void @bar()
204
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
205
+ ; CHECK: exit:
206
+ ; CHECK-NEXT: ret void
207
+ ;
208
+ br label %loop
209
+
210
+ loop:
211
+ %fn = load ptr , ptr @vtable , align 8
212
+ br label %split
213
+
214
+ split:
215
+ call void %fn ()
216
+ call void @bar ()
217
+ br i1 %c , label %loop , label %exit
218
+
219
+ exit:
220
+ ret void
221
+ }
0 commit comments