-
Notifications
You must be signed in to change notification settings - Fork 11.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ValueTracking][NFC] move isKnownInversion to ValueTracking #95321
[ValueTracking][NFC] move isKnownInversion to ValueTracking #95321
Conversation
@llvm/pr-subscribers-llvm-analysis @llvm/pr-subscribers-llvm-transforms Author: Zain Jaffal (zjaffal) ChangesI am using it is useful to have the method in a shared class so I can reuse it. I am not sure if Full diff: https://github.com/llvm/llvm-project/pull/95321.diff 3 Files Affected:
diff --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 0584b7e29f67b..8f497e3f5db99 100644
--- a/llvm/include/llvm/Analysis/ValueTracking.h
+++ b/llvm/include/llvm/Analysis/ValueTracking.h
@@ -136,6 +136,13 @@ bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth = 0);
bool isKnownNegation(const Value *X, const Value *Y, bool NeedNSW = false,
bool AllowPoison = true);
+/// Return true iff:
+/// 1. X is poison implies Y is poison.
+/// 2. X is true implies Y is false.
+/// 3. X is false implies Y is true.
+/// Otherwise, return false.
+bool isKnownInversion(Value *X, Value *Y);
+
/// Returns true if the give value is known to be non-negative.
bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ,
unsigned Depth = 0);
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 6a806d596efe7..5123287a8c951 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -8176,6 +8176,28 @@ bool llvm::isKnownNegation(const Value *X, const Value *Y, bool NeedNSW,
match(Y, m_NSWSub(m_Specific(B), m_Specific(A)))));
}
+bool llvm::isKnownInversion(Value *X, Value *Y) {
+ // Handle X = icmp pred A, B, Y = icmp pred A, C.
+ Value *A, *B, *C;
+ ICmpInst::Predicate Pred1, Pred2;
+ if (!match(X, m_ICmp(Pred1, m_Value(A), m_Value(B))) ||
+ !match(Y, m_c_ICmp(Pred2, m_Specific(A), m_Value(C))))
+ return false;
+
+ if (B == C)
+ return Pred1 == ICmpInst::getInversePredicate(Pred2);
+
+ // Try to infer the relationship from constant ranges.
+ const APInt *RHSC1, *RHSC2;
+ if (!match(B, m_APInt(RHSC1)) || !match(C, m_APInt(RHSC2)))
+ return false;
+
+ const auto CR1 = ConstantRange::makeExactICmpRegion(Pred1, *RHSC1);
+ const auto CR2 = ConstantRange::makeExactICmpRegion(Pred2, *RHSC2);
+
+ return CR1.inverse() == CR2;
+}
+
static SelectPatternResult matchSelectPattern(CmpInst::Predicate Pred,
FastMathFlags FMF,
Value *CmpLHS, Value *CmpRHS,
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
index 588607b3fea2f..7d26807544d7e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -3520,33 +3520,6 @@ static bool matchFMulByZeroIfResultEqZero(InstCombinerImpl &IC, Value *Cmp0,
return false;
}
-/// Return true iff:
-/// 1. X is poison implies Y is poison.
-/// 2. X is true implies Y is false.
-/// 3. X is false implies Y is true.
-/// Otherwise, return false.
-static bool isKnownInversion(Value *X, Value *Y) {
- // Handle X = icmp pred A, B, Y = icmp pred A, C.
- Value *A, *B, *C;
- ICmpInst::Predicate Pred1, Pred2;
- if (!match(X, m_ICmp(Pred1, m_Value(A), m_Value(B))) ||
- !match(Y, m_c_ICmp(Pred2, m_Specific(A), m_Value(C))))
- return false;
-
- if (B == C)
- return Pred1 == ICmpInst::getInversePredicate(Pred2);
-
- // Try to infer the relationship from constant ranges.
- const APInt *RHSC1, *RHSC2;
- if (!match(B, m_APInt(RHSC1)) || !match(C, m_APInt(RHSC2)))
- return false;
-
- const auto CR1 = ConstantRange::makeExactICmpRegion(Pred1, *RHSC1);
- const auto CR2 = ConstantRange::makeExactICmpRegion(Pred2, *RHSC2);
-
- return CR1.inverse() == CR2;
-}
-
Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
Value *CondVal = SI.getCondition();
Value *TrueVal = SI.getTrueValue();
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
I am using
isKnownInversion
in the following pr#94915
it is useful to have the method in a shared class so I can reuse it. I am not sure if
ValueTracking
is the correct place but it looks like most of the methods with the patternisKnownX
belong there.