Skip to content

Commit edc15e0

Browse files
committed
[FPEnv][SDAG] Implement FNEARBYINT with optional chain
This change replaces the DAG node STRICT_FNEARBYINT with a modified FNEARBYINT, which uses optional chain property. The modified node can be used in both strictfp and default environments. This approach is based on the assumption that a floating-point operation is fundamentally the same in strictfp and default environments and is therefore lowered in almost identical manner. Indeed, all targets but one lower STRICT_FNEARBYINT using the same action as for FNEARBYINT. The only exception is PowerPC: it lowers STRICT_FNEARBYINT for vector types using `Expand`, even though FNEARBYINT for v4f32 and v2f64 is legal. This change implements the lowering uniformly, treating these vector types as legal for PowePC target. The change demonstrate the transition from using separate nodes for strictfp and default environments to using a single node with an optional chain. It also modifies some methods of DAG functions required to support such nodes.
1 parent 3ebfbac commit edc15e0

28 files changed

+335
-345
lines changed

llvm/include/llvm/CodeGen/ISDOpcodes.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,6 @@ enum NodeType {
448448
STRICT_FLOG10,
449449
STRICT_FLOG2,
450450
STRICT_FRINT,
451-
STRICT_FNEARBYINT,
452451
STRICT_FMAXNUM,
453452
STRICT_FMINNUM,
454453
STRICT_FCEIL,

llvm/include/llvm/CodeGen/TargetLowering.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,8 @@ class LLVM_ABI TargetLoweringBase {
13411341
unsigned EqOpc;
13421342
switch (Op) {
13431343
default: llvm_unreachable("Unexpected FP pseudo-opcode");
1344+
#define FP_OPERATION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
1345+
case ISD::DAGN: EqOpc = ISD::DAGN; break;
13441346
#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
13451347
case ISD::STRICT_##DAGN: EqOpc = ISD::DAGN; break;
13461348
#define CMP_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \

llvm/include/llvm/IR/ConstrainedOps.def

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
#define CMP_INSTRUCTION(N,A,R,I,D) DAG_INSTRUCTION(N,A,R,I,D)
4040
#endif
4141

42+
// FP_OPERATION is same as DAG_FUNCTION, but in DAG it is represented by the
43+
// same node, as non-constrained function.
44+
#ifndef FP_OPERATION
45+
#define FP_OPERATION(N,A,R,I,D) DAG_FUNCTION(N,A,R,I,D)
46+
#endif
47+
4248
// Arguments of the entries are:
4349
// - instruction or intrinsic function name.
4450
// - Number of original instruction/intrinsic arguments.
@@ -91,7 +97,7 @@ DAG_FUNCTION(maxnum, 2, 0, experimental_constrained_maxnum, FMAXNUM
9197
DAG_FUNCTION(minnum, 2, 0, experimental_constrained_minnum, FMINNUM)
9298
DAG_FUNCTION(maximum, 2, 0, experimental_constrained_maximum, FMAXIMUM)
9399
DAG_FUNCTION(minimum, 2, 0, experimental_constrained_minimum, FMINIMUM)
94-
DAG_FUNCTION(nearbyint, 1, 1, experimental_constrained_nearbyint, FNEARBYINT)
100+
FP_OPERATION(nearbyint, 1, 1, experimental_constrained_nearbyint, FNEARBYINT)
95101
DAG_FUNCTION(pow, 2, 1, experimental_constrained_pow, FPOW)
96102
DAG_FUNCTION(powi, 2, 1, experimental_constrained_powi, FPOWI)
97103
DAG_FUNCTION(ldexp, 2, 1, experimental_constrained_ldexp, FLDEXP)
@@ -114,3 +120,4 @@ FUNCTION(fmuladd, 3, 1, experimental_constrained_fmuladd)
114120
#undef CMP_INSTRUCTION
115121
#undef DAG_INSTRUCTION
116122
#undef DAG_FUNCTION
123+
#undef FP_OPERATION

llvm/include/llvm/Target/TargetSelectionDAG.td

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -575,7 +575,7 @@ def frint : SDNode<"ISD::FRINT" , SDTFPUnaryOp>;
575575
def ftrunc : SDNode<"ISD::FTRUNC" , SDTFPUnaryOp>;
576576
def fceil : SDNode<"ISD::FCEIL" , SDTFPUnaryOp>;
577577
def ffloor : SDNode<"ISD::FFLOOR" , SDTFPUnaryOp>;
578-
def fnearbyint : SDNode<"ISD::FNEARBYINT" , SDTFPUnaryOp>;
578+
def fnearbyint : SDNode<"ISD::FNEARBYINT" , SDTFPUnaryOp, [SDNPMayHaveChain]>;
579579
def fround : SDNode<"ISD::FROUND" , SDTFPUnaryOp>;
580580
def froundeven : SDNode<"ISD::FROUNDEVEN" , SDTFPUnaryOp>;
581581

@@ -653,8 +653,6 @@ def strict_lrint : SDNode<"ISD::STRICT_LRINT",
653653
SDTFPToIntOp, [SDNPHasChain]>;
654654
def strict_llrint : SDNode<"ISD::STRICT_LLRINT",
655655
SDTFPToIntOp, [SDNPHasChain]>;
656-
def strict_fnearbyint : SDNode<"ISD::STRICT_FNEARBYINT",
657-
SDTFPUnaryOp, [SDNPHasChain]>;
658656
def strict_fceil : SDNode<"ISD::STRICT_FCEIL",
659657
SDTFPUnaryOp, [SDNPHasChain]>;
660658
def strict_ffloor : SDNode<"ISD::STRICT_FFLOOR",
@@ -1704,9 +1702,6 @@ def any_lrint : PatFrags<(ops node:$src),
17041702
def any_llrint : PatFrags<(ops node:$src),
17051703
[(strict_llrint node:$src),
17061704
(llrint node:$src)]>;
1707-
def any_fnearbyint : PatFrags<(ops node:$src),
1708-
[(strict_fnearbyint node:$src),
1709-
(fnearbyint node:$src)]>;
17101705
def any_fceil : PatFrags<(ops node:$src),
17111706
[(strict_fceil node:$src),
17121707
(fceil node:$src)]>;

llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2196,7 +2196,7 @@ void SelectionDAGLegalize::ExpandFPLibCall(SDNode* Node,
21962196
if (LC == RTLIB::UNKNOWN_LIBCALL)
21972197
llvm_unreachable("Can't create an unknown libcall!");
21982198

2199-
if (Node->isStrictFPOpcode()) {
2199+
if (Node->isStrictFPOpcode() || (Node->hasChain() && Node->isFPOperation())) {
22002200
EVT RetVT = Node->getValueType(0);
22012201
SmallVector<SDValue, 4> Ops(drop_begin(Node->ops()));
22022202
TargetLowering::MakeLibCallOptions CallOptions;
@@ -4791,7 +4791,6 @@ void SelectionDAGLegalize::ConvertNodeToLibcall(SDNode *Node) {
47914791
RTLIB::RINT_PPCF128, Results);
47924792
break;
47934793
case ISD::FNEARBYINT:
4794-
case ISD::STRICT_FNEARBYINT:
47954794
ExpandFPLibCall(Node, RTLIB::NEARBYINT_F32,
47964795
RTLIB::NEARBYINT_F64,
47974796
RTLIB::NEARBYINT_F80,
@@ -5760,7 +5759,6 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
57605759
case ISD::FFLOOR:
57615760
case ISD::FCEIL:
57625761
case ISD::FRINT:
5763-
case ISD::FNEARBYINT:
57645762
case ISD::FROUND:
57655763
case ISD::FROUNDEVEN:
57665764
case ISD::FTRUNC:
@@ -5792,7 +5790,6 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
57925790
case ISD::STRICT_FFLOOR:
57935791
case ISD::STRICT_FCEIL:
57945792
case ISD::STRICT_FRINT:
5795-
case ISD::STRICT_FNEARBYINT:
57965793
case ISD::STRICT_FROUND:
57975794
case ISD::STRICT_FROUNDEVEN:
57985795
case ISD::STRICT_FTRUNC:
@@ -5821,6 +5818,25 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
58215818
Results.push_back(Tmp3);
58225819
Results.push_back(Tmp3.getValue(1));
58235820
break;
5821+
case ISD::FNEARBYINT:
5822+
if (Node->hasChain()) {
5823+
Tmp1 = DAG.getNode(ISD::STRICT_FP_EXTEND, dl, {NVT, MVT::Other},
5824+
{Node->getOperand(0), Node->getOperand(1)});
5825+
Tmp2 = DAG.getNode(Node->getOpcode(), dl, {NVT, MVT::Other},
5826+
{Tmp1.getValue(1), Tmp1});
5827+
Tmp3 = DAG.getNode(ISD::STRICT_FP_ROUND, dl, {OVT, MVT::Other},
5828+
{Tmp2.getValue(1), Tmp2,
5829+
DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)});
5830+
Results.push_back(Tmp3);
5831+
Results.push_back(Tmp3.getValue(1));
5832+
} else {
5833+
Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
5834+
Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
5835+
Results.push_back(
5836+
DAG.getNode(ISD::FP_ROUND, dl, OVT, Tmp2,
5837+
DAG.getIntPtrConstant(0, dl, /*isTarget=*/true)));
5838+
}
5839+
break;
58245840
case ISD::BUILD_VECTOR: {
58255841
MVT EltVT = OVT.getVectorElementType();
58265842
MVT NewEltVT = NVT.getVectorElementType();

llvm/lib/CodeGen/SelectionDAG/LegalizeFloatTypes.cpp

Lines changed: 108 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ void DAGTypeLegalizer::SoftenFloatResult(SDNode *N, unsigned ResNo) {
115115
case ISD::FMA: R = SoftenFloatRes_FMA(N); break;
116116
case ISD::STRICT_FMUL:
117117
case ISD::FMUL: R = SoftenFloatRes_FMUL(N); break;
118-
case ISD::STRICT_FNEARBYINT:
119118
case ISD::FNEARBYINT: R = SoftenFloatRes_FNEARBYINT(N); break;
120119
case ISD::FNEG: R = SoftenFloatRes_FNEG(N); break;
121120
case ISD::STRICT_FP_EXTEND:
@@ -227,6 +226,32 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_Binary(SDNode *N, RTLIB::Libcall LC) {
227226
return Tmp.first;
228227
}
229228

229+
SDValue DAGTypeLegalizer::SoftenFloatRes_FPOperation(SDNode *N,
230+
RTLIB::Libcall LC) {
231+
bool HasChain = N->hasChain();
232+
assert(N->getNumValues() == 1 + HasChain &&
233+
"multiple result is not supported yet");
234+
SDValue Chain = HasChain ? N->getOperand(0) : SDValue();
235+
SmallVector<SDValue, 4> Ops;
236+
SmallVector<EVT, 4> OpsVT;
237+
238+
for (unsigned i = HasChain, e = N->getNumOperands(); i != e; ++i) {
239+
SDValue Op = N->getOperand(i);
240+
OpsVT.push_back(Op.getValueType());
241+
Op = GetSoftenedFloat(Op);
242+
Ops.push_back(Op);
243+
}
244+
245+
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
246+
TargetLowering::MakeLibCallOptions CallOptions;
247+
CallOptions.setTypeListBeforeSoften(OpsVT, N->getValueType(0));
248+
std::pair<SDValue, SDValue> Tmp =
249+
TLI.makeLibCall(DAG, LC, NVT, Ops, CallOptions, SDLoc(N), Chain);
250+
if (HasChain)
251+
ReplaceValueWith(SDValue(N, 1), Tmp.second);
252+
return Tmp.first;
253+
}
254+
230255
SDValue DAGTypeLegalizer::SoftenFloatRes_BITCAST(SDNode *N) {
231256
return BitConvertToInteger(N->getOperand(0));
232257
}
@@ -582,7 +607,7 @@ SDValue DAGTypeLegalizer::SoftenFloatRes_FMUL(SDNode *N) {
582607
}
583608

584609
SDValue DAGTypeLegalizer::SoftenFloatRes_FNEARBYINT(SDNode *N) {
585-
return SoftenFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
610+
return SoftenFloatRes_FPOperation(N, GetFPLibCall(N->getValueType(0),
586611
RTLIB::NEARBYINT_F32,
587612
RTLIB::NEARBYINT_F64,
588613
RTLIB::NEARBYINT_F80,
@@ -1596,7 +1621,6 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
15961621
case ISD::FMA: ExpandFloatRes_FMA(N, Lo, Hi); break;
15971622
case ISD::STRICT_FMUL:
15981623
case ISD::FMUL: ExpandFloatRes_FMUL(N, Lo, Hi); break;
1599-
case ISD::STRICT_FNEARBYINT:
16001624
case ISD::FNEARBYINT: ExpandFloatRes_FNEARBYINT(N, Lo, Hi); break;
16011625
case ISD::FNEG: ExpandFloatRes_FNEG(N, Lo, Hi); break;
16021626
case ISD::STRICT_FP_EXTEND:
@@ -1688,6 +1712,21 @@ void DAGTypeLegalizer::ExpandFloatRes_Binary(SDNode *N, RTLIB::Libcall LC,
16881712
GetPairElements(Tmp.first, Lo, Hi);
16891713
}
16901714

1715+
void DAGTypeLegalizer::ExpandFloatRes_FPOperation(SDNode *N, RTLIB::Libcall LC,
1716+
SDValue &Lo, SDValue &Hi) {
1717+
bool HasChain = N->hasChain();
1718+
SDValue Chain = HasChain ? N->getOperand(0) : SDValue();
1719+
assert(N->getNumValues() == 1 + HasChain &&
1720+
"multiple result is not supported yet");
1721+
SmallVector<SDValue, 4> Ops(HasChain ? llvm::drop_begin(N->ops()) : N->ops());
1722+
TargetLowering::MakeLibCallOptions CallOptions;
1723+
std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
1724+
DAG, LC, N->getValueType(0), Ops, CallOptions, SDLoc(N), Chain);
1725+
if (HasChain)
1726+
ReplaceValueWith(SDValue(N, 1), Tmp.second);
1727+
GetPairElements(Tmp.first, Lo, Hi);
1728+
}
1729+
16911730
void DAGTypeLegalizer::ExpandFloatRes_FMODF(SDNode *N) {
16921731
ExpandFloatRes_UnaryWithTwoFPResults(N, RTLIB::getMODF(N->getValueType(0)),
16931732
/*CallRetResNo=*/0);
@@ -1951,7 +1990,7 @@ void DAGTypeLegalizer::ExpandFloatRes_FMUL(SDNode *N, SDValue &Lo,
19511990

19521991
void DAGTypeLegalizer::ExpandFloatRes_FNEARBYINT(SDNode *N,
19531992
SDValue &Lo, SDValue &Hi) {
1954-
ExpandFloatRes_Unary(N, GetFPLibCall(N->getValueType(0),
1993+
ExpandFloatRes_FPOperation(N, GetFPLibCall(N->getValueType(0),
19551994
RTLIB::NEARBYINT_F32,
19561995
RTLIB::NEARBYINT_F64,
19571996
RTLIB::NEARBYINT_F80,
@@ -2827,6 +2866,11 @@ void DAGTypeLegalizer::PromoteFloatResult(SDNode *N, unsigned ResNo) {
28272866
R = PromoteFloatRes_EXTRACT_VECTOR_ELT(N); break;
28282867
case ISD::FCOPYSIGN: R = PromoteFloatRes_FCOPYSIGN(N); break;
28292868

2869+
// Floating-point operations with optional chain.
2870+
case ISD::FNEARBYINT:
2871+
R = PromoteFloatRes_FPOperation(N);
2872+
break;
2873+
28302874
// Unary FP Operations
28312875
case ISD::FABS:
28322876
case ISD::FACOS:
@@ -2843,7 +2887,6 @@ void DAGTypeLegalizer::PromoteFloatResult(SDNode *N, unsigned ResNo) {
28432887
case ISD::FLOG:
28442888
case ISD::FLOG2:
28452889
case ISD::FLOG10:
2846-
case ISD::FNEARBYINT:
28472890
case ISD::FNEG:
28482891
case ISD::FRINT:
28492892
case ISD::FROUND:
@@ -3071,6 +3114,29 @@ SDValue DAGTypeLegalizer::PromoteFloatRes_BinOp(SDNode *N) {
30713114
return DAG.getNode(N->getOpcode(), SDLoc(N), NVT, Op0, Op1, N->getFlags());
30723115
}
30733116

3117+
SDValue DAGTypeLegalizer::PromoteFloatRes_FPOperation(SDNode *N) {
3118+
bool HasChain = N->hasChain();
3119+
SDValue Chain = HasChain ? N->getOperand(0) : SDValue();
3120+
assert(N->getNumValues() == 1 + HasChain &&
3121+
"multiple result is not supported yet");
3122+
SmallVector<SDValue, 4> Ops;
3123+
3124+
if (HasChain)
3125+
Ops.push_back(Chain);
3126+
for (unsigned i = HasChain, e = N->getNumOperands(); i != e; ++i) {
3127+
SDValue Op = N->getOperand(i);
3128+
// FIXME Use strict conversions for strict operations.
3129+
Op = GetPromotedFloat(Op);
3130+
Ops.push_back(Op);
3131+
}
3132+
3133+
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
3134+
SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N), NVT, Ops);
3135+
if (HasChain)
3136+
ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
3137+
return Res;
3138+
}
3139+
30743140
SDValue DAGTypeLegalizer::PromoteFloatRes_FMAD(SDNode *N) {
30753141
EVT VT = N->getValueType(0);
30763142
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
@@ -3312,6 +3378,11 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
33123378
case ISD::STRICT_FP_ROUND:
33133379
case ISD::FP_ROUND: R = SoftPromoteHalfRes_FP_ROUND(N); break;
33143380

3381+
// Floating-point operations with optional chain.
3382+
case ISD::FNEARBYINT:
3383+
R = SoftPromoteHalfRes_FPOperation(N);
3384+
break;
3385+
33153386
// Unary FP Operations
33163387
case ISD::FACOS:
33173388
case ISD::FASIN:
@@ -3327,7 +3398,6 @@ void DAGTypeLegalizer::SoftPromoteHalfResult(SDNode *N, unsigned ResNo) {
33273398
case ISD::FLOG:
33283399
case ISD::FLOG2:
33293400
case ISD::FLOG10:
3330-
case ISD::FNEARBYINT:
33313401
case ISD::FREEZE:
33323402
case ISD::FRINT:
33333403
case ISD::FROUND:
@@ -3714,6 +3784,38 @@ SDValue DAGTypeLegalizer::SoftPromoteHalfRes_BinOp(SDNode *N) {
37143784
return DAG.getNode(GetPromotionOpcode(NVT, OVT), dl, MVT::i16, Res);
37153785
}
37163786

3787+
SDValue DAGTypeLegalizer::SoftPromoteHalfRes_FPOperation(SDNode *N) {
3788+
SDLoc dl(N);
3789+
bool HasChain = N->hasChain();
3790+
assert(N->getNumValues() == 1 + HasChain &&
3791+
"multiple result is not supported yet");
3792+
SDValue Chain = HasChain ? N->getOperand(0) : SDValue();
3793+
EVT OVT = N->getValueType(0);
3794+
EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
3795+
auto PromotionOpcode = GetPromotionOpcode(OVT, NVT);
3796+
3797+
SmallVector<SDValue, 4> Ops;
3798+
if (HasChain)
3799+
Ops.push_back(Chain);
3800+
for (unsigned i = HasChain, e = N->getNumOperands(); i != e; ++i) {
3801+
SDValue Op = GetSoftPromotedHalf(N->getOperand(i));
3802+
// FIXME Use strict conversions for strict operations.
3803+
Op = DAG.getNode(PromotionOpcode, dl, NVT, Op);
3804+
Ops.push_back(Op);
3805+
}
3806+
3807+
SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N), NVT, Ops);
3808+
if (HasChain)
3809+
Chain = Res.getValue(1);
3810+
3811+
// Convert back to FP16 as an integer.
3812+
Res = DAG.getNode(GetPromotionOpcode(NVT, OVT), dl, MVT::i16, Res);
3813+
3814+
if (HasChain)
3815+
ReplaceValueWith(SDValue(N, 1), Chain);
3816+
return Res;
3817+
}
3818+
37173819
SDValue DAGTypeLegalizer::SoftPromoteHalfRes_VECREDUCE(SDNode *N) {
37183820
// Expand and soften recursively.
37193821
ReplaceValueWith(SDValue(N, 0), TLI.expandVecReduce(N, DAG));

llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
573573
bool SoftenFloatRes_UnaryWithTwoFPResults(
574574
SDNode *N, RTLIB::Libcall LC, std::optional<unsigned> CallRetResNo = {});
575575
SDValue SoftenFloatRes_Binary(SDNode *N, RTLIB::Libcall LC);
576+
SDValue SoftenFloatRes_FPOperation(SDNode *N, RTLIB::Libcall LC);
576577
SDValue SoftenFloatRes_MERGE_VALUES(SDNode *N, unsigned ResNo);
577578
SDValue SoftenFloatRes_ARITH_FENCE(SDNode *N);
578579
SDValue SoftenFloatRes_BITCAST(SDNode *N);
@@ -681,6 +682,8 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
681682
SDValue &Lo, SDValue &Hi);
682683
void ExpandFloatRes_UnaryWithTwoFPResults(
683684
SDNode *N, RTLIB::Libcall LC, std::optional<unsigned> CallRetResNo = {});
685+
void ExpandFloatRes_FPOperation(SDNode *N, RTLIB::Libcall LC, SDValue &Lo,
686+
SDValue &Hi);
684687

685688
// clang-format off
686689
void ExpandFloatRes_AssertNoFPClass(SDNode *N, SDValue &Lo, SDValue &Hi);
@@ -788,6 +791,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
788791
SDValue PromoteFloatRes_XINT_TO_FP(SDNode *N);
789792
SDValue PromoteFloatRes_VECREDUCE(SDNode *N);
790793
SDValue PromoteFloatRes_VECREDUCE_SEQ(SDNode *N);
794+
SDValue PromoteFloatRes_FPOperation(SDNode *N);
791795

792796
bool PromoteFloatOperand(SDNode *N, unsigned OpNo);
793797
SDValue PromoteFloatOp_BITCAST(SDNode *N, unsigned OpNo);
@@ -839,6 +843,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
839843
SDValue SoftPromoteHalfRes_UNDEF(SDNode *N);
840844
SDValue SoftPromoteHalfRes_VECREDUCE(SDNode *N);
841845
SDValue SoftPromoteHalfRes_VECREDUCE_SEQ(SDNode *N);
846+
SDValue SoftPromoteHalfRes_FPOperation(SDNode *N);
842847

843848
bool SoftPromoteHalfOperand(SDNode *N, unsigned OpNo);
844849
SDValue SoftPromoteHalfOp_BITCAST(SDNode *N);
@@ -881,6 +886,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
881886
SDValue ScalarizeVecRes_OverflowOp(SDNode *N, unsigned ResNo);
882887
SDValue ScalarizeVecRes_InregOp(SDNode *N);
883888
SDValue ScalarizeVecRes_VecInregOp(SDNode *N);
889+
SDValue ScalarizeVecRes_FPOperation(SDNode *N);
884890

885891
SDValue ScalarizeVecRes_ADDRSPACECAST(SDNode *N);
886892
SDValue ScalarizeVecRes_BITCAST(SDNode *N);
@@ -965,6 +971,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
965971
void SplitVecRes_StrictFPOp(SDNode *N, SDValue &Lo, SDValue &Hi);
966972
void SplitVecRes_OverflowOp(SDNode *N, unsigned ResNo,
967973
SDValue &Lo, SDValue &Hi);
974+
void SplitVecRes_FPOperation(SDNode *N, SDValue &Lo, SDValue &Hi);
968975

969976
void SplitVecRes_FIX(SDNode *N, SDValue &Lo, SDValue &Hi);
970977

0 commit comments

Comments
 (0)