diff options
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index abb25fb4f27..879e45df598 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -10890,6 +10890,15 @@ 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)); + return SDValue(); } @@ -10929,6 +10938,15 @@ 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)); + return SDValue(); } |