[llvm] 6d247f9 - [SCEV][IndVarSimplify] insert point should not be block front.
Chen Zheng via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 17 19:28:02 PDT 2020
Author: Chen Zheng
Date: 2020-07-17T22:25:10-04:00
New Revision: 6d247f980d922055018137c0d1400fde83d9449f
URL: https://github.com/llvm/llvm-project/commit/6d247f980d922055018137c0d1400fde83d9449f
DIFF: https://github.com/llvm/llvm-project/commit/6d247f980d922055018137c0d1400fde83d9449f.diff
LOG: [SCEV][IndVarSimplify] insert point should not be block front.
Recommit after removing the unused cast instructions.
Differential Revision: https://reviews.llvm.org/D80975
Added:
llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
Modified:
llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
index 0f36c3f772e6..51d12faf712a 100644
--- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -1435,8 +1435,19 @@ PHINode *WidenIV::createWideIV(SCEVExpander &Rewriter) {
// either find an existing phi or materialize a new one. Either way, we
// expect a well-formed cyclic phi-with-increments. i.e. any operand not part
// of the phi-SCC dominates the loop entry.
- Instruction *InsertPt = &L->getHeader()->front();
- WidePhi = cast<PHINode>(Rewriter.expandCodeFor(AddRec, WideType, InsertPt));
+ Instruction *InsertPt = &*L->getHeader()->getFirstInsertionPt();
+ Value *ExpandInst = Rewriter.expandCodeFor(AddRec, WideType, InsertPt);
+ // If the wide phi is not a phi node, for example a cast node, like bitcast,
+ // inttoptr, ptrtoint, just skip for now.
+ if (!(WidePhi = dyn_cast<PHINode>(ExpandInst))) {
+ // if the cast node is an inserted instruction without any user, we should
+ // remove it to make sure the pass don't touch the function as we can not
+ // wide the phi.
+ if (ExpandInst->hasNUses(0) &&
+ Rewriter.isInsertedInstruction(cast<Instruction>(ExpandInst)))
+ DeadInsts.emplace_back(ExpandInst);
+ return nullptr;
+ }
// Remembering the WideIV increment generated by SCEVExpander allows
// widenIVUse to reuse it when widening the narrow IV's increment. We don't
diff --git a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
index 71b48482f26a..c54ae26b5323 100644
--- a/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
+++ b/llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp
@@ -1292,7 +1292,8 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
if (useSubtract)
Step = SE.getNegativeSCEV(Step);
// Expand the step somewhere that dominates the loop header.
- Value *StepV = expandCodeFor(Step, IntTy, &L->getHeader()->front());
+ Value *StepV = expandCodeFor(Step, IntTy,
+ &*L->getHeader()->getFirstInsertionPt());
// The no-wrap behavior proved by IsIncrement(NUW|NSW) is only applicable if
// we actually do emit an addition. It does not apply if we emit a
@@ -1438,7 +1439,8 @@ Value *SCEVExpander::expandAddRecExprLiterally(const SCEVAddRecExpr *S) {
{
// Expand the step somewhere that dominates the loop header.
SCEVInsertPointGuard Guard(Builder, this);
- StepV = expandCodeFor(Step, IntTy, &L->getHeader()->front());
+ StepV = expandCodeFor(Step, IntTy,
+ &*L->getHeader()->getFirstInsertionPt());
}
Result = expandIVInc(PN, StepV, L, ExpandTy, IntTy, useSubtract);
}
@@ -1870,11 +1872,6 @@ Value *SCEVExpander::expand(const SCEV *S) {
}
}
- // IndVarSimplify sometimes sets the insertion point at the block start, even
- // when there are PHIs at that point. We must correct for this.
- if (isa<PHINode>(*InsertPt))
- InsertPt = &*InsertPt->getParent()->getFirstInsertionPt();
-
// Check to see if we already expanded this here.
auto I = InsertedExpressions.find(std::make_pair(S, InsertPt));
if (I != InsertedExpressions.end())
@@ -1945,7 +1942,8 @@ SCEVExpander::getOrInsertCanonicalInductionVariable(const Loop *L,
// Emit code for it.
SCEVInsertPointGuard Guard(Builder, this);
PHINode *V =
- cast<PHINode>(expandCodeFor(H, nullptr, &L->getHeader()->front()));
+ cast<PHINode>(expandCodeFor(H, nullptr,
+ &*L->getHeader()->getFirstInsertionPt()));
return V;
}
diff --git a/llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll b/llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
new file mode 100644
index 000000000000..80191d4e5b77
--- /dev/null
+++ b/llvm/test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
@@ -0,0 +1,24 @@
+; RUN: opt < %s -indvars -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-n32:64"
+
+define dso_local void @Widen_i32_i8ptr() local_unnamed_addr {
+; CHECK-LABEL: @Widen_i32_i8ptr(
+; CHECK: phi i8*
+; CHECK: phi i32
+entry:
+ %ptrids = alloca [15 x i8*], align 8
+ %arraydecay2032 = getelementptr inbounds [15 x i8*], [15 x i8*]* %ptrids, i64 0, i64 0
+ store i8** %arraydecay2032, i8*** inttoptr (i64 8 to i8***), align 8
+ br label %for.cond2106
+
+for.cond2106: ; preds = %for.cond2106, %entry
+ %gid.0 = phi i8* [ null, %entry ], [ %incdec.ptr, %for.cond2106 ]
+ %i.0 = phi i32 [ 0, %entry ], [ %inc2117, %for.cond2106 ]
+ %incdec.ptr = getelementptr inbounds i8, i8* %gid.0, i64 1
+ %idxprom2114 = zext i32 %i.0 to i64
+ %arrayidx2115 = getelementptr inbounds [15 x i8*], [15 x i8*]* %ptrids, i64 0, i64 %idxprom2114
+ store i8* %gid.0, i8** %arrayidx2115, align 8
+ %inc2117 = add nuw nsw i32 %i.0, 1
+ br label %for.cond2106
+}
More information about the llvm-commits
mailing list