[llvm] b108c11 - [SCEV] Move SCEVPoisonCollector outside function (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 11 07:41:40 PDT 2023
Author: Nikita Popov
Date: 2023-08-11T16:41:31+02:00
New Revision: b108c11e4656c695853a14032ba33671a676203e
URL: https://github.com/llvm/llvm-project/commit/b108c11e4656c695853a14032ba33671a676203e
DIFF: https://github.com/llvm/llvm-project/commit/b108c11e4656c695853a14032ba33671a676203e.diff
LOG: [SCEV] Move SCEVPoisonCollector outside function (NFC)
To allow reusing it. Also switch it to store SCEVUnknown rather
than SCEV, as only these can produce poison.
Added:
Modified:
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 234b6fe438da88..f069bcaa7d1f0f 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -4108,36 +4108,38 @@ static bool scevUnconditionallyPropagatesPoisonFromOperands(SCEVTypes Kind) {
llvm_unreachable("Unknown SCEV kind!");
}
-/// Return true if V is poison given that AssumedPoison is already poison.
-static bool impliesPoison(const SCEV *AssumedPoison, const SCEV *S) {
- // The only way poison may be introduced in a SCEV expression is from a
- // poison SCEVUnknown (ConstantExprs are also represented as SCEVUnknown,
- // not SCEVConstant). Notably, nowrap flags in SCEV nodes can *not*
- // introduce poison -- they encode guaranteed, non-speculated knowledge.
- //
- // Additionally, all SCEV nodes propagate poison from inputs to outputs,
- // with the notable exception of umin_seq, where only poison from the first
- // operand is (unconditionally) propagated.
- struct SCEVPoisonCollector {
- bool LookThroughMaybePoisonBlocking;
- SmallPtrSet<const SCEV *, 4> MaybePoison;
- SCEVPoisonCollector(bool LookThroughMaybePoisonBlocking)
- : LookThroughMaybePoisonBlocking(LookThroughMaybePoisonBlocking) {}
-
- bool follow(const SCEV *S) {
- if (!LookThroughMaybePoisonBlocking &&
- !scevUnconditionallyPropagatesPoisonFromOperands(S->getSCEVType()))
- return false;
+namespace {
+// The only way poison may be introduced in a SCEV expression is from a
+// poison SCEVUnknown (ConstantExprs are also represented as SCEVUnknown,
+// not SCEVConstant). Notably, nowrap flags in SCEV nodes can *not*
+// introduce poison -- they encode guaranteed, non-speculated knowledge.
+//
+// Additionally, all SCEV nodes propagate poison from inputs to outputs,
+// with the notable exception of umin_seq, where only poison from the first
+// operand is (unconditionally) propagated.
+struct SCEVPoisonCollector {
+ bool LookThroughMaybePoisonBlocking;
+ SmallPtrSet<const SCEVUnknown *, 4> MaybePoison;
+ SCEVPoisonCollector(bool LookThroughMaybePoisonBlocking)
+ : LookThroughMaybePoisonBlocking(LookThroughMaybePoisonBlocking) {}
+
+ bool follow(const SCEV *S) {
+ if (!LookThroughMaybePoisonBlocking &&
+ !scevUnconditionallyPropagatesPoisonFromOperands(S->getSCEVType()))
+ return false;
- if (auto *SU = dyn_cast<SCEVUnknown>(S)) {
- if (!isGuaranteedNotToBePoison(SU->getValue()))
- MaybePoison.insert(S);
- }
- return true;
+ if (auto *SU = dyn_cast<SCEVUnknown>(S)) {
+ if (!isGuaranteedNotToBePoison(SU->getValue()))
+ MaybePoison.insert(SU);
}
- bool isDone() const { return false; }
- };
+ return true;
+ }
+ bool isDone() const { return false; }
+};
+} // namespace
+/// Return true if V is poison given that AssumedPoison is already poison.
+static bool impliesPoison(const SCEV *AssumedPoison, const SCEV *S) {
// First collect all SCEVs that might result in AssumedPoison to be poison.
// We need to look through potentially poison-blocking operations here,
// because we want to find all SCEVs that *might* result in poison, not only
@@ -4158,8 +4160,9 @@ static bool impliesPoison(const SCEV *AssumedPoison, const SCEV *S) {
// Make sure that no matter which SCEV in PC1.MaybePoison is actually poison,
// it will also make S poison by being part of PC2.MaybePoison.
- return all_of(PC1.MaybePoison,
- [&](const SCEV *S) { return PC2.MaybePoison.contains(S); });
+ return all_of(PC1.MaybePoison, [&](const SCEVUnknown *S) {
+ return PC2.MaybePoison.contains(S);
+ });
}
const SCEV *
More information about the llvm-commits
mailing list