[PATCH] D112516: [SCEV][NFC] Factor out common API for getting unique operands of a SCEV
Max Kazantsev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 25 22:39:33 PDT 2021
mkazantsev created this revision.
mkazantsev added a reviewer: reames.
Herald added a subscriber: hiraditya.
mkazantsev requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
This function is used at least in 2 places, to it makes sense to make it separate.
https://reviews.llvm.org/D112516
Files:
llvm/lib/Analysis/ScalarEvolution.cpp
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -6607,22 +6607,29 @@
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,
+ SmallPtrSetImpl<const SCEV *> &Ops) {
+ if (auto *S2 = dyn_cast<SCEVCastExpr>(S))
+ for (auto *Op : S2->operands())
+ Ops.insert(Op);
+ else if (auto *S2 = dyn_cast<SCEVNAryExpr>(S))
+ for (auto *Op : S2->operands())
+ Ops.insert(Op);
+ else if (auto *S2 = dyn_cast<SCEVUDivExpr>(S))
+ for (auto *Op : S2->operands())
+ Ops.insert(Op);
+}
+
const Instruction *
ScalarEvolution::getDefiningScopeBound(ArrayRef<const SCEV *> Ops) {
// Do a bounded search of the def relation of the requested SCEVs.
- SmallSet<const SCEV *, 16> Visited;
+ SmallPtrSet<const SCEV *, 16> Visited;
SmallVector<const SCEV *> Worklist;
- auto pushOp = [&](const SCEV *S) {
- if (!Visited.insert(S).second)
- return;
- // Threshold of 30 here is arbitrary.
- if (Visited.size() > 30)
- return;
- Worklist.push_back(S);
- };
-
for (auto *S : Ops)
- pushOp(S);
+ if (Visited.insert(S).second)
+ Worklist.push_back(S);
const Instruction *Bound = nullptr;
while (!Worklist.empty()) {
@@ -6630,15 +6637,14 @@
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())
- pushOp(Op);
+ } else {
+ SmallPtrSet<const SCEV *, 4> Ops;
+ collectUniqueOps(S, Ops);
+ for (auto *Op : Ops)
+ // Threshold of 30 here is arbitrary.
+ if (Visited.size() <= 30 && Visited.insert(Op).second)
+ Worklist.push_back(Op);
+ }
}
return Bound ? Bound : &*F.getEntryBlock().begin();
}
@@ -12915,14 +12921,7 @@
// 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());
- }
+ collectUniqueOps(&S, Ops);
for (const auto *Op : Ops) {
// We do not store dependencies of constants.
if (isa<SCEVConstant>(Op))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112516.382194.patch
Type: text/x-patch
Size: 2918 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211026/8945d1c0/attachment.bin>
More information about the llvm-commits
mailing list