[llvm] [InstSimplify] Simplify select if it combinated `and/or/xor` (PR #73362)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 22 10:03:18 PST 2024


================
@@ -4585,6 +4585,50 @@ static Value *simplifySelectWithFakeICmpEq(Value *CmpLHS, Value *CmpRHS,
                                Pred == ICmpInst::ICMP_EQ);
 }
 
+/// Try to simplify the Select instruction consisting of and/or/xor.
+static Value *simplifySelectWithAndOrXorBitOp(Value *CmpLHS, Value *CmpRHS,
+                                              Value *TrueVal, Value *FalseVal) {
+  Value *X, *Y;
+  // (X & Y) == 0 ? X | Y : X ^ Y   --> X ^ Y
+  // (X & Y) == 0 ? X ^ Y : X | Y   --> X | Y
+  if (match(CmpLHS, m_And(m_Value(X), m_Value(Y))) && match(CmpRHS, m_Zero())) {
+    if ((match(TrueVal, m_c_Or(m_Specific(X), m_Specific(Y))) &&
+         match(FalseVal, m_c_Xor(m_Specific(X), m_Specific(Y)))) ||
+        (match(FalseVal, m_c_Or(m_Specific(X), m_Specific(Y))) &&
+         match(TrueVal, m_c_Xor(m_Specific(X), m_Specific(Y)))))
+      return FalseVal;
+  }
+  // (X | Y) == 0 ? X & Y : X ^ Y   --> X ^ Y
+  // (X | Y) == 0 ? X ^ Y : X & Y   --> X & Y
+  if (match(CmpLHS, m_Or(m_Value(X), m_Value(Y))) && match(CmpRHS, m_Zero())) {
+    if ((match(TrueVal, m_c_And(m_Specific(X), m_Specific(Y))) &&
+         match(FalseVal, m_c_Xor(m_Specific(X), m_Specific(Y)))) ||
+        (match(FalseVal, m_c_And(m_Specific(X), m_Specific(Y))) &&
+         match(TrueVal, m_c_Xor(m_Specific(X), m_Specific(Y)))))
+      return FalseVal;
+  }
+  // (X ^ Y) == 0 ? X | Y : X & Y   --> X & Y
+  // (X ^ Y) == 0 ? X & Y : X | Y   --> X | Y
+  if (match(CmpLHS, m_Xor(m_Value(X), m_Value(Y))) && match(CmpRHS, m_Zero())) {
----------------
ParkHanbum wrote:

When running with instcombine, xor is transformed to eq and comes. In case of instsimplify, it comes as xor.

If xor comes, is it desirable to process it by transform it to eq?

https://github.com/llvm/llvm-project/pull/73362


More information about the llvm-commits mailing list