[llvm] 8b56fa9 - [InstCombine] fix "X|(X^Y)" pattern-matching for commuted variants

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Sat Aug 13 08:11:31 PDT 2022


Author: Sanjay Patel
Date: 2022-08-13T11:02:28-04:00
New Revision: 8b56fa92deee0c285c8b54985df0d13ffb172ec3

URL: https://github.com/llvm/llvm-project/commit/8b56fa92deee0c285c8b54985df0d13ffb172ec3
DIFF: https://github.com/llvm/llvm-project/commit/8b56fa92deee0c285c8b54985df0d13ffb172ec3.diff

LOG: [InstCombine] fix "X|(X^Y)" pattern-matching for commuted variants

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
    llvm/test/Transforms/InstCombine/or-xor.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 3c8414c8398f..26679542ec68 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -2799,6 +2799,10 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
     return BinaryOperator::CreateMul(X, IncrementY);
   }
 
+  // X | (X ^ Y) --> X | Y (4 commuted patterns)
+  if (match(&I, m_c_Or(m_Value(X), m_c_Xor(m_Deferred(X), m_Value(Y)))))
+    return BinaryOperator::CreateOr(X, Y);
+
   // (A & C) | (B & D)
   Value *A, *B, *C, *D;
   if (match(Op0, m_And(m_Value(A), m_Value(C))) &&
@@ -2909,11 +2913,6 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
   }
 
   if (match(Op1, m_Xor(m_Value(A), m_Value(B)))) {
-    // A | (A ^ B) --> A | B
-    // B | (A ^ B) --> A | B
-    if (Op0 == A || Op0 == B)
-      return BinaryOperator::CreateOr(A, B);
-
     // (A | ?) | (A ^ B) --> (A | ?) | B
     // (B | ?) | (A ^ B) --> (B | ?) | A
     if (match(Op0, m_c_Or(m_Specific(A), m_Value())))

diff  --git a/llvm/test/Transforms/InstCombine/or-xor.ll b/llvm/test/Transforms/InstCombine/or-xor.ll
index 92537f87dd68..42ce3878ac80 100644
--- a/llvm/test/Transforms/InstCombine/or-xor.ll
+++ b/llvm/test/Transforms/InstCombine/or-xor.ll
@@ -168,7 +168,7 @@ define i8 @xor_common_op_commute1(i8 %x, i8 %y) {
 ; CHECK-LABEL: @xor_common_op_commute1(
 ; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[Y:%.*]], [[X:%.*]]
 ; CHECK-NEXT:    call void @use(i8 [[XOR]])
-; CHECK-NEXT:    [[Z:%.*]] = or i8 [[Y]], [[X]]
+; CHECK-NEXT:    [[Z:%.*]] = or i8 [[X]], [[Y]]
 ; CHECK-NEXT:    ret i8 [[Z]]
 ;
   %xor = xor i8 %y, %x
@@ -180,8 +180,7 @@ define i8 @xor_common_op_commute1(i8 %x, i8 %y) {
 define i8 @xor_common_op_commute2(i8 %p, i8 %y) {
 ; CHECK-LABEL: @xor_common_op_commute2(
 ; CHECK-NEXT:    [[X:%.*]] = xor i8 [[P:%.*]], 5
-; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[X]], [[Y:%.*]]
-; CHECK-NEXT:    [[Z:%.*]] = or i8 [[X]], [[XOR]]
+; CHECK-NEXT:    [[Z:%.*]] = or i8 [[X]], [[Y:%.*]]
 ; CHECK-NEXT:    ret i8 [[Z]]
 ;
   %x = xor i8 %p, 5 ; thwart complexity-based canonicalization
@@ -194,8 +193,7 @@ define i8 @xor_common_op_commute3(i8 %p, i8 %q) {
 ; CHECK-LABEL: @xor_common_op_commute3(
 ; CHECK-NEXT:    [[X:%.*]] = xor i8 [[P:%.*]], 5
 ; CHECK-NEXT:    [[Y:%.*]] = mul i8 [[Q:%.*]], [[Q]]
-; CHECK-NEXT:    [[XOR:%.*]] = xor i8 [[Y]], [[X]]
-; CHECK-NEXT:    [[Z:%.*]] = or i8 [[X]], [[XOR]]
+; CHECK-NEXT:    [[Z:%.*]] = or i8 [[X]], [[Y]]
 ; CHECK-NEXT:    ret i8 [[Z]]
 ;
   %x = xor i8 %p, 5  ; thwart complexity-based canonicalization


        


More information about the llvm-commits mailing list