Skip to content
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

Merged
merged 2 commits into from
Jun 13, 2024

Conversation

zjaffal
Copy link
Contributor

@zjaffal zjaffal commented Jun 12, 2024

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 pattern isKnownX belong there.

@llvmbot
Copy link
Collaborator

llvmbot commented Jun 12, 2024

@llvm/pr-subscribers-llvm-analysis

@llvm/pr-subscribers-llvm-transforms

Author: Zain Jaffal (zjaffal)

Changes

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 pattern isKnownX belong there.


Full diff: https://github.com/llvm/llvm-project/pull/95321.diff

3 Files Affected:

  • (modified) llvm/include/llvm/Analysis/ValueTracking.h (+7)
  • (modified) llvm/lib/Analysis/ValueTracking.cpp (+22)
  • (modified) llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp (-27)
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();

Copy link
Member

@dtcxzyw dtcxzyw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@zjaffal zjaffal merged commit 22ff7c5 into llvm:main Jun 13, 2024
3 of 5 checks passed
@zjaffal zjaffal deleted the analysis/value_tracking/isKnownInversion branch June 23, 2024 10:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants