@@ -487,10 +487,7 @@ namespace {
487
487
SDValue visitFCEIL(SDNode *N);
488
488
SDValue visitFTRUNC(SDNode *N);
489
489
SDValue visitFFLOOR(SDNode *N);
490
- SDValue visitFMINNUM(SDNode *N);
491
- SDValue visitFMAXNUM(SDNode *N);
492
- SDValue visitFMINIMUM(SDNode *N);
493
- SDValue visitFMAXIMUM(SDNode *N);
490
+ SDValue visitFMinMax(SDNode *N);
494
491
SDValue visitBRCOND(SDNode *N);
495
492
SDValue visitBR_CC(SDNode *N);
496
493
SDValue visitLOAD(SDNode *N);
@@ -1701,10 +1698,10 @@ SDValue DAGCombiner::visit(SDNode *N) {
1701
1698
case ISD::FNEG: return visitFNEG(N);
1702
1699
case ISD::FABS: return visitFABS(N);
1703
1700
case ISD::FFLOOR: return visitFFLOOR(N);
1704
- case ISD::FMINNUM: return visitFMINNUM(N);
1705
- case ISD::FMAXNUM: return visitFMAXNUM(N);
1706
- case ISD::FMINIMUM: return visitFMINIMUM(N);
1707
- case ISD::FMAXIMUM: return visitFMAXIMUM (N);
1701
+ case ISD::FMINNUM:
1702
+ case ISD::FMAXNUM:
1703
+ case ISD::FMINIMUM:
1704
+ case ISD::FMAXIMUM: return visitFMinMax (N);
1708
1705
case ISD::FCEIL: return visitFCEIL(N);
1709
1706
case ISD::FTRUNC: return visitFTRUNC(N);
1710
1707
case ISD::BRCOND: return visitBRCOND(N);
@@ -15244,31 +15241,26 @@ SDValue DAGCombiner::visitFNEG(SDNode *N) {
15244
15241
return SDValue();
15245
15242
}
15246
15243
15247
- static SDValue visitFMinMax(SelectionDAG &DAG, SDNode *N,
15248
- APFloat (*Op)(const APFloat &, const APFloat &)) {
15244
+ SDValue DAGCombiner::visitFMinMax(SDNode *N) {
15249
15245
SDValue N0 = N->getOperand(0);
15250
15246
SDValue N1 = N->getOperand(1);
15251
15247
EVT VT = N->getValueType(0);
15252
- const ConstantFPSDNode *N0CFP = isConstOrConstSplatFP(N0);
15253
- const ConstantFPSDNode *N1CFP = isConstOrConstSplatFP(N1);
15254
15248
const SDNodeFlags Flags = N->getFlags();
15255
15249
unsigned Opc = N->getOpcode();
15256
15250
bool PropagatesNaN = Opc == ISD::FMINIMUM || Opc == ISD::FMAXIMUM;
15257
15251
bool IsMin = Opc == ISD::FMINNUM || Opc == ISD::FMINIMUM;
15258
15252
SelectionDAG::FlagInserter FlagsInserter(DAG, N);
15259
15253
15260
- if (N0CFP && N1CFP) {
15261
- const APFloat &C0 = N0CFP->getValueAPF();
15262
- const APFloat &C1 = N1CFP->getValueAPF();
15263
- return DAG.getConstantFP(Op(C0, C1), SDLoc(N), VT);
15264
- }
15254
+ // Constant fold.
15255
+ if (SDValue C = DAG.FoldConstantArithmetic(Opc, SDLoc(N), VT, {N0, N1}))
15256
+ return C;
15265
15257
15266
15258
// Canonicalize to constant on RHS.
15267
15259
if (DAG.isConstantFPBuildVectorOrConstantFP(N0) &&
15268
15260
!DAG.isConstantFPBuildVectorOrConstantFP(N1))
15269
15261
return DAG.getNode(N->getOpcode(), SDLoc(N), VT, N1, N0);
15270
15262
15271
- if (N1CFP) {
15263
+ if (const ConstantFPSDNode * N1CFP = isConstOrConstSplatFP(N1) ) {
15272
15264
const APFloat &AF = N1CFP->getValueAPF();
15273
15265
15274
15266
// minnum(X, nan) -> X
@@ -15300,22 +15292,6 @@ static SDValue visitFMinMax(SelectionDAG &DAG, SDNode *N,
15300
15292
return SDValue();
15301
15293
}
15302
15294
15303
- SDValue DAGCombiner::visitFMINNUM(SDNode *N) {
15304
- return visitFMinMax(DAG, N, minnum);
15305
- }
15306
-
15307
- SDValue DAGCombiner::visitFMAXNUM(SDNode *N) {
15308
- return visitFMinMax(DAG, N, maxnum);
15309
- }
15310
-
15311
- SDValue DAGCombiner::visitFMINIMUM(SDNode *N) {
15312
- return visitFMinMax(DAG, N, minimum);
15313
- }
15314
-
15315
- SDValue DAGCombiner::visitFMAXIMUM(SDNode *N) {
15316
- return visitFMinMax(DAG, N, maximum);
15317
- }
15318
-
15319
15295
SDValue DAGCombiner::visitFABS(SDNode *N) {
15320
15296
SDValue N0 = N->getOperand(0);
15321
15297
EVT VT = N->getValueType(0);
0 commit comments