diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -2226,6 +2226,12 @@ match(Y, m_c_Or(m_Specific(A), m_Specific(B)))) return ConstantInt::getAllOnesValue(Ty); + // (A ^ B) | (~A | B) --> -1 + // (A ^ B) | (~B | A) --> -1 + if (match(X, m_c_Or(m_Not(m_Value(A)), m_Value(B))) && + match(Y, m_c_Xor(m_Specific(A), m_Specific(B)))) + return ConstantInt::getAllOnesValue(Ty); + return nullptr; }