diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 3c8414c8398f19..26679542ec689d 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 92537f87dd68d2..42ce3878ac801a 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