[llvm] [AMDGPU][NFC] Utilize Promote action for FMINIMUM/MAX f16 (PR #215678)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 12 06:18:58 PDT 2026
https://github.com/LU-JOHN updated https://github.com/llvm/llvm-project/pull/215678
>From 2060e4e2bbdefe99f87c390bba962f10a37c48f5 Mon Sep 17 00:00:00 2001
From: John Lu <John.Lu at amd.com>
Date: Tue, 11 Aug 2026 16:44:24 -0500
Subject: [PATCH] Utilize Promote action for FMINIMUM/MAX f16
Signed-off-by: John Lu <John.Lu at amd.com>
---
llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 37 +++--------------------
llvm/lib/Target/AMDGPU/SIISelLowering.h | 1 -
2 files changed, 4 insertions(+), 34 deletions(-)
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
index 939a90b7d2461..08fbc76d62275 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp
@@ -998,7 +998,8 @@ SITargetLowering::SITargetLowering(const TargetMachine &TM,
// If only the vector form is available, we need to widen to a vector.
if (!Subtarget->hasMinimum3Maximum3F16())
- setOperationAction({ISD::FMAXIMUM, ISD::FMINIMUM}, MVT::f16, Custom);
+ setOperationPromotedToType({ISD::FMAXIMUM, ISD::FMINIMUM}, MVT::f16,
+ MVT::v2f16);
}
}
@@ -7759,9 +7760,6 @@ SDValue SITargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
case ISD::FMINIMUMNUM:
case ISD::FMAXIMUMNUM:
return lowerFMINIMUMNUM_FMAXIMUMNUM(Op, DAG);
- case ISD::FMINIMUM:
- case ISD::FMAXIMUM:
- return lowerFMINIMUM_FMAXIMUM(Op, DAG);
case ISD::FLDEXP:
case ISD::STRICT_FLDEXP:
return lowerFLDEXP(Op, DAG);
@@ -7786,6 +7784,8 @@ SDValue SITargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {
case ISD::UMAX:
case ISD::FMINNUM_IEEE:
case ISD::FMAXNUM_IEEE:
+ case ISD::FMINIMUM:
+ case ISD::FMAXIMUM:
case ISD::UADDSAT:
case ISD::USUBSAT:
case ISD::SADDSAT:
@@ -8898,35 +8898,6 @@ SITargetLowering::lowerFMINIMUMNUM_FMAXIMUMNUM(SDValue Op,
return Op;
}
-SDValue SITargetLowering::lowerFMINIMUM_FMAXIMUM(SDValue Op,
- SelectionDAG &DAG) const {
- EVT VT = Op.getValueType();
- if (VT.isVector())
- return splitBinaryVectorOp(Op, DAG);
-
- assert(!Subtarget->hasIEEEMinimumMaximumInsts() &&
- !Subtarget->hasMinimum3Maximum3F16() &&
- Subtarget->hasMinimum3Maximum3PKF16() && VT == MVT::f16 &&
- "should not need to widen f16 minimum/maximum to v2f16");
-
- // Widen f16 operation to v2f16
-
- // fminimum f16:x, f16:y ->
- // extract_vector_elt (fminimum (v2f16 (scalar_to_vector x))
- // (v2f16 (scalar_to_vector y))), 0
- SDLoc SL(Op);
- SDValue WideSrc0 =
- DAG.getNode(ISD::SCALAR_TO_VECTOR, SL, MVT::v2f16, Op.getOperand(0));
- SDValue WideSrc1 =
- DAG.getNode(ISD::SCALAR_TO_VECTOR, SL, MVT::v2f16, Op.getOperand(1));
-
- SDValue Widened =
- DAG.getNode(Op.getOpcode(), SL, MVT::v2f16, WideSrc0, WideSrc1);
-
- return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SL, MVT::f16, Widened,
- DAG.getConstant(0, SL, MVT::i32));
-}
-
SDValue SITargetLowering::lowerFLDEXP(SDValue Op, SelectionDAG &DAG) const {
bool IsStrict = Op.getOpcode() == ISD::STRICT_FLDEXP;
EVT VT = Op.getValueType();
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.h b/llvm/lib/Target/AMDGPU/SIISelLowering.h
index 4e667b70fdc91..3f5b03d631c48 100644
--- a/llvm/lib/Target/AMDGPU/SIISelLowering.h
+++ b/llvm/lib/Target/AMDGPU/SIISelLowering.h
@@ -171,7 +171,6 @@ class SITargetLowering final : public AMDGPUTargetLowering {
SDValue splitFP_ROUNDVectorOp(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFMINNUM_FMAXNUM(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFMINIMUMNUM_FMAXIMUMNUM(SDValue Op, SelectionDAG &DAG) const;
- SDValue lowerFMINIMUM_FMAXIMUM(SDValue Op, SelectionDAG &DAG) const;
SDValue lowerFLDEXP(SDValue Op, SelectionDAG &DAG) const;
SDValue promoteUniformOpToI32(SDValue Op, DAGCombinerInfo &DCI) const;
SDValue promoteUniformUnaryOpToI32(SDValue Op, DAGCombinerInfo &DCI) const;
More information about the llvm-commits
mailing list