@@ -195,3 +195,89 @@ join:
195
195
%sel = select i1 %phi1 , i32 %phi2 , i32 %phi3
196
196
ret i32 %sel
197
197
}
198
+
199
+ define i32 @dominating_values_select_same_block (i1 %c1 , i1 %c2 , ptr %p , ptr %p2 ) {
200
+ ; CHECK-LABEL: @dominating_values_select_same_block(
201
+ ; CHECK-NEXT: entry:
202
+ ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[P2:%.*]], align 4
203
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[FINAL:%.*]], label [[DELAY:%.*]]
204
+ ; CHECK: delay:
205
+ ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
206
+ ; CHECK-NEXT: [[TMP0:%.*]] = select i1 [[C2:%.*]], i32 [[A]], i32 [[B]]
207
+ ; CHECK-NEXT: br label [[FINAL]]
208
+ ; CHECK: final:
209
+ ; CHECK-NEXT: [[USE2:%.*]] = phi i32 [ [[B]], [[ENTRY:%.*]] ], [ [[TMP0]], [[DELAY]] ]
210
+ ; CHECK-NEXT: ret i32 [[USE2]]
211
+ ;
212
+ entry:
213
+ %a = load i32 , ptr %p
214
+ %b = load i32 , ptr %p2
215
+ br i1 %c1 , label %final , label %delay
216
+
217
+ delay:
218
+ br label %final
219
+
220
+ final:
221
+ %use2 = phi i1 [ false , %entry ], [ %c2 , %delay ]
222
+ %value = select i1 %use2 , i32 %a , i32 %b
223
+ ret i32 %value
224
+ }
225
+
226
+ define i32 @dominating_values_select_not_same_block (i1 %c1 , i1 %c2 , ptr %p , ptr %p2 ) {
227
+ ; CHECK-LABEL: @dominating_values_select_not_same_block(
228
+ ; CHECK-NEXT: entry:
229
+ ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
230
+ ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[P2:%.*]], align 4
231
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[FINAL:%.*]], label [[DELAY:%.*]]
232
+ ; CHECK: delay:
233
+ ; CHECK-NEXT: br label [[FINAL]]
234
+ ; CHECK: final:
235
+ ; CHECK-NEXT: [[USE2:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[C2:%.*]], [[DELAY]] ]
236
+ ; CHECK-NEXT: br label [[SPLIT:%.*]]
237
+ ; CHECK: split:
238
+ ; CHECK-NEXT: [[VALUE:%.*]] = select i1 [[USE2]], i32 [[A]], i32 [[B]]
239
+ ; CHECK-NEXT: ret i32 [[VALUE]]
240
+ ;
241
+ entry:
242
+ %a = load i32 , ptr %p
243
+ %b = load i32 , ptr %p2
244
+ br i1 %c1 , label %final , label %delay
245
+
246
+ delay:
247
+ br label %final
248
+
249
+ final:
250
+ %use2 = phi i1 [ false , %entry ], [ %c2 , %delay ]
251
+ br label %split
252
+
253
+ split:
254
+ %value = select i1 %use2 , i32 %a , i32 %b
255
+ ret i32 %value
256
+ }
257
+
258
+ define i32 @not_dominating_values (i1 %c1 , i1 %c2 , ptr %p , ptr %p2 ) {
259
+ ; CHECK-LABEL: @not_dominating_values(
260
+ ; CHECK-NEXT: entry:
261
+ ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P:%.*]], align 4
262
+ ; CHECK-NEXT: br i1 [[C1:%.*]], label [[FINAL:%.*]], label [[DELAY:%.*]]
263
+ ; CHECK: delay:
264
+ ; CHECK-NEXT: br label [[FINAL]]
265
+ ; CHECK: final:
266
+ ; CHECK-NEXT: [[USE2:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[C2:%.*]], [[DELAY]] ]
267
+ ; CHECK-NEXT: [[B:%.*]] = load i32, ptr [[P2:%.*]], align 4
268
+ ; CHECK-NEXT: [[VALUE:%.*]] = select i1 [[USE2]], i32 [[A]], i32 [[B]]
269
+ ; CHECK-NEXT: ret i32 [[VALUE]]
270
+ ;
271
+ entry:
272
+ %a = load i32 , ptr %p
273
+ br i1 %c1 , label %final , label %delay
274
+
275
+ delay:
276
+ br label %final
277
+
278
+ final:
279
+ %use2 = phi i1 [ false , %entry ], [ %c2 , %delay ]
280
+ %b = load i32 , ptr %p2
281
+ %value = select i1 %use2 , i32 %a , i32 %b
282
+ ret i32 %value
283
+ }
0 commit comments