From a407ca16c29b4e91ef3cf9e188ac2e3ab6920cd8 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Mon, 10 Aug 2009 23:15:10 +0000 Subject: [PATCH] Fix a bug where DAGCombine was producing an illegal ConstantFP node after legalize, and remove the workaround code from the ARM backend. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78615 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 13 ++++++++++++- lib/Target/ARM/ARMISelDAGToDAG.cpp | 18 ------------------ 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 6119411d360..42d163f79b1 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3721,7 +3721,18 @@ SDValue DAGCombiner::visitBIT_CONVERT(SDNode *N) { // If the input is a constant, let getNode fold it. if (isa(N0) || isa(N0)) { SDValue Res = DAG.getNode(ISD::BIT_CONVERT, N->getDebugLoc(), VT, N0); - if (Res.getNode() != N) return Res; + if (Res.getNode() != N) { + if (!LegalOperations || + TLI.isOperationLegal(Res.getNode()->getOpcode(), VT)) + return Res; + + // Folding it resulted in an illegal node, and it's too late to + // do that. Clean up the old node and forego the transformation. + // Ideally this won't happen very often, because instcombine + // and the earlier dagcombine runs (where illegal nodes are + // permitted) should have folded most of them already. + DAG.DeleteNode(Res.getNode()); + } } // (conv (conv x, t1), t2) -> (conv x, t2) diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index 07575290c1d..1096e8eb01c 100644 --- a/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -988,24 +988,6 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) { // Other cases are autogenerated. break; } - case ISD::ConstantFP: { - ConstantFPSDNode *CFP = cast(N); - EVT VT = CFP->getValueType(0); - ConstantFP *LLVMC = const_cast(CFP->getConstantFPValue()); - SDValue CPIdx = CurDAG->getTargetConstantPool(LLVMC, TLI.getPointerTy()); - SDNode *ResNode; - SDValue Ops[] = { - CPIdx, - CurDAG->getTargetConstant(0, EVT::i32), - getAL(CurDAG), - CurDAG->getRegister(0, EVT::i32), - CurDAG->getEntryNode() - }; - unsigned Opc = (VT == EVT::f32) ? ARM::FLDS : ARM::FLDD; - ResNode=CurDAG->getTargetNode(Opc, dl, VT, EVT::Other, Ops, 5); - ReplaceUses(Op, SDValue(ResNode, 0)); - return NULL; - } case ISD::FrameIndex: { // Selects to ADDri FI, 0 which in turn will become ADDri SP, imm. int FI = cast(N)->getIndex(); -- 2.34.1