[DAGCombiner] refactor FP->int->FP folds; NFC

As discussed in the post-review comments for rL330437,
we need to guard this fold to allow existing code to
keep working with the undefined behavior that they've
come to rely on.

That would mean duplicating more code than we already 
have, so let's fix that first. 

llvm-svn: 330947
This commit is contained in:
Sanjay Patel 2018-04-26 15:20:18 +00:00
parent 4f38ffa63c
commit a5da086386
1 changed files with 26 additions and 16 deletions

View File

@ -10902,6 +10902,28 @@ SDValue DAGCombiner::visitFCOPYSIGN(SDNode *N) {
return SDValue();
}
static SDValue foldFPToIntToFP(SDNode *N, SelectionDAG &DAG,
const TargetLowering &TLI) {
// We only do this if the target has legal ftrunc. Otherwise, we'd likely be
// replacing casts with a libcall.
EVT VT = N->getValueType(0);
if (!TLI.isOperationLegal(ISD::FTRUNC, VT))
return SDValue();
// fptosi/fptoui round towards zero, so converting from FP to integer and
// back is the same as an 'ftrunc': [us]itofp (fpto[us]i X) --> ftrunc X
SDValue N0 = N->getOperand(0);
if (N->getOpcode() == ISD::SINT_TO_FP && N0.getOpcode() == ISD::FP_TO_SINT &&
N0.getOperand(0).getValueType() == VT)
return DAG.getNode(ISD::FTRUNC, SDLoc(N), VT, N0.getOperand(0));
if (N->getOpcode() == ISD::UINT_TO_FP && N0.getOpcode() == ISD::FP_TO_UINT &&
N0.getOperand(0).getValueType() == VT)
return DAG.getNode(ISD::FTRUNC, SDLoc(N), VT, N0.getOperand(0));
return SDValue();
}
SDValue DAGCombiner::visitSINT_TO_FP(SDNode *N) {
SDValue N0 = N->getOperand(0);
EVT VT = N->getValueType(0);
@ -10953,14 +10975,8 @@ SDValue DAGCombiner::visitSINT_TO_FP(SDNode *N) {
}
}
// fptosi rounds towards zero, so converting from FP to integer and back is
// the same as an 'ftrunc': sitofp (fptosi X) --> ftrunc X
// We only do this if the target has legal ftrunc, otherwise we'd likely be
// replacing casts with a libcall.
if (N0.getOpcode() == ISD::FP_TO_SINT &&
N0.getOperand(0).getValueType() == VT &&
TLI.isOperationLegal(ISD::FTRUNC, VT))
return DAG.getNode(ISD::FTRUNC, SDLoc(N), VT, N0.getOperand(0));
if (SDValue FTrunc = foldFPToIntToFP(N, DAG, TLI))
return FTrunc;
return SDValue();
}
@ -11001,14 +11017,8 @@ SDValue DAGCombiner::visitUINT_TO_FP(SDNode *N) {
}
}
// fptoui rounds towards zero, so converting from FP to integer and back is
// the same as an 'ftrunc': uitofp (fptoui X) --> ftrunc X
// We only do this if the target has legal ftrunc, otherwise we'd likely be
// replacing casts with a libcall.
if (N0.getOpcode() == ISD::FP_TO_UINT &&
N0.getOperand(0).getValueType() == VT &&
TLI.isOperationLegal(ISD::FTRUNC, VT))
return DAG.getNode(ISD::FTRUNC, SDLoc(N), VT, N0.getOperand(0));
if (SDValue FTrunc = foldFPToIntToFP(N, DAG, TLI))
return FTrunc;
return SDValue();
}