mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 14:06:36 +00:00
[SCEV][IndVarSimplify] insert point should not be block front.
Recommit after removing the unused cast instructions. Differential Revision: https://reviews.llvm.org/D80975
This commit is contained in:
parent
92a77f4b5e
commit
ac8923acd0
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
24
test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
Normal file
24
test/Transforms/IndVarSimplify/widen-i32-i8ptr.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user