When emitting code for an add, don't force a SCEVUnknown wrapper around

a hoisted intermediate result if the intermediate result isn't an
Instruction.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100884 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dan Gohman
2010-04-09 19:14:31 +00:00
parent 4a2a683366
commit f8d0578e4c
2 changed files with 41 additions and 3 deletions

View File

@@ -705,10 +705,11 @@ Value *SCEVExpander::visitAddExpr(const SCEVAddExpr *S) {
Sum = expandAddToGEP(NewOps.begin(), NewOps.end(), PTy, Ty, Sum);
} else if (const PointerType *PTy = dyn_cast<PointerType>(Op->getType())) {
// The running sum is an integer, and there's a pointer at this level.
// Try to form a getelementptr. Use a SCEVUnknown so that we don't
// re-analyze the instructions that we just emitted.
// Try to form a getelementptr. If the running sum is instructions,
// use a SCEVUnknown to avoid re-analyzing them.
SmallVector<const SCEV *, 4> NewOps;
NewOps.push_back(SE.getUnknown(Sum));
NewOps.push_back(isa<Instruction>(Sum) ? SE.getUnknown(Sum) :
SE.getSCEV(Sum));
for (++I; I != E && I->first == CurLoop; ++I)
NewOps.push_back(I->second);
Sum = expandAddToGEP(NewOps.begin(), NewOps.end(), PTy, Ty, expand(Op));