[InstCombine] Use commutable and/or/xor matchers to simplify some code
Summary: This is my first time using the commutable matchers so wanted to make sure I was doing it right. Are there any other matcher tricks to further shrink this? Can we commute the whole match so we don't have to LHS and RHS separately? Reviewers: davide, spatel Reviewed By: davide Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D31680 llvm-svn: 299840
This commit is contained in:
@@ -1310,23 +1310,19 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
|
||||
{
|
||||
Value *A = nullptr, *B = nullptr;
|
||||
if (match(RHS, m_Xor(m_Value(A), m_Value(B))) &&
|
||||
(match(LHS, m_And(m_Specific(A), m_Specific(B))) ||
|
||||
match(LHS, m_And(m_Specific(B), m_Specific(A)))))
|
||||
match(LHS, m_c_And(m_Specific(A), m_Specific(B))))
|
||||
return BinaryOperator::CreateOr(A, B);
|
||||
|
||||
if (match(LHS, m_Xor(m_Value(A), m_Value(B))) &&
|
||||
(match(RHS, m_And(m_Specific(A), m_Specific(B))) ||
|
||||
match(RHS, m_And(m_Specific(B), m_Specific(A)))))
|
||||
match(RHS, m_c_And(m_Specific(A), m_Specific(B))))
|
||||
return BinaryOperator::CreateOr(A, B);
|
||||
}
|
||||
|
||||
|
||||
// (add (or A, B) (and A, B)) --> (add A, B)
|
||||
{
|
||||
Value *A = nullptr, *B = nullptr;
|
||||
if (match(RHS, m_Or(m_Value(A), m_Value(B))) &&
|
||||
(match(LHS, m_And(m_Specific(A), m_Specific(B))) ||
|
||||
match(LHS, m_And(m_Specific(B), m_Specific(A))))) {
|
||||
match(LHS, m_c_And(m_Specific(A), m_Specific(B)))) {
|
||||
auto *New = BinaryOperator::CreateAdd(A, B);
|
||||
New->setHasNoSignedWrap(I.hasNoSignedWrap());
|
||||
New->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
|
||||
@@ -1334,8 +1330,7 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
|
||||
}
|
||||
|
||||
if (match(LHS, m_Or(m_Value(A), m_Value(B))) &&
|
||||
(match(RHS, m_And(m_Specific(A), m_Specific(B))) ||
|
||||
match(RHS, m_And(m_Specific(B), m_Specific(A))))) {
|
||||
match(RHS, m_c_And(m_Specific(A), m_Specific(B)))) {
|
||||
auto *New = BinaryOperator::CreateAdd(A, B);
|
||||
New->setHasNoSignedWrap(I.hasNoSignedWrap());
|
||||
New->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
|
||||
|
||||
Reference in New Issue
Block a user