[llvm] r317048 - [SimplifyIndVar] Inline makIVComparisonInvariant to eleminate code duplication [NFC]
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 31 15:56:16 PDT 2017
Author: reames
Date: Tue Oct 31 15:56:16 2017
New Revision: 317048
URL: http://llvm.org/viewvc/llvm-project?rev=317048&view=rev
Log:
[SimplifyIndVar] Inline makIVComparisonInvariant to eleminate code duplication [NFC]
This formulation might be slightly slower since I eagerly compute the cheap replacements. If anyone sees this having a compile time impact, let me know and I'll use lazy population instead.
Modified:
llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp?rev=317048&r1=317047&r2=317048&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyIndVar.cpp Tue Oct 31 15:56:16 2017
@@ -83,12 +83,6 @@ namespace {
bool eliminateOverflowIntrinsic(CallInst *CI);
bool eliminateIVUser(Instruction *UseInst, Instruction *IVOperand);
- bool isCheapLoopInvariantPredicate(ICmpInst::Predicate Pred,
- const SCEV *LHS, const SCEV *RHS, const Loop *L,
- const SmallDenseMap<const SCEV*, Value*> &FreeExpansions,
- ICmpInst::Predicate &InvariantPred,
- Value *&LHSV, Value *& RHSV);
- bool makeIVComparisonInvariant(ICmpInst *ICmp, Value *IVOperand);
void eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand);
void simplifyIVRemainder(BinaryOperator *Rem, Value *IVOperand,
bool IsSigned);
@@ -98,6 +92,16 @@ namespace {
bool eliminateSDiv(BinaryOperator *SDiv);
bool strengthenOverflowingOperation(BinaryOperator *OBO, Value *IVOperand);
bool strengthenRightShift(BinaryOperator *BO, Value *IVOperand);
+
+
+ private:
+ // Wrapped around ScalarEvolution::isLoopInvariantPredicate which returns
+ // true only when a free expansion is available.
+ bool isCheapLoopInvariantPredicate(ICmpInst::Predicate Pred,
+ const SCEV *LHS, const SCEV *RHS, const Loop *L,
+ const SmallDenseMap<const SCEV*, Value*> &FreeExpansions,
+ ICmpInst::Predicate &InvariantPred,
+ Value *&LHSV, Value *& RHSV);
};
}
@@ -187,10 +191,12 @@ bool SimplifyIndvar::isCheapLoopInvarian
return (LHSV && RHSV);
}
-bool SimplifyIndvar::makeIVComparisonInvariant(ICmpInst *ICmp,
- Value *IVOperand) {
+/// SimplifyIVUsers helper for eliminating useless
+/// comparisons against an induction variable.
+void SimplifyIndvar::eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand) {
unsigned IVOperIdx = 0;
ICmpInst::Predicate Pred = ICmp->getPredicate();
+ ICmpInst::Predicate OriginalPred = Pred;
if (IVOperand != ICmp->getOperand(0)) {
// Swapped
assert(IVOperand == ICmp->getOperand(1) && "Can't find IVOperand");
@@ -204,57 +210,23 @@ bool SimplifyIndvar::makeIVComparisonInv
const SCEV *S = SE->getSCEVAtScope(ICmp->getOperand(IVOperIdx), ICmpLoop);
const SCEV *X = SE->getSCEVAtScope(ICmp->getOperand(1 - IVOperIdx), ICmpLoop);
- auto *PN = dyn_cast<PHINode>(IVOperand);
- if (!PN)
- return false;
-
SmallDenseMap<const SCEV*, Value*> CheapExpansions;
CheapExpansions[S] = ICmp->getOperand(IVOperIdx);
CheapExpansions[X] = ICmp->getOperand(1 - IVOperIdx);
// TODO: Support multiple entry loops? (We currently bail out of these in
// the IndVarSimplify pass)
- if (auto *BB = L->getLoopPredecessor()) {
- Value *Incoming = PN->getIncomingValueForBlock(BB);
- const SCEV *IncomingS = SE->getSCEV(Incoming);
- CheapExpansions[IncomingS] = Incoming;
- }
+ auto *PN = dyn_cast<PHINode>(IVOperand);
+ if (PN)
+ if (auto *BB = L->getLoopPredecessor()) {
+ Value *Incoming = PN->getIncomingValueForBlock(BB);
+ const SCEV *IncomingS = SE->getSCEV(Incoming);
+ CheapExpansions[IncomingS] = Incoming;
+ }
ICmpInst::Predicate NewPred;
Value *NewLHS = nullptr, *NewRHS = nullptr;
- if (!isCheapLoopInvariantPredicate(Pred, S, X, L, CheapExpansions,
- NewPred, NewLHS, NewRHS))
- return false;
-
- assert(NewLHS && NewRHS);
-
- DEBUG(dbgs() << "INDVARS: Simplified comparison: " << *ICmp << '\n');
- ICmp->setPredicate(NewPred);
- ICmp->setOperand(0, NewLHS);
- ICmp->setOperand(1, NewRHS);
- return true;
-}
-
-/// SimplifyIVUsers helper for eliminating useless
-/// comparisons against an induction variable.
-void SimplifyIndvar::eliminateIVComparison(ICmpInst *ICmp, Value *IVOperand) {
- unsigned IVOperIdx = 0;
- ICmpInst::Predicate Pred = ICmp->getPredicate();
- ICmpInst::Predicate OriginalPred = Pred;
- if (IVOperand != ICmp->getOperand(0)) {
- // Swapped
- assert(IVOperand == ICmp->getOperand(1) && "Can't find IVOperand");
- IVOperIdx = 1;
- Pred = ICmpInst::getSwappedPredicate(Pred);
- }
-
- // Get the SCEVs for the ICmp operands (in the specific context of the
- // current loop)
- const Loop *ICmpLoop = LI->getLoopFor(ICmp->getParent());
- const SCEV *S = SE->getSCEVAtScope(ICmp->getOperand(IVOperIdx), ICmpLoop);
- const SCEV *X = SE->getSCEVAtScope(ICmp->getOperand(1 - IVOperIdx), ICmpLoop);
-
// If the condition is always true or always false, replace it with
// a constant value.
if (SE->isKnownPredicate(Pred, S, X)) {
@@ -265,8 +237,14 @@ void SimplifyIndvar::eliminateIVComparis
ICmp->replaceAllUsesWith(ConstantInt::getFalse(ICmp->getContext()));
DeadInsts.emplace_back(ICmp);
DEBUG(dbgs() << "INDVARS: Eliminated comparison: " << *ICmp << '\n');
- } else if (makeIVComparisonInvariant(ICmp, IVOperand)) {
- // fallthrough to end of function
+ } else if (PN &&
+ isCheapLoopInvariantPredicate(Pred, S, X, L, CheapExpansions,
+ NewPred, NewLHS, NewRHS)) {
+ DEBUG(dbgs() << "INDVARS: Simplified comparison: " << *ICmp << '\n');
+ ICmp->setPredicate(NewPred);
+ assert(NewLHS && NewRHS);
+ ICmp->setOperand(0, NewLHS);
+ ICmp->setOperand(1, NewRHS);
} else if (ICmpInst::isSigned(OriginalPred) &&
SE->isKnownNonNegative(S) && SE->isKnownNonNegative(X)) {
// If we were unable to make anything above, all we can is to canonicalize
More information about the llvm-commits
mailing list