Skip to content

Commit 82ec2a7

Browse files
committed
[DFAJumpThreading] Unfold select to the incoming block of phi user
1 parent fae54a0 commit 82ec2a7

File tree

3 files changed

+98
-22
lines changed

3 files changed

+98
-22
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->user_begin().getUse());
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: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -304,25 +304,27 @@ 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: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 0, [[BB2]] ]
321+
; CHECK-NEXT: br i1 [[CMP1:%.*]], label [[BB9]], label [[SEL_SI_UNFOLD_FALSE:%.*]]
322+
; CHECK: sel.si.unfold.false:
323+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2:%.*]] = phi i32 [ 1, [[BB7]] ]
324+
; CHECK-NEXT: br label [[BB9]]
323325
; 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: [[D_PROMOTED4:%.*]] = phi i16 [ 1, [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]] ], [ 1, [[BB7]] ], [ 1, [[SEL_SI_UNFOLD_FALSE]] ]
327+
; CHECK-NEXT: [[_3:%.*]] = phi i32 [ poison, [[SPEC_SELECT_SI_UNFOLD_FALSE]] ], [ [[DOTSI_UNFOLD_PHI1]], [[BB7]] ], [ [[DOTSI_UNFOLD_PHI2]], [[SEL_SI_UNFOLD_FALSE]] ]
326328
; CHECK-NEXT: switch i32 [[_3]], label [[BB1_BACKEDGE]] [
327329
; CHECK-NEXT: i32 0, label [[BB1]]
328330
; CHECK-NEXT: i32 1, label [[BB8:%.*]]
@@ -367,24 +369,26 @@ BB8: ; preds = %BB7
367369
define void @pr106083_select_dead_uses(i1 %cmp1, i1 %not, ptr %p) {
368370
; CHECK-LABEL: @pr106083_select_dead_uses(
369371
; 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]]
372+
; CHECK-NEXT: br label [[DOTLOOPEXIT6:%.*]]
374373
; 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]] ]
376374
; CHECK-NEXT: br i1 [[NOT:%.*]], label [[SELECT_UNFOLD_JT0:%.*]], label [[BB1:%.*]]
377375
; CHECK: bb1:
378376
; CHECK-NEXT: [[I:%.*]] = load i32, ptr [[P:%.*]], align 4
379377
; CHECK-NEXT: [[NOT2:%.*]] = icmp eq i32 0, 0
380-
; CHECK-NEXT: br i1 [[NOT2]], label [[SELECT_UNFOLD]], label [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0:%.*]]
378+
; CHECK-NEXT: br i1 [[NOT2]], label [[SELECT_UNFOLD:%.*]], label [[SPEC_SELECT7_SI_UNFOLD_FALSE_JT0:%.*]]
381379
; CHECK: spec.select7.si.unfold.false:
382-
; CHECK-NEXT: br label [[SELECT_UNFOLD]]
380+
; CHECK-NEXT: br label [[SELECT_UNFOLD1:%.*]]
383381
; CHECK: spec.select7.si.unfold.false.jt0:
384382
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[BB1]] ]
385383
; CHECK-NEXT: br label [[SELECT_UNFOLD_JT0]]
384+
; CHECK: spec.select.si.unfold.true:
385+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 0, [[BB1]] ]
386+
; CHECK-NEXT: br i1 [[CMP1:%.*]], label [[SELECT_UNFOLD1]], label [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]]
387+
; CHECK: spec.select.si.unfold.false:
388+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2:%.*]] = phi i32 [ 1, [[SELECT_UNFOLD]] ]
389+
; CHECK-NEXT: br label [[SELECT_UNFOLD1]]
386390
; CHECK: select.unfold:
387-
; CHECK-NEXT: [[_2:%.*]] = phi i32 [ [[SPEC_SELECT_SI_UNFOLD_PHI]], [[BB1]] ], [ poison, [[SPEC_SELECT7_SI_UNFOLD_FALSE:%.*]] ]
391+
; CHECK-NEXT: [[_2:%.*]] = phi i32 [ poison, [[SPEC_SELECT7_SI_UNFOLD_FALSE:%.*]] ], [ [[DOTSI_UNFOLD_PHI1]], [[SELECT_UNFOLD]] ], [ [[DOTSI_UNFOLD_PHI2]], [[SPEC_SELECT_SI_UNFOLD_FALSE]] ]
388392
; CHECK-NEXT: switch i32 [[_2]], label [[BB2:%.*]] [
389393
; CHECK-NEXT: i32 0, label [[DOTPREHEADER_PREHEADER:%.*]]
390394
; CHECK-NEXT: i32 1, label [[DOTLOOPEXIT6]]

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,73 @@ 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: [[DOTSI_UNFOLD_PHI1:%.*]] = phi i32 [ 0, [[IF_ELSE]] ]
477+
; CHECK-NEXT: br i1 false, label [[SPEC_SELECT1_SI_UNFOLD_TRUE:%.*]], label [[DOT5_SI_UNFOLD_FALSE:%.*]]
478+
; CHECK: .5.si.unfold.false:
479+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI2:%.*]] = phi i32 [ 0, [[DOT5_SI_UNFOLD_TRUE]] ]
480+
; CHECK-NEXT: br label [[SPEC_SELECT1_SI_UNFOLD_TRUE]]
481+
; CHECK: spec.select1.si.unfold.true:
482+
; CHECK-NEXT: [[DOT5_SI_UNFOLD_PHI:%.*]] = phi i32 [ [[DOTSI_UNFOLD_PHI1]], [[DOT5_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI2]], [[DOT5_SI_UNFOLD_FALSE]] ]
483+
; CHECK-NEXT: br i1 false, label [[SPEC_SELECT_SI_UNFOLD_FALSE:%.*]], label [[SPEC_SELECT1_SI_UNFOLD_FALSE_JT0:%.*]]
484+
; CHECK: spec.select1.si.unfold.false:
485+
; CHECK-NEXT: br label [[SPEC_SELECT_SI_UNFOLD_FALSE]]
486+
; CHECK: spec.select1.si.unfold.false.jt0:
487+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ 0, [[SPEC_SELECT1_SI_UNFOLD_TRUE]] ]
488+
; CHECK-NEXT: br label [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0:%.*]]
489+
; CHECK: spec.select.si.unfold.false:
490+
; CHECK-NEXT: [[SPEC_SELECT1_SI_UNFOLD_PHI:%.*]] = phi i32 [ [[DOT5_SI_UNFOLD_PHI]], [[SPEC_SELECT1_SI_UNFOLD_TRUE]] ], [ poison, [[SPEC_SELECT1_SI_UNFOLD_FALSE:%.*]] ]
491+
; CHECK-NEXT: br label [[CLEANUP87:%.*]]
492+
; CHECK: spec.select.si.unfold.false.jt0:
493+
; CHECK-NEXT: [[SPEC_SELECT1_SI_UNFOLD_PHI_JT0:%.*]] = phi i32 [ [[DOTSI_UNFOLD_PHI_JT0]], [[SPEC_SELECT1_SI_UNFOLD_FALSE_JT0]] ]
494+
; CHECK-NEXT: br label [[CLEANUP87_JT0]]
495+
; CHECK: .6.si.unfold.true:
496+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI3:%.*]] = phi i32 [ 0, [[IF_ELSE]] ]
497+
; CHECK-NEXT: br i1 false, label [[CLEANUP87]], label [[DOT6_SI_UNFOLD_FALSE:%.*]]
498+
; CHECK: .6.si.unfold.false:
499+
; CHECK-NEXT: [[DOTSI_UNFOLD_PHI4:%.*]] = phi i32 [ 0, [[DOT6_SI_UNFOLD_TRUE]] ]
500+
; CHECK-NEXT: br label [[CLEANUP87]]
501+
; CHECK: cleanup87:
502+
; CHECK-NEXT: [[CLEANUP_DEST_SLOT_3:%.*]] = phi i32 [ [[SPEC_SELECT1_SI_UNFOLD_PHI]], [[SPEC_SELECT_SI_UNFOLD_FALSE]] ], [ [[DOTSI_UNFOLD_PHI3]], [[DOT6_SI_UNFOLD_TRUE]] ], [ [[DOTSI_UNFOLD_PHI4]], [[DOT6_SI_UNFOLD_FALSE]] ]
503+
; CHECK-NEXT: switch i32 [[CLEANUP_DEST_SLOT_3]], label [[FOR_COND48_BACKEDGE:%.*]] [
504+
; CHECK-NEXT: i32 0, label [[FOR_COND48_BACKEDGE]]
505+
; CHECK-NEXT: i32 1, label [[FOR_COND48_BACKEDGE]]
506+
; CHECK-NEXT: ]
507+
; CHECK: cleanup87.jt0:
508+
; CHECK-NEXT: [[CLEANUP_DEST_SLOT_3_JT0:%.*]] = phi i32 [ 0, [[FOR_COND48]] ], [ [[SPEC_SELECT1_SI_UNFOLD_PHI_JT0]], [[SPEC_SELECT_SI_UNFOLD_FALSE_JT0]] ]
509+
; CHECK-NEXT: br label [[FOR_COND48_BACKEDGE]]
510+
; CHECK: for.cond48.backedge:
511+
; CHECK-NEXT: br label [[FOR_COND48]]
512+
;
513+
entry:
514+
%.5 = select i1 false, i32 0, i32 0
515+
%.6 = select i1 false, i32 0, i32 0
516+
br label %for.cond48
517+
518+
for.cond48: ; preds = %for.cond48.backedge, %entry
519+
br i1 false, label %cleanup87, label %if.else
520+
521+
if.else: ; preds = %for.cond48
522+
%spec.select1 = select i1 false, i32 %.5, i32 0
523+
%spec.select = select i1 false, i32 %.6, i32 %spec.select1
524+
br label %cleanup87
525+
526+
cleanup87: ; preds = %if.else, %for.cond48
527+
%cleanup.dest.slot.3 = phi i32 [ 0, %for.cond48 ], [ %spec.select, %if.else ]
528+
switch i32 %cleanup.dest.slot.3, label %for.cond48.backedge [
529+
i32 0, label %for.cond48.backedge
530+
i32 1, label %for.cond48.backedge
531+
]
532+
533+
for.cond48.backedge: ; preds = %cleanup87, %cleanup87, %cleanup87
534+
br label %for.cond48
535+
}

0 commit comments

Comments
 (0)