[llvm] e512c5b - [SCEV][NFC] Factor out common API for getting unique operands of a SCEV
Max Kazantsev via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 31 22:00:25 PDT 2021
Author: Max Kazantsev
Date: 2021-11-01T11:36:47+07:00
New Revision: e512c5b1664d6a5640ce92597d3fa0556a5dbdc3
URL: https://github.com/llvm/llvm-project/commit/e512c5b1664d6a5640ce92597d3fa0556a5dbdc3
DIFF: https://github.com/llvm/llvm-project/commit/e512c5b1664d6a5640ce92597d3fa0556a5dbdc3.diff
LOG: [SCEV][NFC] Factor out common API for getting unique operands of a SCEV
This function is used at least in 2 places, to it makes sense to make it separate.
Differential Revision: https://reviews.llvm.org/D112516
Reviewed By: reames
Added:
Modified:
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 36386764e88e9..f39c97b11f9e9 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -6589,6 +6589,26 @@ ScalarEvolution::getNonTrivialDefiningScopeBound(const SCEV *S) {
return nullptr;
}
+/// Fills \p Ops with unique operands of \p S, if it has operands. If not,
+/// \p Ops remains unmodified.
+static void collectUniqueOps(const SCEV *S,
+ SmallVectorImpl<const SCEV *> &Ops) {
+ SmallPtrSet<const SCEV *, 4> Unique;
+ auto InsertUnique = [&](const SCEV *S) {
+ if (Unique.insert(S).second)
+ Ops.push_back(S);
+ };
+ if (auto *S2 = dyn_cast<SCEVCastExpr>(S))
+ for (auto *Op : S2->operands())
+ InsertUnique(Op);
+ else if (auto *S2 = dyn_cast<SCEVNAryExpr>(S))
+ for (auto *Op : S2->operands())
+ InsertUnique(Op);
+ else if (auto *S2 = dyn_cast<SCEVUDivExpr>(S))
+ for (auto *Op : S2->operands())
+ InsertUnique(Op);
+}
+
const Instruction *
ScalarEvolution::getDefiningScopeBound(ArrayRef<const SCEV *> Ops) {
// Do a bounded search of the def relation of the requested SCEVs.
@@ -6612,15 +6632,12 @@ ScalarEvolution::getDefiningScopeBound(ArrayRef<const SCEV *> Ops) {
if (auto *DefI = getNonTrivialDefiningScopeBound(S)) {
if (!Bound || DT.dominates(Bound, DefI))
Bound = DefI;
- } else if (auto *S2 = dyn_cast<SCEVCastExpr>(S))
- for (auto *Op : S2->operands())
- pushOp(Op);
- else if (auto *S2 = dyn_cast<SCEVNAryExpr>(S))
- for (auto *Op : S2->operands())
- pushOp(Op);
- else if (auto *S2 = dyn_cast<SCEVUDivExpr>(S))
- for (auto *Op : S2->operands())
+ } else {
+ SmallVector<const SCEV *, 4> Ops;
+ collectUniqueOps(S, Ops);
+ for (auto *Op : Ops)
pushOp(Op);
+ }
}
return Bound ? Bound : &*F.getEntryBlock().begin();
}
@@ -12908,15 +12925,8 @@ void ScalarEvolution::verify() const {
// Verify intergity of SCEV users.
for (const auto &S : UniqueSCEVs) {
- SmallPtrSet<const SCEV *, 4> Ops;
- if (const auto *NS = dyn_cast<SCEVNAryExpr>(&S))
- Ops.insert(NS->op_begin(), NS->op_end());
- else if (const auto *CS = dyn_cast<SCEVCastExpr>(&S))
- Ops.insert(CS->getOperand());
- else if (const auto *DS = dyn_cast<SCEVUDivExpr>(&S)) {
- Ops.insert(DS->getLHS());
- Ops.insert(DS->getRHS());
- }
+ SmallVector<const SCEV *, 4> Ops;
+ collectUniqueOps(&S, Ops);
for (const auto *Op : Ops) {
// We do not store dependencies of constants.
if (isa<SCEVConstant>(Op))
More information about the llvm-commits
mailing list