[InstSimplify] reduce code duplication for 'or' logic fold; NFC
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 8f1ba83..37732b19 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2196,6 +2196,16 @@ if (match(Y, m_c_And(m_Specific(X), m_Value()))) return X; + 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) + 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; + return nullptr; } @@ -2230,24 +2240,6 @@ return V; 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(Op1, m_Xor(m_Value(A), m_Value(B))) && - (match(Op0, m_c_And(m_Specific(A), m_Not(m_Specific(B)))) || - match(Op0, m_c_And(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(Op0, m_Xor(m_Value(A), m_Value(B))) && - (match(Op1, m_c_And(m_Specific(A), m_Not(m_Specific(B)))) || - match(Op1, m_c_And(m_Not(m_Specific(A)), m_Specific(B))))) - return Op0; // (A & B) | (~A ^ B) -> (~A ^ B) // (B & A) | (~A ^ B) -> (~A ^ B)