diff options
author | John Brawn <john.brawn@arm.com> | 2020-02-17 16:55:32 +0000 |
---|---|---|
committer | Hans Wennborg <hans@chromium.org> | 2020-02-18 16:46:45 +0100 |
commit | f636e9feb9f0969e3b563d3140db5a0faa1e30d8 (patch) | |
tree | df1a1225567d937f71c53b8fec1329b7f6c95133 /llvm/lib/Target | |
parent | b5d9a7e72fafaead89f0cc8994925c90ed3169be (diff) | |
download | bcm5719-llvm-f636e9feb9f0969e3b563d3140db5a0faa1e30d8.tar.gz bcm5719-llvm-f636e9feb9f0969e3b563d3140db5a0faa1e30d8.zip |
[FPEnv][ARM] Don't call mutateStrictFPToFP when lowering
mutateStrictFPToFP can delete the node and replace it with another with the same
value which can later cause problems, and returning the result of
mutateStrictFPToFP doesn't work because SelectionDAGLegalize expects that the
returned value has the same number of results as the original. Instead handle
things by doing the mutation manually.
Differential Revision: https://reviews.llvm.org/D74726
(cherry picked from commit 594a89f7270da74c89f2321432bc6a7135773fa5)
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 559a4e8435c..2f836a60a9e 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -5421,7 +5421,12 @@ SDValue ARMTargetLowering::LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const { // FIXME: Remove this when we have strict fp instruction selection patterns if (IsStrict) { - DAG.mutateStrictFPToFP(Op.getNode()); + SDLoc Loc(Op); + SDValue Result = + DAG.getNode(Op.getOpcode() == ISD::STRICT_FP_TO_SINT ? ISD::FP_TO_SINT + : ISD::FP_TO_UINT, + Loc, Op.getValueType(), SrcVal); + return DAG.getMergeValues({Result, Op.getOperand(0)}, Loc); } return Op; @@ -16384,7 +16389,10 @@ SDValue ARMTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const { if (SrcSz == 32 && DstSz == 64 && Subtarget->hasFP64()) { // FIXME: Remove this when we have strict fp instruction selection patterns if (IsStrict) { - DAG.mutateStrictFPToFP(Op.getNode()); + SDLoc Loc(Op); + SDValue Result = DAG.getNode(ISD::FP_EXTEND, + Loc, Op.getValueType(), SrcVal); + return DAG.getMergeValues({Result, Op.getOperand(0)}, Loc); } return Op; } |