diff options
Diffstat (limited to 'contrib/llvm-project/llvm/include/llvm/IR/PatternMatch.h')
-rw-r--r-- | contrib/llvm-project/llvm/include/llvm/IR/PatternMatch.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/include/llvm/IR/PatternMatch.h b/contrib/llvm-project/llvm/include/llvm/IR/PatternMatch.h index 096d1688af3f..48afdb867ba6 100644 --- a/contrib/llvm-project/llvm/include/llvm/IR/PatternMatch.h +++ b/contrib/llvm-project/llvm/include/llvm/IR/PatternMatch.h @@ -1656,6 +1656,19 @@ template <typename Op_t> struct PtrToIntSameSize_match { } }; +template <typename Op_t> struct NNegZExt_match { + Op_t Op; + + NNegZExt_match(const Op_t &OpMatch) : Op(OpMatch) {} + + template <typename OpTy> bool match(OpTy *V) { + if (auto *I = dyn_cast<Instruction>(V)) + return I->getOpcode() == Instruction::ZExt && I->hasNonNeg() && + Op.match(I->getOperand(0)); + return false; + } +}; + /// Matches BitCast. template <typename OpTy> inline CastOperator_match<OpTy, Instruction::BitCast> @@ -1708,6 +1721,11 @@ inline CastInst_match<OpTy, Instruction::ZExt> m_ZExt(const OpTy &Op) { } template <typename OpTy> +inline NNegZExt_match<OpTy> m_NNegZExt(const OpTy &Op) { + return NNegZExt_match<OpTy>(Op); +} + +template <typename OpTy> inline match_combine_or<CastInst_match<OpTy, Instruction::ZExt>, OpTy> m_ZExtOrSelf(const OpTy &Op) { return m_CombineOr(m_ZExt(Op), Op); @@ -1719,6 +1737,14 @@ m_SExtOrSelf(const OpTy &Op) { return m_CombineOr(m_SExt(Op), Op); } +/// Match either "sext" or "zext nneg". +template <typename OpTy> +inline match_combine_or<CastInst_match<OpTy, Instruction::SExt>, + NNegZExt_match<OpTy>> +m_SExtLike(const OpTy &Op) { + return m_CombineOr(m_SExt(Op), m_NNegZExt(Op)); +} + template <typename OpTy> inline match_combine_or<CastInst_match<OpTy, Instruction::ZExt>, CastInst_match<OpTy, Instruction::SExt>> |