diff options
author | Andrew Trick <atrick@apple.com> | 2013-07-12 22:08:44 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2013-07-12 22:08:44 +0000 |
commit | 807e6c71a8d13531ec359006e3b6526ae70064a8 (patch) | |
tree | 9921fc911ad20bba9ab32d17e88682c31824e9c3 | |
parent | 7137909128e6447c556b2713a60cd8e62f823612 (diff) | |
download | external_llvm-807e6c71a8d13531ec359006e3b6526ae70064a8.zip external_llvm-807e6c71a8d13531ec359006e3b6526ae70064a8.tar.gz external_llvm-807e6c71a8d13531ec359006e3b6526ae70064a8.tar.bz2 |
Cleanup LFTR logic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186214 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Scalar/IndVarSimplify.cpp | 37 |
1 files changed, 9 insertions, 28 deletions
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index b49bca7..f0ac637 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -1552,44 +1552,23 @@ LinearFunctionTestReplace(Loop *L, SCEVExpander &Rewriter) { assert(canExpandBackedgeTakenCount(L, SE) && "precondition"); - // LFTR can ignore IV overflow and truncate to the width of - // BECount. This avoids materializing the add(zext(add)) expression. - Type *CntTy = BackedgeTakenCount->getType(); + // Initialize CmpIndVar and IVCount to their preincremented values. + Value *CmpIndVar = IndVar; + const SCEV *IVCount = BackedgeTakenCount; // If the exiting block is the same as the backedge block, we prefer to // compare against the post-incremented value, otherwise we must compare // against the preincremented value. - Value *CmpIndVar; - const SCEV *IVCount; if (L->getExitingBlock() == L->getLoopLatch()) { // Add one to the "backedge-taken" count to get the trip count. - // If this addition may overflow, we have to be more pessimistic and - // cast the induction variable before doing the add. - const SCEV *N = - SE->getAddExpr(BackedgeTakenCount, - SE->getConstant(BackedgeTakenCount->getType(), 1)); - if (CntTy == BackedgeTakenCount->getType()) - IVCount = N; - else { - const SCEV *Zero = SE->getConstant(BackedgeTakenCount->getType(), 0); - if ((isa<SCEVConstant>(N) && !N->isZero()) || - SE->isLoopEntryGuardedByCond(L, ICmpInst::ICMP_NE, N, Zero)) { - // No overflow. Cast the sum. - IVCount = SE->getTruncateOrZeroExtend(N, CntTy); - } else { - // Potential overflow. Cast before doing the add. - IVCount = SE->getTruncateOrZeroExtend(BackedgeTakenCount, CntTy); - IVCount = SE->getAddExpr(IVCount, SE->getConstant(CntTy, 1)); - } - } + // This addition may overflow, which is valid as long as the comparison is + // truncated to BackedgeTakenCount->getType(). + IVCount = SE->getAddExpr(BackedgeTakenCount, + SE->getConstant(BackedgeTakenCount->getType(), 1)); // The BackedgeTaken expression contains the number of times that the // backedge branches to the loop header. This is one less than the // number of times the loop executes, so use the incremented indvar. CmpIndVar = IndVar->getIncomingValueForBlock(L->getExitingBlock()); - } else { - // We must use the preincremented value... - IVCount = SE->getTruncateOrZeroExtend(BackedgeTakenCount, CntTy); - CmpIndVar = IndVar; } Value *ExitCnt = genLoopLimit(IndVar, IVCount, L, Rewriter, SE); @@ -1611,6 +1590,8 @@ LinearFunctionTestReplace(Loop *L, << " RHS:\t" << *ExitCnt << "\n" << " IVCount:\t" << *IVCount << "\n"); + // LFTR can ignore IV overflow and truncate to the width of + // BECount. This avoids materializing the add(zext(add)) expression. IRBuilder<> Builder(BI); if (SE->getTypeSizeInBits(CmpIndVar->getType()) > SE->getTypeSizeInBits(ExitCnt->getType())) { |