Skip to content

Commit b7f50e1

Browse files
authored
[InstCombine] Improve foldICmpWithDominatingICmp with DomConditionCache (#75370)
This patch uses affected values from DomConditionCache(introduced by #73662), instead of a cheap/incomplete check `getSinglePredecessor`.
1 parent 935f5ee commit b7f50e1

File tree

3 files changed

+47
-62
lines changed

3 files changed

+47
-62
lines changed

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,46 +1323,32 @@ Instruction *InstCombinerImpl::foldICmpWithConstant(ICmpInst &Cmp) {
13231323

13241324
/// Canonicalize icmp instructions based on dominating conditions.
13251325
Instruction *InstCombinerImpl::foldICmpWithDominatingICmp(ICmpInst &Cmp) {
1326-
// This is a cheap/incomplete check for dominance - just match a single
1327-
// predecessor with a conditional branch.
1328-
BasicBlock *CmpBB = Cmp.getParent();
1329-
BasicBlock *DomBB = CmpBB->getSinglePredecessor();
1330-
if (!DomBB)
1331-
return nullptr;
1332-
1333-
Value *DomCond;
1334-
BasicBlock *TrueBB, *FalseBB;
1335-
if (!match(DomBB->getTerminator(), m_Br(m_Value(DomCond), TrueBB, FalseBB)))
1336-
return nullptr;
1337-
1338-
assert((TrueBB == CmpBB || FalseBB == CmpBB) &&
1339-
"Predecessor block does not point to successor?");
1340-
1341-
// The branch should get simplified. Don't bother simplifying this condition.
1342-
if (TrueBB == FalseBB)
1343-
return nullptr;
1344-
13451326
// We already checked simple implication in InstSimplify, only handle complex
13461327
// cases here.
1347-
1348-
CmpInst::Predicate Pred = Cmp.getPredicate();
13491328
Value *X = Cmp.getOperand(0), *Y = Cmp.getOperand(1);
13501329
ICmpInst::Predicate DomPred;
1351-
const APInt *C, *DomC;
1352-
if (match(DomCond, m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))) &&
1353-
match(Y, m_APInt(C))) {
1330+
const APInt *C;
1331+
if (!match(Y, m_APInt(C)))
1332+
return nullptr;
1333+
1334+
CmpInst::Predicate Pred = Cmp.getPredicate();
1335+
ConstantRange CR = ConstantRange::makeExactICmpRegion(Pred, *C);
1336+
1337+
auto handleDomCond = [&](Value *DomCond, bool CondIsTrue) -> Instruction * {
1338+
const APInt *DomC;
1339+
if (!match(DomCond, m_ICmp(DomPred, m_Specific(X), m_APInt(DomC))))
1340+
return nullptr;
13541341
// We have 2 compares of a variable with constants. Calculate the constant
13551342
// ranges of those compares to see if we can transform the 2nd compare:
13561343
// DomBB:
13571344
// DomCond = icmp DomPred X, DomC
13581345
// br DomCond, CmpBB, FalseBB
13591346
// CmpBB:
13601347
// Cmp = icmp Pred X, C
1361-
ConstantRange CR = ConstantRange::makeExactICmpRegion(Pred, *C);
1348+
if (!CondIsTrue)
1349+
DomPred = CmpInst::getInversePredicate(DomPred);
13621350
ConstantRange DominatingCR =
1363-
(CmpBB == TrueBB) ? ConstantRange::makeExactICmpRegion(DomPred, *DomC)
1364-
: ConstantRange::makeExactICmpRegion(
1365-
CmpInst::getInversePredicate(DomPred), *DomC);
1351+
ConstantRange::makeExactICmpRegion(DomPred, *DomC);
13661352
ConstantRange Intersection = DominatingCR.intersectWith(CR);
13671353
ConstantRange Difference = DominatingCR.difference(CR);
13681354
if (Intersection.isEmptySet())
@@ -1390,6 +1376,21 @@ Instruction *InstCombinerImpl::foldICmpWithDominatingICmp(ICmpInst &Cmp) {
13901376
return new ICmpInst(ICmpInst::ICMP_EQ, X, Builder.getInt(*EqC));
13911377
if (const APInt *NeC = Difference.getSingleElement())
13921378
return new ICmpInst(ICmpInst::ICMP_NE, X, Builder.getInt(*NeC));
1379+
return nullptr;
1380+
};
1381+
1382+
for (BranchInst *BI : DC.conditionsFor(X)) {
1383+
auto *Cond = BI->getCondition();
1384+
BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
1385+
if (DT.dominates(Edge0, Cmp.getParent())) {
1386+
if (auto *V = handleDomCond(Cond, true))
1387+
return V;
1388+
} else {
1389+
BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
1390+
if (DT.dominates(Edge1, Cmp.getParent()))
1391+
if (auto *V = handleDomCond(Cond, false))
1392+
return V;
1393+
}
13931394
}
13941395

13951396
return nullptr;

llvm/test/Transforms/LoopUnroll/ARM/upperbound.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ define void @test(ptr %x, i32 %n) {
1818
; CHECK-NEXT: br label [[IF_END]]
1919
; CHECK: if.end:
2020
; CHECK-NEXT: [[INCDEC_PTR:%.*]] = getelementptr inbounds i32, ptr [[X]], i32 1
21-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[REM]], 1
22-
; CHECK-NEXT: br i1 [[CMP]], label [[WHILE_BODY_1:%.*]], label [[WHILE_END]]
21+
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[REM]], 1
22+
; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END]], label [[WHILE_BODY_1:%.*]]
2323
; CHECK: while.body.1:
2424
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[INCDEC_PTR]], align 4
2525
; CHECK-NEXT: [[CMP1_1:%.*]] = icmp slt i32 [[TMP1]], 10

llvm/test/Transforms/LoopUnroll/runtime-multiexit-heuristic.ll

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,62 +38,55 @@ define i32 @test1(ptr nocapture %a, i64 %n) {
3838
; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = or disjoint i64 [[INDVARS_IV]], 1
3939
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_1:%.*]]
4040
; CHECK: for.exiting_block.1:
41-
; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[TMP0]], 42
42-
; CHECK-NEXT: br i1 [[CMP_1]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]
41+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]
4342
; CHECK: latch.1:
4443
; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT]]
4544
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4
4645
; CHECK-NEXT: [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]
4746
; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = or disjoint i64 [[INDVARS_IV]], 2
4847
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_2:%.*]]
4948
; CHECK: for.exiting_block.2:
50-
; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i64 [[TMP0]], 42
51-
; CHECK-NEXT: br i1 [[CMP_2]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]
49+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]
5250
; CHECK: latch.2:
5351
; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_1]]
5452
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4
5553
; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]
5654
; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = or disjoint i64 [[INDVARS_IV]], 3
5755
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_3:%.*]]
5856
; CHECK: for.exiting_block.3:
59-
; CHECK-NEXT: [[CMP_3:%.*]] = icmp eq i64 [[TMP0]], 42
60-
; CHECK-NEXT: br i1 [[CMP_3]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]
57+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]
6158
; CHECK: latch.3:
6259
; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_2]]
6360
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4
6461
; CHECK-NEXT: [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]
6562
; CHECK-NEXT: [[INDVARS_IV_NEXT_3:%.*]] = or disjoint i64 [[INDVARS_IV]], 4
6663
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_4:%.*]]
6764
; CHECK: for.exiting_block.4:
68-
; CHECK-NEXT: [[CMP_4:%.*]] = icmp eq i64 [[TMP0]], 42
69-
; CHECK-NEXT: br i1 [[CMP_4]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]
65+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]
7066
; CHECK: latch.4:
7167
; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_3]]
7268
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4
7369
; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]
7470
; CHECK-NEXT: [[INDVARS_IV_NEXT_4:%.*]] = or disjoint i64 [[INDVARS_IV]], 5
7571
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_5:%.*]]
7672
; CHECK: for.exiting_block.5:
77-
; CHECK-NEXT: [[CMP_5:%.*]] = icmp eq i64 [[TMP0]], 42
78-
; CHECK-NEXT: br i1 [[CMP_5]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]
73+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]
7974
; CHECK: latch.5:
8075
; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_4]]
8176
; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4
8277
; CHECK-NEXT: [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]
8378
; CHECK-NEXT: [[INDVARS_IV_NEXT_5:%.*]] = or disjoint i64 [[INDVARS_IV]], 6
8479
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_6:%.*]]
8580
; CHECK: for.exiting_block.6:
86-
; CHECK-NEXT: [[CMP_6:%.*]] = icmp eq i64 [[TMP0]], 42
87-
; CHECK-NEXT: br i1 [[CMP_6]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]
81+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]
8882
; CHECK: latch.6:
8983
; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_5]]
9084
; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4
9185
; CHECK-NEXT: [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]
9286
; CHECK-NEXT: [[INDVARS_IV_NEXT_6:%.*]] = or disjoint i64 [[INDVARS_IV]], 7
9387
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_7:%.*]]
9488
; CHECK: for.exiting_block.7:
95-
; CHECK-NEXT: [[CMP_7:%.*]] = icmp eq i64 [[TMP0]], 42
96-
; CHECK-NEXT: br i1 [[CMP_7]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]
89+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]
9790
; CHECK: latch.7:
9891
; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_6]]
9992
; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4
@@ -134,12 +127,11 @@ define i32 @test1(ptr nocapture %a, i64 %n) {
134127
; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ [[SUM_0_LCSSA_PH]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[ADD_EPIL]], [[LATCHEXIT_EPILOG_LCSSA]] ]
135128
; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]]
136129
; CHECK: otherexit.loopexit:
137-
; CHECK-NEXT: [[SUM_02_LCSSA_PH:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ], [ [[ADD]], [[FOR_EXITING_BLOCK_1]] ], [ [[ADD_1]], [[FOR_EXITING_BLOCK_2]] ], [ [[ADD_2]], [[FOR_EXITING_BLOCK_3]] ], [ [[ADD_3]], [[FOR_EXITING_BLOCK_4]] ], [ [[ADD_4]], [[FOR_EXITING_BLOCK_5]] ], [ [[ADD_5]], [[FOR_EXITING_BLOCK_6]] ], [ [[ADD_6]], [[FOR_EXITING_BLOCK_7]] ]
138130
; CHECK-NEXT: br label [[OTHEREXIT:%.*]]
139131
; CHECK: otherexit.loopexit3:
140132
; CHECK-NEXT: br label [[OTHEREXIT]]
141133
; CHECK: otherexit:
142-
; CHECK-NEXT: [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02_LCSSA_PH]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_EPIL]], [[OTHEREXIT_LOOPEXIT3]] ]
134+
; CHECK-NEXT: [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_EPIL]], [[OTHEREXIT_LOOPEXIT3]] ]
143135
; CHECK-NEXT: [[RVAL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]
144136
; CHECK-NEXT: ret i32 [[RVAL]]
145137
;
@@ -774,62 +766,55 @@ define i32 @test5(ptr nocapture %a, i64 %n) {
774766
; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = or disjoint i64 [[INDVARS_IV]], 1
775767
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_1:%.*]]
776768
; CHECK: for.exiting_block.1:
777-
; CHECK-NEXT: [[CMP_1:%.*]] = icmp eq i64 [[TMP0]], 42
778-
; CHECK-NEXT: br i1 [[CMP_1]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]
769+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_1:%.*]]
779770
; CHECK: latch.1:
780771
; CHECK-NEXT: [[ARRAYIDX_1:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT]]
781772
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX_1]], align 4
782773
; CHECK-NEXT: [[ADD_1:%.*]] = add nsw i32 [[TMP4]], [[ADD]]
783774
; CHECK-NEXT: [[INDVARS_IV_NEXT_1:%.*]] = or disjoint i64 [[INDVARS_IV]], 2
784775
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_2:%.*]]
785776
; CHECK: for.exiting_block.2:
786-
; CHECK-NEXT: [[CMP_2:%.*]] = icmp eq i64 [[TMP0]], 42
787-
; CHECK-NEXT: br i1 [[CMP_2]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]
777+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_2:%.*]]
788778
; CHECK: latch.2:
789779
; CHECK-NEXT: [[ARRAYIDX_2:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_1]]
790780
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX_2]], align 4
791781
; CHECK-NEXT: [[ADD_2:%.*]] = add nsw i32 [[TMP5]], [[ADD_1]]
792782
; CHECK-NEXT: [[INDVARS_IV_NEXT_2:%.*]] = or disjoint i64 [[INDVARS_IV]], 3
793783
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_3:%.*]]
794784
; CHECK: for.exiting_block.3:
795-
; CHECK-NEXT: [[CMP_3:%.*]] = icmp eq i64 [[TMP0]], 42
796-
; CHECK-NEXT: br i1 [[CMP_3]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]
785+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_3:%.*]]
797786
; CHECK: latch.3:
798787
; CHECK-NEXT: [[ARRAYIDX_3:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_2]]
799788
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARRAYIDX_3]], align 4
800789
; CHECK-NEXT: [[ADD_3:%.*]] = add nsw i32 [[TMP6]], [[ADD_2]]
801790
; CHECK-NEXT: [[INDVARS_IV_NEXT_3:%.*]] = or disjoint i64 [[INDVARS_IV]], 4
802791
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_4:%.*]]
803792
; CHECK: for.exiting_block.4:
804-
; CHECK-NEXT: [[CMP_4:%.*]] = icmp eq i64 [[TMP0]], 42
805-
; CHECK-NEXT: br i1 [[CMP_4]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]
793+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_4:%.*]]
806794
; CHECK: latch.4:
807795
; CHECK-NEXT: [[ARRAYIDX_4:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_3]]
808796
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ARRAYIDX_4]], align 4
809797
; CHECK-NEXT: [[ADD_4:%.*]] = add nsw i32 [[TMP7]], [[ADD_3]]
810798
; CHECK-NEXT: [[INDVARS_IV_NEXT_4:%.*]] = or disjoint i64 [[INDVARS_IV]], 5
811799
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_5:%.*]]
812800
; CHECK: for.exiting_block.5:
813-
; CHECK-NEXT: [[CMP_5:%.*]] = icmp eq i64 [[TMP0]], 42
814-
; CHECK-NEXT: br i1 [[CMP_5]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]
801+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_5:%.*]]
815802
; CHECK: latch.5:
816803
; CHECK-NEXT: [[ARRAYIDX_5:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_4]]
817804
; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[ARRAYIDX_5]], align 4
818805
; CHECK-NEXT: [[ADD_5:%.*]] = add nsw i32 [[TMP8]], [[ADD_4]]
819806
; CHECK-NEXT: [[INDVARS_IV_NEXT_5:%.*]] = or disjoint i64 [[INDVARS_IV]], 6
820807
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_6:%.*]]
821808
; CHECK: for.exiting_block.6:
822-
; CHECK-NEXT: [[CMP_6:%.*]] = icmp eq i64 [[TMP0]], 42
823-
; CHECK-NEXT: br i1 [[CMP_6]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]
809+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_6:%.*]]
824810
; CHECK: latch.6:
825811
; CHECK-NEXT: [[ARRAYIDX_6:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_5]]
826812
; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_6]], align 4
827813
; CHECK-NEXT: [[ADD_6:%.*]] = add nsw i32 [[TMP9]], [[ADD_5]]
828814
; CHECK-NEXT: [[INDVARS_IV_NEXT_6:%.*]] = or disjoint i64 [[INDVARS_IV]], 7
829815
; CHECK-NEXT: br label [[FOR_EXITING_BLOCK_7:%.*]]
830816
; CHECK: for.exiting_block.7:
831-
; CHECK-NEXT: [[CMP_7:%.*]] = icmp eq i64 [[TMP0]], 42
832-
; CHECK-NEXT: br i1 [[CMP_7]], label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]
817+
; CHECK-NEXT: br i1 false, label [[OTHEREXIT_LOOPEXIT]], label [[LATCH_7]]
833818
; CHECK: latch.7:
834819
; CHECK-NEXT: [[ARRAYIDX_7:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INDVARS_IV_NEXT_6]]
835820
; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX_7]], align 4
@@ -870,12 +855,11 @@ define i32 @test5(ptr nocapture %a, i64 %n) {
870855
; CHECK-NEXT: [[SUM_0_LCSSA:%.*]] = phi i32 [ [[SUM_0_LCSSA_PH]], [[LATCHEXIT_UNR_LCSSA]] ], [ [[ADD_EPIL]], [[LATCHEXIT_EPILOG_LCSSA]] ]
871856
; CHECK-NEXT: ret i32 [[SUM_0_LCSSA]]
872857
; CHECK: otherexit.loopexit:
873-
; CHECK-NEXT: [[RVAL_PH:%.*]] = phi i32 [ [[SUM_02]], [[FOR_EXITING_BLOCK]] ], [ [[ADD]], [[FOR_EXITING_BLOCK_1]] ], [ [[ADD_1]], [[FOR_EXITING_BLOCK_2]] ], [ [[ADD_2]], [[FOR_EXITING_BLOCK_3]] ], [ [[ADD_3]], [[FOR_EXITING_BLOCK_4]] ], [ [[ADD_4]], [[FOR_EXITING_BLOCK_5]] ], [ [[ADD_5]], [[FOR_EXITING_BLOCK_6]] ], [ [[ADD_6]], [[FOR_EXITING_BLOCK_7]] ]
874858
; CHECK-NEXT: br label [[OTHEREXIT:%.*]]
875859
; CHECK: otherexit.loopexit3:
876860
; CHECK-NEXT: br label [[OTHEREXIT]]
877861
; CHECK: otherexit:
878-
; CHECK-NEXT: [[SUM_02_LCSSA:%.*]] = phi i32 [ [[RVAL_PH]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_EPIL]], [[OTHEREXIT_LOOPEXIT3]] ]
862+
; CHECK-NEXT: [[SUM_02_LCSSA:%.*]] = phi i32 [ [[SUM_02]], [[OTHEREXIT_LOOPEXIT]] ], [ [[SUM_02_EPIL]], [[OTHEREXIT_LOOPEXIT3]] ]
879863
; CHECK-NEXT: br label [[OTHEREXIT2:%.*]]
880864
; CHECK: otherexit2:
881865
; CHECK-NEXT: [[RVAL2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[SUM_02_LCSSA]]) ]

0 commit comments

Comments
 (0)