summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-04-26 15:20:18 +0000
committerSanjay Patel <spatel@rotateright.com>2018-04-26 15:20:18 +0000
commita5da08638699d1755a634f19099c133305efa342 (patch)
treef9ea3f644bcb090c1ddf0663d83c3a94e157e5f9 /llvm/lib/CodeGen
parent4f38ffa63c7b7a4b8383e58146cc17b13946ccb2 (diff)
downloadbcm5719-llvm-a5da08638699d1755a634f19099c133305efa342.tar.gz
bcm5719-llvm-a5da08638699d1755a634f19099c133305efa342.zip
[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
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp42
1 files changed, 26 insertions, 16 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index e123e814c66..a897fb562e7 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -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();
}
OpenPOWER on IntegriCloud