@@ -300,3 +300,126 @@ define void @self-reference() {
300
300
end:
301
301
ret void
302
302
}
303
+
304
+ define void @pr106083_invalidBBarg_fold (i1 %cmp1 , i1 %cmp2 , i1 %not , ptr %d ) {
305
+ ; CHECK-LABEL: @pr106083_invalidBBarg_fold(
306
+ ; CHECK-NEXT: bb:
307
+ ; CHECK-NEXT: br i1 [[CMP1:%.*]], label [[BB1:%.*]], label [[SEL_SI_UNFOLD_FALSE:%.*]]
308
+ ; CHECK: sel.si.unfold.false:
309
+ ; CHECK-NEXT: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 1, [[BB:%.*]] ]
310
+ ; CHECK-NEXT: br label [[BB1]]
311
+ ; CHECK: BB1:
312
+ ; CHECK-NEXT: [[I:%.*]] = phi i16 [ 0, [[BB1_BACKEDGE:%.*]] ], [ 0, [[BB]] ], [ 1, [[BB7:%.*]] ], [ 0, [[SEL_SI_UNFOLD_FALSE]] ], [ 1, [[BB7_JT0:%.*]] ]
313
+ ; CHECK-NEXT: [[SEL_SI_UNFOLD_PHI:%.*]] = phi i32 [ [[SEL_SI_UNFOLD_PHI]], [[BB1_BACKEDGE]] ], [ [[SEL_SI_UNFOLD_PHI]], [[BB7]] ], [ 0, [[BB]] ], [ [[DOTSI_UNFOLD_PHI1]], [[SEL_SI_UNFOLD_FALSE]] ], [ [[SEL_SI_UNFOLD_PHI]], [[BB7_JT0]] ]
314
+ ; CHECK-NEXT: br i1 [[NOT:%.*]], label [[BB7_JT0]], label [[BB2:%.*]]
315
+ ; CHECK: BB2:
316
+ ; CHECK-NEXT: store i16 0, ptr [[D:%.*]], align 2
317
+ ; CHECK-NEXT: br i1 [[CMP2:%.*]], label [[BB7]], label [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0:%.*]]
318
+ ; CHECK: spec.select.si.unfold.false:
319
+ ; CHECK-NEXT: br label [[BB7]]
320
+ ; CHECK: spec.select.si.unfold.false.jt0:
321
+ ; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[BB2]] ]
322
+ ; CHECK-NEXT: br label [[BB7_JT0]]
323
+ ; CHECK: BB7:
324
+ ; CHECK-NEXT: [[D_PROMOTED4:%.*]] = phi i16 [ 1, [[BB2]] ], [ 1, [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]] ]
325
+ ; CHECK-NEXT: [[_3:%.*]] = phi i32 [ [[SEL_SI_UNFOLD_PHI]], [[BB2]] ], [ poison, [[SPEC_SELECT_SI_UNFOLD_FALSE]] ]
326
+ ; CHECK-NEXT: switch i32 [[_3]], label [[BB1_BACKEDGE]] [
327
+ ; CHECK-NEXT: i32 0, label [[BB1]]
328
+ ; CHECK-NEXT: i32 1, label [[BB8:%.*]]
329
+ ; CHECK-NEXT: ]
330
+ ; CHECK: BB7.jt0:
331
+ ; CHECK-NEXT: [[D_PROMOTED4_JT0:%.*]] = phi i16 [ 0, [[BB1]] ], [ 1, [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0]] ]
332
+ ; CHECK-NEXT: [[_3_JT0:%.*]] = phi i32 [ 0, [[BB1]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0]] ]
333
+ ; CHECK-NEXT: br label [[BB1]]
334
+ ; CHECK: BB1.backedge:
335
+ ; CHECK-NEXT: br label [[BB1]]
336
+ ; CHECK: BB8:
337
+ ; CHECK-NEXT: ret void
338
+ ;
339
+ bb:
340
+ %sel = select i1 %cmp1 , i32 0 , i32 1
341
+ br label %BB1
342
+
343
+ BB1: ; preds = %BB1.backedge, %BB7, %bb
344
+ %i = phi i16 [ 0 , %BB1.backedge ], [ 0 , %bb ], [ 1 , %BB7 ]
345
+ br i1 %not , label %BB7 , label %BB2
346
+
347
+ BB2: ; preds = %BB1
348
+ store i16 0 , ptr %d , align 2
349
+ %spec.select = select i1 %cmp2 , i32 %sel , i32 0
350
+ br label %BB7
351
+
352
+ BB7: ; preds = %BB2, %BB1
353
+ %d.promoted4 = phi i16 [ 0 , %BB1 ], [ 1 , %BB2 ]
354
+ %_3 = phi i32 [ 0 , %BB1 ], [ %spec.select , %BB2 ]
355
+ switch i32 %_3 , label %BB1.backedge [
356
+ i32 0 , label %BB1
357
+ i32 1 , label %BB8
358
+ ]
359
+
360
+ BB1.backedge: ; preds = %BB7
361
+ br label %BB1
362
+
363
+ BB8: ; preds = %BB7
364
+ ret void
365
+ }
366
+
367
+ define void @pr106083_select_dead_uses (i1 %cmp1 , i1 %not , ptr %p ) {
368
+ ; CHECK-LABEL: @pr106083_select_dead_uses(
369
+ ; CHECK-NEXT: bb:
370
+ ; CHECK-NEXT: br i1 [[CMP1:%.*]], label [[DOTLOOPEXIT6:%.*]], label [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]]
371
+ ; CHECK: spec.select.si.unfold.false:
372
+ ; CHECK-NEXT: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 1, [[BB:%.*]] ]
373
+ ; CHECK-NEXT: br label [[DOTLOOPEXIT6]]
374
+ ; CHECK: .loopexit6:
375
+ ; CHECK-NEXT: [[SPEC_SELECT_SI_UNFOLD_PHI:%.*]] = phi i32 [ [[SPEC_SELECT_SI_UNFOLD_PHI]], [[SELECT_UNFOLD:%.*]] ], [ 0, [[BB]] ], [ [[DOTSI_UNFOLD_PHI1]], [[SPEC_SELECT_SI_UNFOLD_FALSE]] ]
376
+ ; CHECK-NEXT: br i1 [[NOT:%.*]], label [[SELECT_UNFOLD_JT0:%.*]], label [[BB1:%.*]]
377
+ ; CHECK: bb1:
378
+ ; CHECK-NEXT: [[I:%.*]] = load i32, ptr [[P:%.*]], align 4
379
+ ; CHECK-NEXT: [[NOT2:%.*]] = icmp eq i32 0, 0
380
+ ; CHECK-NEXT: br i1 [[NOT2]], label [[SELECT_UNFOLD]], label [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0:%.*]]
381
+ ; CHECK: spec.select7.si.unfold.false:
382
+ ; CHECK-NEXT: br label [[SELECT_UNFOLD]]
383
+ ; CHECK: spec.select7.si.unfold.false.jt0:
384
+ ; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[BB1]] ]
385
+ ; CHECK-NEXT: br label [[SELECT_UNFOLD_JT0]]
386
+ ; CHECK: select.unfold:
387
+ ; CHECK-NEXT: [[_2:%.*]] = phi i32 [ [[SPEC_SELECT_SI_UNFOLD_PHI]], [[BB1]] ], [ poison, [[SPEC_SELECT7_SI_UNFOLD_FALSE:%.*]] ]
388
+ ; CHECK-NEXT: switch i32 [[_2]], label [[BB2:%.*]] [
389
+ ; CHECK-NEXT: i32 0, label [[DOTPREHEADER_PREHEADER:%.*]]
390
+ ; CHECK-NEXT: i32 1, label [[DOTLOOPEXIT6]]
391
+ ; CHECK-NEXT: ]
392
+ ; CHECK: select.unfold.jt0:
393
+ ; CHECK-NEXT: [[_2_JT0:%.*]] = phi i32 [ 0, [[DOTLOOPEXIT6]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0]] ]
394
+ ; CHECK-NEXT: br label [[DOTPREHEADER_PREHEADER]]
395
+ ; CHECK: .preheader.preheader:
396
+ ; CHECK-NEXT: ret void
397
+ ; CHECK: bb2:
398
+ ; CHECK-NEXT: unreachable
399
+ ;
400
+ bb:
401
+ %spec.select = select i1 %cmp1 , i32 0 , i32 1
402
+ br label %.loopexit6
403
+
404
+ .loopexit6: ; preds = %select.unfold, %bb
405
+ br i1 %not , label %select.unfold , label %bb1
406
+
407
+ bb1: ; preds = %.loopexit6
408
+ %i = load i32 , ptr %p , align 4
409
+ %not2 = icmp eq i32 0 , 0
410
+ %spec.select7 = select i1 %not2 , i32 %spec.select , i32 0
411
+ br label %select.unfold
412
+
413
+ select .unfold: ; preds = %bb1, %.loopexit6
414
+ %_2 = phi i32 [ 0 , %.loopexit6 ], [ %spec.select7 , %bb1 ]
415
+ switch i32 %_2 , label %bb2 [
416
+ i32 0 , label %.preheader.preheader
417
+ i32 1 , label %.loopexit6
418
+ ]
419
+
420
+ .preheader.preheader: ; preds = %select.unfold
421
+ ret void
422
+
423
+ bb2: ; preds = %select.unfold
424
+ unreachable
425
+ }
0 commit comments