[llvm] [AMDGPU][NFC] Utilize Promote action for FMINIMUM/MAX f16 (PR #215678)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 14:57:09 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-amdgpu
Author: LU-JOHN
<details>
<summary>Changes</summary>
Utilize Promote action to convert f16 FMINIMUM/FMAXIMUM to use v2f16. Custom lowering is no longer needed.
Support for Promote from scalar to vector was added in https://github.com/llvm/llvm-project/pull/215042.
---
Full diff: https://github.com/llvm/llvm-project/pull/215678.diff
2 Files Affected:
- (modified) llvm/lib/Target/AMDGPU/SIISelLowering.cpp (+4-33)
- (modified) llvm/lib/Target/AMDGPU/SIISelLowering.h (-1)
``````````diff
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;
``````````
</details>
https://github.com/llvm/llvm-project/pull/215678
More information about the llvm-commits
mailing list