Skip to content

Commit a05e004

Browse files
authored
[DFAJumpThreading] Unfold select to the incoming block of phi user (#160987)
Fixes #160250 We previously assumed the select to unfold is defined in the incoming block of phi user, as `isValidSelectInst` filters other cases at the initial stage. However, the selects not defined in the incoming block may occur after unfolding the arms of the unfolded select. This patch sinks the select into the incoming block of the phi user and unfolds it at the incoming block.
1 parent 73d9974 commit a05e004

File tree

3 files changed

+132
-25
lines changed

3 files changed

+132
-25
lines changed

llvm/lib/Transforms/Scalar/DFAJumpThreading.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,12 +190,12 @@ void unfold(DomTreeUpdater *DTU, LoopInfo *LI, SelectInstToUnfold SIToUnfold,
190190
std::vector<BasicBlock *> *NewBBs) {
191191
SelectInst *SI = SIToUnfold.getInst();
192192
PHINode *SIUse = SIToUnfold.getUse();
193-
BasicBlock *StartBlock = SI->getParent();
193+
assert(SI->hasOneUse());
194+
// The select may come indirectly, instead of from where it is defined.
195+
BasicBlock *StartBlock = SIUse->getIncomingBlock(*SI->use_begin());
194196
BranchInst *StartBlockTerm =
195197
dyn_cast<BranchInst>(StartBlock->getTerminator());
196-
197198
assert(StartBlockTerm);
198-
assert(SI->hasOneUse());
199199

200200
if (StartBlockTerm->isUnconditional()) {
201201
BasicBlock *EndBlock = StartBlock->getUniqueSuccessor();
@@ -332,7 +332,7 @@ void unfold(DomTreeUpdater *DTU, LoopInfo *LI, SelectInstToUnfold SIToUnfold,
332332
}
333333

334334
// Preserve loop info
335-
if (Loop *L = LI->getLoopFor(SI->getParent())) {
335+
if (Loop *L = LI->getLoopFor(StartBlock)) {
336336
for (BasicBlock *NewBB : *NewBBs)
337337
L->addBasicBlockToLoop(NewBB, *LI);
338338
}
@@ -533,6 +533,8 @@ struct MainSwitch {
533533
return false;
534534

535535
// Only fold the select coming from directly where it is defined.
536+
// TODO: We have dealt with the select coming indirectly now. This
537+
// constraint can be relaxed.
536538
PHINode *PHIUser = dyn_cast<PHINode>(SIUse);
537539
if (PHIUser && PHIUser->getIncomingBlock(*SI->use_begin()) != SIBB)
538540
return false;

llvm/test/Transforms/DFAJumpThreading/dfa-jump-threading-transform.ll

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -304,32 +304,43 @@ end:
304304
define void @pr106083_invalidBBarg_fold(i1 %cmp1, i1 %cmp2, i1 %not, ptr %d) {
305305
; CHECK-LABEL: @pr106083_invalidBBarg_fold(
306306
; 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]]
307+
; CHECK-NEXT: br label [[BB1:%.*]]
311308
; 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]] ]
309+
; CHECK-NEXT: [[I:%.*]] = phi i16 [ 0, [[BB1_BACKEDGE:%.*]] ], [ 0, [[BB:%.*]] ], [ 1, [[BB9:%.*]] ], [ 1, [[BB7_JT0:%.*]] ]
314310
; CHECK-NEXT: br i1 [[NOT:%.*]], label [[BB7_JT0]], label [[BB2:%.*]]
315311
; CHECK: BB2:
316312
; CHECK-NEXT: store i16 0, ptr [[D:%.*]], align 2
317-
; CHECK-NEXT: br i1 [[CMP2:%.*]], label [[BB7]], label [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0:%.*]]
313+
; CHECK-NEXT: br i1 [[CMP2:%.*]], label [[BB7:%.*]], label [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0:%.*]]
318314
; CHECK: spec.select.si.unfold.false:
319-
; CHECK-NEXT: br label [[BB7]]
315+
; CHECK-NEXT: br label [[BB9]]
320316
; CHECK: spec.select.si.unfold.false.jt0:
321317
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[BB2]] ]
322318
; CHECK-NEXT: br label [[BB7_JT0]]
319+
; CHECK: sel.si.unfold.true:
320+
; CHECK-NEXT: br i1 [[CMP1:%.*]], label [[BB9]], label [[SEL_SI_UNFOLD_FALSE_JT1:%.*]]
321+
; CHECK: sel.si.unfold.true.jt0:
322+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 0, [[BB2]] ]
323+
; CHECK-NEXT: br i1 [[CMP1]], label [[BB7_JT0]], label [[SEL_SI_UNFOLD_FALSE:%.*]]
324+
; CHECK: sel.si.unfold.false:
325+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2:%.*]] = phi i32 [ 1, [[BB7]] ]
326+
; CHECK-NEXT: br label [[BB9]]
327+
; CHECK: sel.si.unfold.false.jt1:
328+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2_JT1:%.*]] = phi i32 [ 1, [[SEL_SI_UNFOLD_TRUE:%.*]] ]
329+
; CHECK-NEXT: br label [[BB7_JT1:%.*]]
323330
; 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]] ]
331+
; CHECK-NEXT: [[D_PROMOTED4:%.*]] = phi i16 [ 1, [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]] ], [ 1, [[SEL_SI_UNFOLD_TRUE]] ], [ 1, [[SEL_SI_UNFOLD_FALSE]] ]
332+
; CHECK-NEXT: [[_3:%.*]] = phi i32 [ poison, [[SPEC_SELECT_SI_UNFOLD_FALSE]] ], [ poison, [[SEL_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI2]], [[SEL_SI_UNFOLD_FALSE]] ]
326333
; CHECK-NEXT: switch i32 [[_3]], label [[BB1_BACKEDGE]] [
327334
; CHECK-NEXT: i32 0, label [[BB1]]
328335
; CHECK-NEXT: i32 1, label [[BB8:%.*]]
329336
; CHECK-NEXT: ]
337+
; CHECK: BB7.jt1:
338+
; CHECK-NEXT: [[D_PROMOTED4_JT1:%.*]] = phi i16 [ 1, [[SEL_SI_UNFOLD_FALSE_JT1]] ]
339+
; CHECK-NEXT: [[_3_JT1:%.*]] = phi i32 [ [[DOTSI_UNFOLD_PHI2_JT1]], [[SEL_SI_UNFOLD_FALSE_JT1]] ]
340+
; CHECK-NEXT: br label [[BB8]]
330341
; 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]] ]
342+
; CHECK-NEXT: [[D_PROMOTED4_JT0:%.*]] = phi i16 [ 0, [[BB1]] ], [ 1, [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0]] ], [ 1, [[BB7]] ]
343+
; CHECK-NEXT: [[_3_JT0:%.*]] = phi i32 [ 0, [[BB1]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0]] ], [ [[DOTSI_UNFOLD_PHI1]], [[BB7]] ]
333344
; CHECK-NEXT: br label [[BB1]]
334345
; CHECK: BB1.backedge:
335346
; CHECK-NEXT: br label [[BB1]]
@@ -367,30 +378,40 @@ BB8: ; preds = %BB7
367378
define void @pr106083_select_dead_uses(i1 %cmp1, i1 %not, ptr %p) {
368379
; CHECK-LABEL: @pr106083_select_dead_uses(
369380
; 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]]
381+
; CHECK-NEXT: br label [[DOTLOOPEXIT6:%.*]]
374382
; 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]] ]
376383
; CHECK-NEXT: br i1 [[NOT:%.*]], label [[SELECT_UNFOLD_JT0:%.*]], label [[BB1:%.*]]
377384
; CHECK: bb1:
378385
; CHECK-NEXT: [[I:%.*]] = load i32, ptr [[P:%.*]], align 4
379386
; CHECK-NEXT: [[NOT2:%.*]] = icmp eq i32 0, 0
380-
; CHECK-NEXT: br i1 [[NOT2]], label [[SELECT_UNFOLD]], label [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0:%.*]]
387+
; CHECK-NEXT: br i1 [[NOT2]], label [[SELECT_UNFOLD:%.*]], label [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0:%.*]]
381388
; CHECK: spec.select7.si.unfold.false:
382-
; CHECK-NEXT: br label [[SELECT_UNFOLD]]
389+
; CHECK-NEXT: br label [[SELECT_UNFOLD1:%.*]]
383390
; CHECK: spec.select7.si.unfold.false.jt0:
384391
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[BB1]] ]
385392
; CHECK-NEXT: br label [[SELECT_UNFOLD_JT0]]
393+
; CHECK: spec.select.si.unfold.true:
394+
; CHECK-NEXT: br i1 [[CMP1:%.*]], label [[SELECT_UNFOLD1]], label [[SPEC_SELECT_SI_UNFOLD_FALSE_JT1:%.*]]
395+
; CHECK: spec.select.si.unfold.true.jt0:
396+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 0, [[BB1]] ]
397+
; CHECK-NEXT: br i1 [[CMP1]], label [[SELECT_UNFOLD_JT0]], label [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]]
398+
; CHECK: spec.select.si.unfold.false:
399+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2:%.*]] = phi i32 [ 1, [[SELECT_UNFOLD]] ]
400+
; CHECK-NEXT: br label [[SELECT_UNFOLD1]]
401+
; CHECK: spec.select.si.unfold.false.jt1:
402+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2_JT1:%.*]] = phi i32 [ 1, [[SPEC_SELECT_SI_UNFOLD_TRUE:%.*]] ]
403+
; CHECK-NEXT: br label [[SELECT_UNFOLD_JT1:%.*]]
386404
; CHECK: select.unfold:
387-
; CHECK-NEXT: [[_2:%.*]] = phi i32 [ [[SPEC_SELECT_SI_UNFOLD_PHI]], [[BB1]] ], [ poison, [[SPEC_SELECT7_SI_UNFOLD_FALSE:%.*]] ]
405+
; CHECK-NEXT: [[_2:%.*]] = phi i32 [ poison, [[SPEC_SELECT7_SI_UNFOLD_FALSE:%.*]] ], [ poison, [[SPEC_SELECT_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI2]], [[SPEC_SELECT_SI_UNFOLD_FALSE]] ]
388406
; CHECK-NEXT: switch i32 [[_2]], label [[BB2:%.*]] [
389407
; CHECK-NEXT: i32 0, label [[DOTPREHEADER_PREHEADER:%.*]]
390408
; CHECK-NEXT: i32 1, label [[DOTLOOPEXIT6]]
391409
; CHECK-NEXT: ]
410+
; CHECK: select.unfold.jt1:
411+
; CHECK-NEXT: [[_2_JT1:%.*]] = phi i32 [ [[DOTSI_UNFOLD_PHI2_JT1]], [[SPEC_SELECT_SI_UNFOLD_FALSE_JT1]] ]
412+
; CHECK-NEXT: br label [[DOTLOOPEXIT6]]
392413
; CHECK: select.unfold.jt0:
393-
; CHECK-NEXT: [[_2_JT0:%.*]] = phi i32 [ 0, [[DOTLOOPEXIT6]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0]] ]
414+
; CHECK-NEXT: [[_2_JT0:%.*]] = phi i32 [ 0, [[DOTLOOPEXIT6]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0]] ], [ [[DOTSI_UNFOLD_PHI1]], [[SELECT_UNFOLD]] ]
394415
; CHECK-NEXT: br label [[DOTPREHEADER_PREHEADER]]
395416
; CHECK: .preheader.preheader:
396417
; CHECK-NEXT: ret void

llvm/test/Transforms/DFAJumpThreading/dfa-unfold-select.ll

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,87 @@ unreachable:
463463
sw.bb: ; preds = %if.end
464464
br label %while.cond
465465
}
466+
467+
define i16 @pr160250() {
468+
; CHECK-LABEL: @pr160250(
469+
; CHECK-NEXT: entry:
470+
; CHECK-NEXT: br label [[FOR_COND48:%.*]]
471+
; CHECK: for.cond48:
472+
; CHECK-NEXT: br i1 false, label [[CLEANUP87_JT0:%.*]], label [[IF_ELSE:%.*]]
473+
; CHECK: if.else:
474+
; CHECK-NEXT: br i1 false, label [[DOT6_SI_UNFOLD_TRUE:%.*]], label [[DOT5_SI_UNFOLD_TRUE:%.*]]
475+
; CHECK: .5.si.unfold.true:
476+
; CHECK-NEXT: br i1 false, label [[SPEC_SELECT1_SI_UNFOLD_TRUE1:%.*]], label [[DOT5_SI_UNFOLD_FALSE_JT0:%.*]]
477+
; CHECK: .5.si.unfold.true.jt0:
478+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 0, [[IF_ELSE]] ]
479+
; CHECK-NEXT: br i1 false, label [[SPEC_SELECT1_SI_UNFOLD_TRUE:%.*]], label [[DOT5_SI_UNFOLD_FALSE:%.*]]
480+
; CHECK: .5.si.unfold.false:
481+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2:%.*]] = phi i32 [ 0, [[DOT5_SI_UNFOLD_TRUE]] ]
482+
; CHECK-NEXT: br label [[SPEC_SELECT1_SI_UNFOLD_TRUE1]]
483+
; CHECK: .5.si.unfold.false.jt0:
484+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2_JT0:%.*]] = phi i32 [ 0, [[DOT5_SI_UNFOLD_TRUE1:%.*]] ]
485+
; CHECK-NEXT: br label [[SPEC_SELECT1_SI_UNFOLD_TRUE]]
486+
; CHECK: spec.select1.si.unfold.true:
487+
; CHECK-NEXT: [[DOT5_SI_UNFOLD_PHI:%.*]] = phi i32 [ poison, [[DOT5_SI_UNFOLD_TRUE1]] ], [ [[DOTSI_UNFOLD_PHI2]], [[DOT5_SI_UNFOLD_FALSE]] ]
488+
; CHECK-NEXT: br i1 false, label [[SPEC_SELECT_SI_UNFOLD_FALSE1:%.*]], label [[SPEC_SELECT1_SI_UNFOLD_FALSE_JT1:%.*]]
489+
; CHECK: spec.select1.si.unfold.true.jt0:
490+
; CHECK-NEXT: [[DOT5_SI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ [[DOTSI_UNFOLD_PHI1]], [[DOT5_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI2_JT0]], [[DOT5_SI_UNFOLD_FALSE_JT0]] ]
491+
; CHECK-NEXT: br i1 false, label [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]], label [[SPEC_SELECT1_SI_UNFOLD_FALSE_JT0:%.*]]
492+
; CHECK: spec.select1.si.unfold.false:
493+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI:%.*]] = phi i32 [ 0, [[SPEC_SELECT1_SI_UNFOLD_TRUE]] ]
494+
; CHECK-NEXT: br label [[SPEC_SELECT_SI_UNFOLD_FALSE1]]
495+
; CHECK: spec.select1.si.unfold.false.jt0:
496+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[SPEC_SELECT1_SI_UNFOLD_TRUE1]] ]
497+
; CHECK-NEXT: br label [[SPEC_SELECT_SI_UNFOLD_FALSE]]
498+
; CHECK: spec.select.si.unfold.false:
499+
; CHECK-NEXT: [[SPEC_SELECT1_SI_UNFOLD_PHI:%.*]] = phi i32 [ [[DOT5_SI_UNFOLD_PHI]], [[SPEC_SELECT1_SI_UNFOLD_TRUE1]] ], [ [[DOTSI_UNFOLD_PHI]], [[SPEC_SELECT1_SI_UNFOLD_FALSE_JT0]] ]
500+
; CHECK-NEXT: br label [[CLEANUP87:%.*]]
501+
; CHECK: spec.select.si.unfold.false.jt0:
502+
; CHECK-NEXT: [[SPEC_SELECT1_SI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ [[DOT5_SI_UNFOLD_PHI_JT0]], [[SPEC_SELECT1_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT1_SI_UNFOLD_FALSE_JT1]] ]
503+
; CHECK-NEXT: br label [[CLEANUP87_JT0]]
504+
; CHECK: .6.si.unfold.true:
505+
; CHECK-NEXT: br i1 false, label [[CLEANUP87]], label [[DOT6_SI_UNFOLD_FALSE_JT0:%.*]]
506+
; CHECK: .6.si.unfold.true.jt0:
507+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI3:%.*]] = phi i32 [ 0, [[IF_ELSE]] ]
508+
; CHECK-NEXT: br i1 false, label [[CLEANUP87_JT0]], label [[DOT6_SI_UNFOLD_FALSE:%.*]]
509+
; CHECK: .6.si.unfold.false:
510+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI4:%.*]] = phi i32 [ 0, [[DOT6_SI_UNFOLD_TRUE]] ]
511+
; CHECK-NEXT: br label [[CLEANUP87]]
512+
; CHECK: .6.si.unfold.false.jt0:
513+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI4_JT0:%.*]] = phi i32 [ 0, [[DOT6_SI_UNFOLD_TRUE1:%.*]] ]
514+
; CHECK-NEXT: br label [[CLEANUP87_JT0]]
515+
; CHECK: cleanup87:
516+
; CHECK-NEXT: [[CLEANUP_DEST_SLOT_3:%.*]] = phi i32 [ [[SPEC_SELECT1_SI_UNFOLD_PHI]], [[SPEC_SELECT_SI_UNFOLD_FALSE1]] ], [ poison, [[DOT6_SI_UNFOLD_TRUE1]] ], [ [[DOTSI_UNFOLD_PHI4]], [[DOT6_SI_UNFOLD_FALSE]] ]
517+
; CHECK-NEXT: switch i32 [[CLEANUP_DEST_SLOT_3]], label [[FOR_COND48_BACKEDGE:%.*]] [
518+
; CHECK-NEXT: i32 0, label [[FOR_COND48_BACKEDGE]]
519+
; CHECK-NEXT: i32 1, label [[FOR_COND48_BACKEDGE]]
520+
; CHECK-NEXT: ]
521+
; CHECK: cleanup87.jt0:
522+
; CHECK-NEXT: [[CLEANUP_DEST_SLOT_3_JT0:%.*]] = phi i32 [ 0, [[FOR_COND48]] ], [ [[SPEC_SELECT1_SI_UNFOLD_PHI_JT0]], [[SPEC_SELECT_SI_UNFOLD_FALSE]] ], [ [[DOTSI_UNFOLD_PHI3]], [[DOT6_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI4_JT0]], [[DOT6_SI_UNFOLD_FALSE_JT0]] ]
523+
; CHECK-NEXT: br label [[FOR_COND48_BACKEDGE]]
524+
; CHECK: for.cond48.backedge:
525+
; CHECK-NEXT: br label [[FOR_COND48]]
526+
;
527+
entry:
528+
%.5 = select i1 false, i32 0, i32 0
529+
%.6 = select i1 false, i32 0, i32 0
530+
br label %for.cond48
531+
532+
for.cond48: ; preds = %for.cond48.backedge, %entry
533+
br i1 false, label %cleanup87, label %if.else
534+
535+
if.else: ; preds = %for.cond48
536+
%spec.select1 = select i1 false, i32 %.5, i32 0
537+
%spec.select = select i1 false, i32 %.6, i32 %spec.select1
538+
br label %cleanup87
539+
540+
cleanup87: ; preds = %if.else, %for.cond48
541+
%cleanup.dest.slot.3 = phi i32 [ 0, %for.cond48 ], [ %spec.select, %if.else ]
542+
switch i32 %cleanup.dest.slot.3, label %for.cond48.backedge [
543+
i32 0, label %for.cond48.backedge
544+
i32 1, label %for.cond48.backedge
545+
]
546+
547+
for.cond48.backedge: ; preds = %cleanup87, %cleanup87, %cleanup87
548+
br label %for.cond48
549+
}

0 commit comments

Comments
 (0)