[llvm] SelectionDAG: Support FMINIMUMNUM and FMINIMUM in combineMinNumMaxNumImpl (PR #137449)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 13 02:54:19 PST 2025
================
@@ -11919,38 +11928,70 @@ static SDValue combineMinNumMaxNumImpl(const SDLoc &DL, EVT VT, SDValue LHS,
const TargetLowering &TLI,
SelectionDAG &DAG) {
EVT TransformVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
+ unsigned IEEE2019NumOpcode = 0;
+ unsigned IEEE2019Opcode = 0;
+ unsigned IEEEOpcode = 0;
+ unsigned Opcode = 0;
switch (CC) {
case ISD::SETOLT:
case ISD::SETOLE:
case ISD::SETLT:
case ISD::SETLE:
case ISD::SETULT:
case ISD::SETULE: {
- // Since it's known never nan to get here already, either fminnum or
- // fminnum_ieee are OK. Try the ieee version first, since it's fminnum is
- // expanded in terms of it.
- unsigned IEEEOpcode = (LHS == True) ? ISD::FMINNUM_IEEE : ISD::FMAXNUM_IEEE;
- if (TLI.isOperationLegalOrCustom(IEEEOpcode, VT))
- return DAG.getNode(IEEEOpcode, DL, VT, LHS, RHS);
-
- unsigned Opcode = (LHS == True) ? ISD::FMINNUM : ISD::FMAXNUM;
- if (TLI.isOperationLegalOrCustom(Opcode, TransformVT))
- return DAG.getNode(Opcode, DL, VT, LHS, RHS);
- return SDValue();
+ // Since it's known never nan to get here already, either fminimumnum,
+ // fminimum, fminnum, or fminnum_ieee are OK. Try Legal first and then
+ // Custom.
+ IEEE2019NumOpcode = LHS == True ? ISD::FMINIMUMNUM : ISD::FMAXIMUMNUM;
+ IEEE2019Opcode = LHS == True ? ISD::FMINIMUM : ISD::FMAXIMUM;
+ IEEEOpcode = LHS == True ? ISD::FMINNUM_IEEE : ISD::FMAXNUM_IEEE;
+ Opcode = LHS == True ? ISD::FMINNUM : ISD::FMAXNUM;
}
+ [[fallthrough]];
case ISD::SETOGT:
case ISD::SETOGE:
case ISD::SETGT:
case ISD::SETGE:
case ISD::SETUGT:
case ISD::SETUGE: {
- unsigned IEEEOpcode = (LHS == True) ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
- if (TLI.isOperationLegalOrCustom(IEEEOpcode, VT))
+ if (Opcode == 0) {
+ // Since it's known never nan to get here already, either fminimumnum,
+ // fminimum, fminnum, or fminnum_ieee are OK. Try Legal first and then
+ // Custom.
+ IEEE2019NumOpcode = (LHS == True) ? ISD::FMAXIMUMNUM : ISD::FMINIMUMNUM;
+ IEEE2019Opcode = (LHS == True) ? ISD::FMAXIMUM : ISD::FMINIMUM;
+ IEEEOpcode = (LHS == True) ? ISD::FMAXNUM_IEEE : ISD::FMINNUM_IEEE;
+ Opcode = (LHS == True) ? ISD::FMAXNUM : ISD::FMINNUM;
+ }
+ // Try FMINIMUM/FMAXIMUM first as it has smaller codesize on AMDGPU GFX12.
+ if (TLI.isOperationLegal(IEEE2019Opcode, VT))
+ return DAG.getNode(IEEE2019Opcode, DL, VT, LHS, RHS);
+ if (TLI.isOperationLegal(IEEE2019NumOpcode, VT))
+ return DAG.getNode(IEEE2019NumOpcode, DL, VT, LHS, RHS);
+ if (TLI.isOperationLegal(IEEEOpcode, VT))
return DAG.getNode(IEEEOpcode, DL, VT, LHS, RHS);
+ if (TLI.isOperationLegal(Opcode, VT))
+ return DAG.getNode(Opcode, DL, VT, LHS, RHS);
----------------
arsenm wrote:
This should also probably be a separate helper function (could probably share it with the one above, if you made it return the next available opcode)
https://github.com/llvm/llvm-project/pull/137449
More information about the llvm-commits
mailing list