diff options
-rw-r--r-- | llvm/include/llvm/IR/PatternMatch.h | 8 | ||||
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 3 |
2 files changed, 9 insertions, 2 deletions
diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h index 34f3724805b..0788690fb41 100644 --- a/llvm/include/llvm/IR/PatternMatch.h +++ b/llvm/include/llvm/IR/PatternMatch.h @@ -1348,6 +1348,14 @@ template <typename Val_t> inline Signum_match<Val_t> m_Signum(const Val_t &V) { // Matchers for two-operands operators with the operators in either order // +/// \brief Matches a Add with LHS and RHS in either order. +template<typename LHS, typename RHS> +inline match_combine_or<AnyBinaryOp_match<LHS, RHS>, + AnyBinaryOp_match<RHS, LHS>> +m_c_BinOp(const LHS &L, const RHS &R) { + return m_CombineOr(m_BinOp(L, R), m_BinOp(R, L)); +} + /// \brief Matches an ICmp with a predicate over LHS and RHS in either order. /// Does not swap the predicate. template<typename LHS, typename RHS> diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 9bbc5b281ab..ea8c0a6d38b 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -1272,8 +1272,7 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) { case Instruction::Sub: Value *X; ConstantInt *C1; - if (match(Op0I, m_BinOp(m_ZExt(m_Value(X)), m_ConstantInt(C1))) || - match(Op0I, m_BinOp(m_ConstantInt(C1), m_ZExt(m_Value(X))))) { + if (match(Op0I, m_c_BinOp(m_ZExt(m_Value(X)), m_ConstantInt(C1)))) { if (AndRHSMask.isIntN(X->getType()->getScalarSizeInBits())) { auto *TruncC1 = ConstantExpr::getTrunc(C1, X->getType()); Value *BinOp; |