[llvm] [NVPTX] Add 3-operand fmin/fmax DAGCombines (PR #159729)
Lewis Crawford via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 19 06:41:59 PDT 2025
================
@@ -5316,6 +5320,56 @@ static SDValue PerformFADDCombine(SDNode *N,
return PerformFADDCombineWithOperands(N, N1, N0, DCI, OptLevel);
}
+/// Get 3-input version of a 2-input min/max opcode
+static NVPTXISD::NodeType getMinMax3Opcode(unsigned MinMax2Opcode) {
+ switch (MinMax2Opcode) {
+ case ISD::FMAXNUM:
+ case ISD::FMAXIMUMNUM:
+ return NVPTXISD::FMAXNUM3;
+ case ISD::FMINNUM:
+ case ISD::FMINIMUMNUM:
+ return NVPTXISD::FMINNUM3;
+ case ISD::FMAXIMUM:
+ return NVPTXISD::FMAXIMUM3;
+ case ISD::FMINIMUM:
+ return NVPTXISD::FMINIMUM3;
+ default:
+ llvm_unreachable("Invalid 2-input min/max opcode");
+ }
+}
+
+/// PerformFMinMaxCombine - Combine (fmaxnum (fmaxnum a, b), c) into
+/// (fmaxnum3 a, b, c). Also covers other llvm min/max intrinsics.
+static SDValue PerformFMinMaxCombine(SDNode *N,
+ TargetLowering::DAGCombinerInfo &DCI,
+ unsigned PTXVersion, unsigned SmVersion) {
+
+ // 3-input min/max requires PTX 8.8+ and SM_100+, and only supports f32s
+ EVT VT = N->getValueType(0);
+ if (VT != MVT::f32 || PTXVersion < 88 || SmVersion < 100)
+ return SDValue();
+
+ SDValue Op0 = N->getOperand(0);
+ SDValue Op1 = N->getOperand(1);
+ unsigned MinMaxOp2 = N->getOpcode();
+ NVPTXISD::NodeType MinMaxOp3 = getMinMax3Opcode(MinMaxOp2);
+
+ if (Op0.getOpcode() == MinMaxOp2 && Op0.hasOneUse()) {
+ // (maxnum (maxnum a, b), c) -> (maxnum3 a, b, c)
+ SDValue A = Op0.getOperand(0);
+ SDValue B = Op0.getOperand(1);
+ SDValue C = Op1;
+ return DCI.DAG.getNode(MinMaxOp3, SDLoc(N), VT, A, B, C, N->getFlags());
+ } else if (Op1->getOpcode() == MinMaxOp2 && Op1->hasOneUse()) {
----------------
LewisCrawford wrote:
There was no good reason, so I've changed it to use `.` in both places now.
Both `->` and `.` are equivalent in this case, as `*` returns the inner SDNode from an SDValue, and `getOperand` on an SDValue just calls `getOperand` on the inner SDNode anyway, but I've changed it to use the same approach everywhere now for consistency.
https://github.com/llvm/llvm-project/pull/159729
More information about the llvm-commits
mailing list