diff options
author | Dan Gohman <gohman@apple.com> | 2009-06-03 19:11:31 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-06-03 19:11:31 +0000 |
commit | 68c9344056e714336a522148e0e468f35035c650 (patch) | |
tree | d0bb058cda52c32738edd29527ed38d45212f634 /lib/Transforms | |
parent | 222858256f4a2e799fcaef9c90056ed537db56bc (diff) |
Don't attempt to simplify an non-affine IV expression if it can't
be simplified to a loop-invariant value. This fixes PR4315.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72798 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index ca7aa7bd30..af61eae16f 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -465,17 +465,6 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, const Type *LargestType, // Compute the final addrec to expand into code. SCEVHandle AR = IU->getReplacementExpr(*UI); - // 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, unless - // it can be expanded to a trivial value. - if (!Stride->isLoopInvariant(L) && - !isa<SCEVConstant>(AR) && - L->contains(User->getParent())) - continue; - Value *NewVal = 0; if (AR->isLoopInvariant(L)) { BasicBlock::iterator I = Rewriter.getInsertionPoint(); @@ -487,6 +476,15 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, const Type *LargestType, Rewriter.setInsertionPoint(I); ++NumReplaced; } else { + // 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, unless + // it can be expanded to a trivial value. + if (!Stride->isLoopInvariant(L)) + continue; + const Type *IVTy = Offset->getType(); const Type *UseTy = Op->getType(); @@ -520,7 +518,7 @@ void IndVarSimplify::RewriteIVExpressions(Loop *L, const Type *LargestType, // induction variable, still in the canonical induction variable's // type, so that all expanded arithmetic is done in the same type. SCEVHandle NewAR = SE->getAddRecExpr(SE->getIntegerSCEV(0, LargestType), - PromotedStride, L); + PromotedStride, L); // Add the PromotedOffset as a separate step, because it may not be // loop-invariant. NewAR = SE->getAddExpr(NewAR, PromotedOffset); |