[llvm] 8d835f4 - [NFC] Introduce function getIVStep for further reuse
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 28 22:20:21 PST 2021
Author: Max Kazantsev
Date: 2021-03-01T13:04:56+07:00
New Revision: 8d835f42a57f15c0b9053bd7c41ea95821a40e5f
URL: https://github.com/llvm/llvm-project/commit/8d835f42a57f15c0b9053bd7c41ea95821a40e5f
DIFF: https://github.com/llvm/llvm-project/commit/8d835f42a57f15c0b9053bd7c41ea95821a40e5f.diff
LOG: [NFC] Introduce function getIVStep for further reuse
Added:
Modified:
llvm/lib/CodeGen/CodeGenPrepare.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index b935e238ea5c..2c2f667b0c93 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -1276,20 +1276,33 @@ static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI,
return SinkCast(CI);
}
+/// If given \p PN is an inductive variable with value IVInc coming from the
+/// backedge, and on each iteration it gets increased by Step, return pair
+/// <IVInc, Step>. Otherwise, return None.
+static Optional<std::pair<Instruction *, Constant *> >
+getIVIncrement(const PHINode *PN, const LoopInfo *LI) {
+ const Loop *L = LI->getLoopFor(PN->getParent());
+ if (!L || L->getHeader() != PN->getParent() || !L->getLoopLatch())
+ return None;
+ auto *IVInc =
+ dyn_cast<Instruction>(PN->getIncomingValueForBlock(L->getLoopLatch()));
+ if (!IVInc)
+ return None;
+ Constant *Step = nullptr;
+ if (match(IVInc, m_Sub(m_Specific(PN), m_Constant(Step))))
+ return std::make_pair(IVInc, ConstantExpr::getNeg(Step));
+ if (match(IVInc, m_Add(m_Specific(PN), m_Constant(Step))))
+ return std::make_pair(IVInc, Step);
+ return None;
+}
+
static bool isIVIncrement(const BinaryOperator *BO, const LoopInfo *LI) {
auto *PN = dyn_cast<PHINode>(BO->getOperand(0));
if (!PN)
return false;
- const Loop *L = LI->getLoopFor(BO->getParent());
- if (!L || L->getHeader() != PN->getParent() || !L->getLoopLatch())
- return false;
- const BasicBlock *Latch = L->getLoopLatch();
- if (PN->getIncomingValueForBlock(Latch) != BO)
- return false;
- if (!L->isLoopInvariant(BO->getOperand(1)))
- // Avoid complexities w/loop varying steps.
- return false;
- return true;
+ if (auto IVInc = getIVIncrement(PN, LI))
+ return IVInc->first == BO;
+ return false;
}
bool CodeGenPrepare::replaceMathCmpWithIntrinsic(BinaryOperator *BO,
More information about the llvm-commits
mailing list