mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-06 04:31:08 +00:00
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
This commit is contained in:
parent
c5cfea3c02
commit
a407ca16c2
@ -3721,7 +3721,18 @@ SDValue DAGCombiner::visitBIT_CONVERT(SDNode *N) {
|
|||||||
// If the input is a constant, let getNode fold it.
|
// If the input is a constant, let getNode fold it.
|
||||||
if (isa<ConstantSDNode>(N0) || isa<ConstantFPSDNode>(N0)) {
|
if (isa<ConstantSDNode>(N0) || isa<ConstantFPSDNode>(N0)) {
|
||||||
SDValue Res = DAG.getNode(ISD::BIT_CONVERT, N->getDebugLoc(), VT, 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)
|
// (conv (conv x, t1), t2) -> (conv x, t2)
|
||||||
|
@ -988,24 +988,6 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) {
|
|||||||
// Other cases are autogenerated.
|
// Other cases are autogenerated.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ISD::ConstantFP: {
|
|
||||||
ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(N);
|
|
||||||
EVT VT = CFP->getValueType(0);
|
|
||||||
ConstantFP *LLVMC = const_cast<ConstantFP*>(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: {
|
case ISD::FrameIndex: {
|
||||||
// Selects to ADDri FI, 0 which in turn will become ADDri SP, imm.
|
// Selects to ADDri FI, 0 which in turn will become ADDri SP, imm.
|
||||||
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
int FI = cast<FrameIndexSDNode>(N)->getIndex();
|
||||||
|
Loading…
Reference in New Issue
Block a user