diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-10 01:12:06 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-10 01:12:06 +0000 |
commit | cda9ca5a4fed09ea3788b572dbddabf2a5a7a5d9 (patch) | |
tree | 2180fc85129bef1ba9bdd4b2cc7d114211ac9a80 | |
parent | a12489e34f4bfd7a33793d09440e7818b39deac5 (diff) |
Allow indvar simplify to canonicalize ANY affine IV, not just affine IVs with
constant stride. This implements Transforms/IndVarsSimplify/variable-stride-ivs.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22744 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index 82bab5acd0..f2b812d437 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -128,9 +128,9 @@ void IndVarSimplify::EliminatePointerRecurrence(PHINode *PN, unsigned PreheaderIdx = PN->getBasicBlockIndex(Preheader); unsigned BackedgeIdx = PreheaderIdx^1; if (GetElementPtrInst *GEPI = - dyn_cast<GetElementPtrInst>(PN->getIncomingValue(BackedgeIdx))) + dyn_cast<GetElementPtrInst>(PN->getIncomingValue(BackedgeIdx))) if (GEPI->getOperand(0) == PN) { - assert(GEPI->getNumOperands() == 2 && "GEP types must mismatch!"); + assert(GEPI->getNumOperands() == 2 && "GEP types must match!"); // Okay, we found a pointer recurrence. Transform this pointer // recurrence into an integer recurrence. Compute the value that gets @@ -407,13 +407,13 @@ void IndVarSimplify::runOnLoop(Loop *L) { if (PN->getType()->isInteger()) { // FIXME: when we have fast-math, enable! SCEVHandle SCEV = SE->getSCEV(PN); if (SCEV->hasComputableLoopEvolution(L)) - // FIXME: Without a strength reduction pass, it is an extremely bad idea - // to indvar substitute anything more complex than a linear induction - // variable. Doing so will put expensive multiply instructions inside - // of the loop. For now just disable indvar subst on anything more - // complex than a linear addrec. + // FIXME: It is an extremely bad idea to indvar substitute anything more + // complex than affine induction variables. Doing so will put expensive + // polynomial evaluations inside of the loop, and the str reduction pass + // currently can only reduce affine polynomials. For now just disable + // indvar subst on anything more complex than an affine addrec. if (SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(SCEV)) - if (AR->getNumOperands() == 2 && isa<SCEVConstant>(AR->getOperand(1))) + if (AR->isAffine()) IndVars.push_back(std::make_pair(PN, SCEV)); } } |