diff options
author | Dan Gohman <gohman@apple.com> | 2010-04-19 21:48:58 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2010-04-19 21:48:58 +0000 |
commit | e637ff5e9a884299418c4da192ab88b2d2197f28 (patch) | |
tree | 4312ec861fb6c87bd6d1e8545002d2bc01e50ffa /llvm/lib | |
parent | c81ca09830a95e532206dfaeeb12c25315c6fb1a (diff) | |
download | bcm5719-llvm-e637ff5e9a884299418c4da192ab88b2d2197f28.tar.gz bcm5719-llvm-e637ff5e9a884299418c4da192ab88b2d2197f28.zip |
Remove the Expr member from IVUsers. Instead of remembering the expression,
just ask ScalarEvolution for it on demand. This helps IVUsers be more robust
in the case of expressions changing underneath it. This fixes PR6862.
llvm-svn: 101819
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Analysis/IVUsers.cpp | 56 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp | 11 |
2 files changed, 32 insertions, 35 deletions
diff --git a/llvm/lib/Analysis/IVUsers.cpp b/llvm/lib/Analysis/IVUsers.cpp index fbd3e707127..2c997dae585 100644 --- a/llvm/lib/Analysis/IVUsers.cpp +++ b/llvm/lib/Analysis/IVUsers.cpp @@ -122,23 +122,21 @@ bool IVUsers::AddUsersIfInteresting(Instruction *I) { if (AddUserToIVUsers) { // Okay, we found a user that we cannot reduce. - IVUses.push_back(new IVStrideUse(this, ISE, User, I)); + IVUses.push_back(new IVStrideUse(this, User, I)); IVStrideUse &NewUse = IVUses.back(); // Transform the expression into a normalized form. - NewUse.Expr = - TransformForPostIncUse(NormalizeAutodetect, NewUse.Expr, - User, I, - NewUse.PostIncLoops, - *SE, *DT); - DEBUG(dbgs() << " NORMALIZED TO: " << *NewUse.Expr << '\n'); + ISE = TransformForPostIncUse(NormalizeAutodetect, + ISE, User, I, + NewUse.PostIncLoops, + *SE, *DT); + DEBUG(dbgs() << " NORMALIZED TO: " << *ISE << '\n'); } } return true; } -IVStrideUse &IVUsers::AddUser(const SCEV *Expr, - Instruction *User, Value *Operand) { - IVUses.push_back(new IVStrideUse(this, Expr, User, Operand)); +IVStrideUse &IVUsers::AddUser(Instruction *User, Value *Operand) { + IVUses.push_back(new IVStrideUse(this, User, Operand)); return IVUses.back(); } @@ -169,15 +167,6 @@ bool IVUsers::runOnLoop(Loop *l, LPPassManager &LPM) { return false; } -/// getReplacementExpr - Return a SCEV expression which computes the -/// value of the OperandValToReplace of the given IVStrideUse. -const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &U) const { - PostIncLoopSet &Loops = const_cast<PostIncLoopSet &>(U.PostIncLoops); - return TransformForPostIncUse(Denormalize, U.getExpr(), - U.getUser(), U.getOperandValToReplace(), - Loops, *SE, *DT); -} - void IVUsers::print(raw_ostream &OS, const Module *M) const { OS << "IV Users for loop "; WriteAsOperand(OS, L->getHeader(), false); @@ -194,8 +183,7 @@ void IVUsers::print(raw_ostream &OS, const Module *M) const { E = IVUses.end(); UI != E; ++UI) { OS << " "; WriteAsOperand(OS, UI->getOperandValToReplace(), false); - OS << " = " - << *getReplacementExpr(*UI); + OS << " = " << *getReplacementExpr(*UI); for (PostIncLoopSet::const_iterator I = UI->PostIncLoops.begin(), E = UI->PostIncLoops.end(); I != E; ++I) { @@ -218,6 +206,21 @@ void IVUsers::releaseMemory() { IVUses.clear(); } +/// getReplacementExpr - Return a SCEV expression which computes the +/// value of the OperandValToReplace. +const SCEV *IVUsers::getReplacementExpr(const IVStrideUse &IU) const { + return SE->getSCEV(IU.getOperandValToReplace()); +} + +/// getExpr - Return the expression for the use. +const SCEV *IVUsers::getExpr(const IVStrideUse &IU) const { + return + TransformForPostIncUse(Normalize, getReplacementExpr(IU), + IU.getUser(), IU.getOperandValToReplace(), + const_cast<PostIncLoopSet &>(IU.getPostIncLoops()), + *SE, *DT); +} + static const SCEVAddRecExpr *findAddRecForLoop(const SCEV *S, const Loop *L) { if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) { if (AR->getLoop() == L) @@ -236,18 +239,13 @@ static const SCEVAddRecExpr *findAddRecForLoop(const SCEV *S, const Loop *L) { return 0; } -const SCEV *IVStrideUse::getStride(const Loop *L) const { - if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(), L)) - return AR->getStepRecurrence(*Parent->SE); +const SCEV *IVUsers::getStride(const IVStrideUse &IU, const Loop *L) const { + if (const SCEVAddRecExpr *AR = findAddRecForLoop(getExpr(IU), L)) + return AR->getStepRecurrence(*SE); return 0; } void IVStrideUse::transformToPostInc(const Loop *L) { - PostIncLoopSet Loops; - Loops.insert(L); - Expr = TransformForPostIncUse(Normalize, Expr, - getUser(), getOperandValToReplace(), - Loops, *Parent->SE, *Parent->DT); PostIncLoops.insert(L); } diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 19f78f424ce..a09bca89976 100644 --- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -1575,8 +1575,8 @@ LSRInstance::OptimizeLoopTermCond() { !DT.properlyDominates(UI->getUser()->getParent(), ExitingBlock)) { // Conservatively assume there may be reuse if the quotient of their // strides could be a legal scale. - const SCEV *A = CondUse->getStride(L); - const SCEV *B = UI->getStride(L); + const SCEV *A = IU.getStride(*CondUse, L); + const SCEV *B = IU.getStride(*UI, L); if (!A || !B) continue; if (SE.getTypeSizeInBits(A->getType()) != SE.getTypeSizeInBits(B->getType())) { @@ -1629,8 +1629,7 @@ LSRInstance::OptimizeLoopTermCond() { ExitingBlock->getInstList().insert(TermBr, Cond); // Clone the IVUse, as the old use still exists! - CondUse = &IU.AddUser(CondUse->getExpr(), - Cond, CondUse->getOperandValToReplace()); + CondUse = &IU.AddUser(Cond, CondUse->getOperandValToReplace()); TermBr->replaceUsesOfWith(OldCond, Cond); } } @@ -1748,7 +1747,7 @@ void LSRInstance::CollectInterestingTypesAndFactors() { // Collect interesting types and strides. SmallVector<const SCEV *, 4> Worklist; for (IVUsers::const_iterator UI = IU.begin(), E = IU.end(); UI != E; ++UI) { - const SCEV *Expr = UI->getExpr(); + const SCEV *Expr = IU.getExpr(*UI); // Collect interesting types. Types.insert(SE.getEffectiveSCEVType(Expr->getType())); @@ -1819,7 +1818,7 @@ void LSRInstance::CollectFixupsAndInitialFormulae() { AccessTy = getAccessType(LF.UserInst); } - const SCEV *S = UI->getExpr(); + const SCEV *S = IU.getExpr(*UI); // Equality (== and !=) ICmps are special. We can rewrite (i == N) as // (N - i == 0), and this allows (N - i) to be the expression that we work |