[InstSimplify] reduce code duplication for 'or' logic folds; NFC
authorSanjay Patel <spatel@rotateright.com>
Tue, 30 Nov 2021 18:17:30 +0000 (13:17 -0500)
committerSanjay Patel <spatel@rotateright.com>
Tue, 30 Nov 2021 19:08:54 +0000 (14:08 -0500)
llvm/lib/Analysis/InstructionSimplify.cpp

index 37732b19e1c3e4d882329b198c3f9cd1f78bda4b..1f568ad6e839c69d4f9a396238a8a5f39c2c2078 100644 (file)
@@ -2198,14 +2198,28 @@ static Value *simplifyOrLogic(Value *X, Value *Y) {
 
   Value *A, *B;
 
-  // (A & ~B) | (A ^ B) --> (A ^ B)
-  // (~B & A) | (A ^ B) --> (A ^ B)
-  // (A & ~B) | (B ^ A) --> (B ^ A)
-  // (~B & A) | (B ^ A) --> (B ^ A)
+  // (A & ~B) | (A ^ B) --> A ^ B
+  // (~B & A) | (A ^ B) --> A ^ B
+  // (A & ~B) | (B ^ A) --> B ^ A
+  // (~B & A) | (B ^ A) --> B ^ A
   if (match(X, m_c_And(m_Value(A), m_Not(m_Value(B)))) &&
       match(Y, m_c_Xor(m_Specific(A), m_Specific(B))))
     return Y;
 
+  // (~A ^ B) | (A & B) --> ~A ^ B
+  // (B ^ ~A) | (A & B) --> B ^ ~A
+  // (~A ^ B) | (B & A) --> ~A ^ B
+  // (B ^ ~A) | (B & A) --> B ^ ~A
+  if (match(X, m_c_Xor(m_Not(m_Value(A)), m_Value(B))) &&
+      match(Y, m_c_And(m_Specific(A), m_Specific(B))))
+    return X;
+
+  // (A ^ B) | (A | B) --> A | B
+  // (A ^ B) | (B | A) --> B | A
+  if (match(X, m_Xor(m_Value(A), m_Value(B))) &&
+      match(Y, m_c_Or(m_Specific(A), m_Specific(B))))
+    return Y;
+
   return nullptr;
 }
 
@@ -2241,38 +2255,6 @@ static Value *SimplifyOrInst(Value *Op0, Value *Op1, const SimplifyQuery &Q,
 
   Value *A, *B, *NotA;
 
-  // (A & B) | (~A ^ B) -> (~A ^ B)
-  // (B & A) | (~A ^ B) -> (~A ^ B)
-  // (A & B) | (B ^ ~A) -> (B ^ ~A)
-  // (B & A) | (B ^ ~A) -> (B ^ ~A)
-  if (match(Op0, m_And(m_Value(A), m_Value(B))) &&
-      (match(Op1, m_c_Xor(m_Specific(A), m_Not(m_Specific(B)))) ||
-       match(Op1, m_c_Xor(m_Not(m_Specific(A)), m_Specific(B)))))
-    return Op1;
-
-  // Commute the 'or' operands.
-  // (~A ^ B) | (A & B) -> (~A ^ B)
-  // (~A ^ B) | (B & A) -> (~A ^ B)
-  // (B ^ ~A) | (A & B) -> (B ^ ~A)
-  // (B ^ ~A) | (B & A) -> (B ^ ~A)
-  if (match(Op1, m_And(m_Value(A), m_Value(B))) &&
-      (match(Op0, m_c_Xor(m_Specific(A), m_Not(m_Specific(B)))) ||
-       match(Op0, m_c_Xor(m_Not(m_Specific(A)), m_Specific(B)))))
-    return Op0;
-
-  // (A | B) | (A ^ B) --> A | B
-  // (B | A) | (A ^ B) --> B | A
-  if (match(Op1, m_Xor(m_Value(A), m_Value(B))) &&
-      match(Op0, m_c_Or(m_Specific(A), m_Specific(B))))
-    return Op0;
-
-  // Commute the outer 'or' operands.
-  // (A ^ B) | (A | B) --> A | B
-  // (A ^ B) | (B | A) --> B | A
-  if (match(Op0, m_Xor(m_Value(A), m_Value(B))) &&
-      match(Op1, m_c_Or(m_Specific(A), m_Specific(B))))
-    return Op1;
-
   // (~A & B) | ~(A | B) --> ~A
   // (~A & B) | ~(B | A) --> ~A
   // (B & ~A) | ~(A | B) --> ~A