[llvm] [IR] Add matchers for remaining FP min/max intrinsics (NFC). (PR #137612)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 28 12:27:32 PDT 2025
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/137612
>From aee016b216ca59b7122d87840e5b04fbae1040d7 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
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<Opnd0, Opnd1>::Ty m_FMin(const Opnd0 &Op0,
return m_Intrinsic<Intrinsic::minnum>(Op0, Op1);
}
+template <typename Opnd0, typename Opnd1>
+inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMinimum(const Opnd0 &Op0,
+ const Opnd1 &Op1) {
+ return m_Intrinsic<Intrinsic::minimum>(Op0, Op1);
+}
+
+template <typename Opnd0, typename Opnd1>
+inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty
+m_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1) {
+ return m_Intrinsic<Intrinsic::minimumnum>(Op0, Op1);
+}
+
template <typename Opnd0, typename Opnd1>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMax(const Opnd0 &Op0,
const Opnd1 &Op1) {
return m_Intrinsic<Intrinsic::maxnum>(Op0, Op1);
}
+template <typename Opnd0, typename Opnd1>
+inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMaximum(const Opnd0 &Op0,
+ const Opnd1 &Op1) {
+ return m_Intrinsic<Intrinsic::maximum>(Op0, Op1);
+}
+
+template <typename Opnd0, typename Opnd1>
+inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty
+m_FMaximumNum(const Opnd0 &Op0, const Opnd1 &Op1) {
+ return m_Intrinsic<Intrinsic::maximumnum>(Op0, Op1);
+}
+
template <typename Opnd0, typename Opnd1, typename Opnd2>
inline typename m_Intrinsic_Ty<Opnd0, Opnd1, Opnd2>::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<Intrinsic::minnum>(m_Value(), m_Value())))
+ if (match(I, m_FMin(m_Value(), m_Value())))
return InstDesc(Kind == RecurKind::FMin, I);
- if (match(I, m_Intrinsic<Intrinsic::maxnum>(m_Value(), m_Value())))
+ if (match(I, m_FMax(m_Value(), m_Value())))
return InstDesc(Kind == RecurKind::FMax, I);
- if (match(I, m_Intrinsic<Intrinsic::minimumnum>(m_Value(), m_Value())))
+ if (match(I, m_FMinimumNum(m_Value(), m_Value())))
return InstDesc(Kind == RecurKind::FMinimumNum, I);
- if (match(I, m_Intrinsic<Intrinsic::maximumnum>(m_Value(), m_Value())))
+ if (match(I, m_FMaximumNum(m_Value(), m_Value())))
return InstDesc(Kind == RecurKind::FMaximumNum, I);
- if (match(I, m_Intrinsic<Intrinsic::minimum>(m_Value(), m_Value())))
+ if (match(I, m_FMinimum(m_Value(), m_Value())))
return InstDesc(Kind == RecurKind::FMinimum, I);
- if (match(I, m_Intrinsic<Intrinsic::maximum>(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<Intrinsic::minnum>(m_Value(), m_Value())))
return RecurKind::FMin;
- if (match(I, m_Intrinsic<Intrinsic::maximum>(m_Value(), m_Value())))
+ if (match(I, m_FMaximum(m_Value(), m_Value())))
return RecurKind::FMaximum;
- if (match(I, m_Intrinsic<Intrinsic::minimum>(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<Intrinsic::maxnum>(m_Value(V0), m_Value(V1))))
+ if (match(I, m_FMax(m_Value(V0), m_Value(V1))))
return true;
- if (match(I, m_Intrinsic<Intrinsic::minnum>(m_Value(V0), m_Value(V1))))
+ if (match(I, m_FMin(m_Value(V0), m_Value(V1))))
return true;
- if (match(I, m_Intrinsic<Intrinsic::maximum>(m_Value(V0), m_Value(V1))))
+ if (match(I, m_FMaximum(m_Value(V0), m_Value(V1))))
return true;
- if (match(I, m_Intrinsic<Intrinsic::minimum>(m_Value(V0), m_Value(V1))))
+ if (match(I, m_FMinimum(m_Value(V0), m_Value(V1))))
return true;
if (match(I, m_Intrinsic<Intrinsic::smax>(m_Value(V0), m_Value(V1))))
return true;
>From 834d1c4646522901429bdaccfe30b46cc9afb873 Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
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<Opnd0>::Ty m_FCanonicalize(const Opnd0 &Op0) {
}
template <typename Opnd0, typename Opnd1>
-inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMin(const Opnd0 &Op0,
- const Opnd1 &Op1) {
+inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMinNum(const Opnd0 &Op0,
+ const Opnd1 &Op1) {
return m_Intrinsic<Intrinsic::minnum>(Op0, Op1);
}
@@ -2760,8 +2760,8 @@ m_FMinimumNum(const Opnd0 &Op0, const Opnd1 &Op1) {
}
template <typename Opnd0, typename Opnd1>
-inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMax(const Opnd0 &Op0,
- const Opnd1 &Op1) {
+inline typename m_Intrinsic_Ty<Opnd0, Opnd1>::Ty m_FMaxNum(const Opnd0 &Op0,
+ const Opnd1 &Op1) {
return m_Intrinsic<Intrinsic::maxnum>(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;
More information about the llvm-commits
mailing list