[llvm] 22ff7c5 - [ValueTracking][NFC] move isKnownInversion to ValueTracking (#95321)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 12 23:14:13 PDT 2024


Author: Zain Jaffal
Date: 2024-06-13T07:14:08+01:00
New Revision: 22ff7c5dc96828aba967fb3bcb3f929ea4509783

URL: https://github.com/llvm/llvm-project/commit/22ff7c5dc96828aba967fb3bcb3f929ea4509783
DIFF: https://github.com/llvm/llvm-project/commit/22ff7c5dc96828aba967fb3bcb3f929ea4509783.diff

LOG: [ValueTracking][NFC] move isKnownInversion to ValueTracking (#95321)

I am using `isKnownInversion` in the following pr 
https://github.com/llvm/llvm-project/pull/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.

Added: 
    

Modified: 
    llvm/include/llvm/Analysis/ValueTracking.h
    llvm/lib/Analysis/ValueTracking.cpp
    llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Analysis/ValueTracking.h b/llvm/include/llvm/Analysis/ValueTracking.h
index 0584b7e29f67b..e577d0cc7ad41 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(const Value *X, const 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..8126d2a1acc27 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(const Value *X, const 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();


        


More information about the llvm-commits mailing list