diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h index 2d27c19e1b85e..46e0994cedc96 100644 --- a/llvm/include/llvm/IR/PatternMatch.h +++ b/llvm/include/llvm/IR/PatternMatch.h @@ -2742,17 +2742,41 @@ inline typename m_Intrinsic_Ty::Ty m_FCanonicalize(const Opnd0 &Op0) { } template -inline typename m_Intrinsic_Ty::Ty m_FMin(const Opnd0 &Op0, - const Opnd1 &Op1) { +inline typename m_Intrinsic_Ty::Ty m_FMinNum(const Opnd0 &Op0, + const Opnd1 &Op1) { return m_Intrinsic(Op0, Op1); } template -inline typename m_Intrinsic_Ty::Ty m_FMax(const Opnd0 &Op0, - const Opnd1 &Op1) { +inline typename m_Intrinsic_Ty::Ty m_FMinimum(const Opnd0 &Op0, + const Opnd1 &Op1) { + return m_Intrinsic(Op0, Op1); +} + +template +inline typename m_Intrinsic_Ty::Ty +m_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1) { + return m_Intrinsic(Op0, Op1); +} + +template +inline typename m_Intrinsic_Ty::Ty m_FMaxNum(const Opnd0 &Op0, + const Opnd1 &Op1) { return m_Intrinsic(Op0, Op1); } +template +inline typename m_Intrinsic_Ty::Ty m_FMaximum(const Opnd0 &Op0, + const Opnd1 &Op1) { + return m_Intrinsic(Op0, Op1); +} + +template +inline typename m_Intrinsic_Ty::Ty +m_FMaximumNum(const Opnd0 &Op0, const Opnd1 &Op1) { + return m_Intrinsic(Op0, Op1); +} + template inline typename m_Intrinsic_Ty::Ty m_FShl(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2) { diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp index e7e0bef048f71..76552e7488eb5 100644 --- a/llvm/lib/Analysis/IVDescriptors.cpp +++ b/llvm/lib/Analysis/IVDescriptors.cpp @@ -784,17 +784,17 @@ RecurrenceDescriptor::isMinMaxPattern(Instruction *I, RecurKind Kind, return InstDesc(Kind == RecurKind::FMin, I); if (match(I, m_OrdOrUnordFMax(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMax, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMinNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMin, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMaxNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMax, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMinimumNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMinimumNum, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMaximumNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMaximumNum, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMinimum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMinimum, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMaximum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMaximum, I); return InstDesc(false, I); diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 26b5982f5bb18..8e628f2508968 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -21851,9 +21851,9 @@ class HorizontalReduction { if (match(I, m_Intrinsic(m_Value(), m_Value()))) return RecurKind::FMin; - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMaximum(m_Value(), m_Value()))) return RecurKind::FMaximum; - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMinimum(m_Value(), m_Value()))) return RecurKind::FMinimum; // This matches either cmp+select or intrinsics. SLP is expected to handle // either form. @@ -23501,13 +23501,13 @@ static Instruction *getReductionInstr(const DominatorTree *DT, PHINode *P, static bool matchRdxBop(Instruction *I, Value *&V0, Value *&V1) { if (match(I, m_BinOp(m_Value(V0), m_Value(V1)))) return true; - if (match(I, m_Intrinsic(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMaxNum(m_Value(V0), m_Value(V1)))) return true; - if (match(I, m_Intrinsic(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMinNum(m_Value(V0), m_Value(V1)))) return true; - if (match(I, m_Intrinsic(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMaximum(m_Value(V0), m_Value(V1)))) return true; - if (match(I, m_Intrinsic(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMinimum(m_Value(V0), m_Value(V1)))) return true; if (match(I, m_Intrinsic(m_Value(V0), m_Value(V1)))) return true;