From aee016b216ca59b7122d87840e5b04fbae1040d7 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Mon, 28 Apr 2025 11:25:31 +0100 Subject: [PATCH 1/2] [VPlan] Add matchers for remaining FP min/max intrinsics (NFC). Add dedicated matchers for minimum,maximum,minimumnum and maximumnum intrinsics, similar for the existing matchers for maxnum and minnum. As suggested in https://github.com/llvm/llvm-project/pull/137335. --- llvm/include/llvm/IR/PatternMatch.h | 24 +++++++++++++++++++ llvm/lib/Analysis/IVDescriptors.cpp | 12 +++++----- .../Transforms/Vectorize/SLPVectorizer.cpp | 12 +++++----- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h index 2d27c19e1b85e..40af76bcaf14e 100644 --- a/llvm/include/llvm/IR/PatternMatch.h +++ b/llvm/include/llvm/IR/PatternMatch.h @@ -2747,12 +2747,36 @@ inline typename m_Intrinsic_Ty::Ty m_FMin(const Opnd0 &Op0, return m_Intrinsic(Op0, Op1); } +template +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_FMax(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..66ed8a036e146 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_FMin(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMin, I); - if (match(I, m_Intrinsic(m_Value(), m_Value()))) + if (match(I, m_FMax(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..5c22039db8746 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_FMax(m_Value(V0), m_Value(V1)))) return true; - if (match(I, m_Intrinsic(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMin(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; From 834d1c4646522901429bdaccfe30b46cc9afb873 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Mon, 28 Apr 2025 20:26:45 +0100 Subject: [PATCH 2/2] !fixup rename Fmin/FMax. --- llvm/include/llvm/IR/PatternMatch.h | 8 ++++---- llvm/lib/Analysis/IVDescriptors.cpp | 4 ++-- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/IR/PatternMatch.h b/llvm/include/llvm/IR/PatternMatch.h index 40af76bcaf14e..46e0994cedc96 100644 --- a/llvm/include/llvm/IR/PatternMatch.h +++ b/llvm/include/llvm/IR/PatternMatch.h @@ -2742,8 +2742,8 @@ 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); } @@ -2760,8 +2760,8 @@ m_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1) { } template -inline typename m_Intrinsic_Ty::Ty m_FMax(const Opnd0 &Op0, - const Opnd1 &Op1) { +inline typename m_Intrinsic_Ty::Ty m_FMaxNum(const Opnd0 &Op0, + const Opnd1 &Op1) { return m_Intrinsic(Op0, Op1); } diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp index 66ed8a036e146..76552e7488eb5 100644 --- a/llvm/lib/Analysis/IVDescriptors.cpp +++ b/llvm/lib/Analysis/IVDescriptors.cpp @@ -784,9 +784,9 @@ 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_FMin(m_Value(), m_Value()))) + if (match(I, m_FMinNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMin, I); - if (match(I, m_FMax(m_Value(), m_Value()))) + if (match(I, m_FMaxNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMax, I); if (match(I, m_FMinimumNum(m_Value(), m_Value()))) return InstDesc(Kind == RecurKind::FMinimumNum, I); diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 5c22039db8746..8e628f2508968 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -23501,9 +23501,9 @@ 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_FMax(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMaxNum(m_Value(V0), m_Value(V1)))) return true; - if (match(I, m_FMin(m_Value(V0), m_Value(V1)))) + if (match(I, m_FMinNum(m_Value(V0), m_Value(V1)))) return true; if (match(I, m_FMaximum(m_Value(V0), m_Value(V1)))) return true;