mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +00:00
fix the X86 backend to just drop llvm.declare nodes for VLAs instead of
leaving them in the DAG and then getting selection errors. This is a fix for PR3538. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64382 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1563,17 +1563,29 @@ SDNode *X86DAGToDAGISel::Select(SDValue N) {
|
||||
SDValue N1 = Node->getOperand(1);
|
||||
SDValue N2 = Node->getOperand(2);
|
||||
FrameIndexSDNode *FINode = dyn_cast<FrameIndexSDNode>(N1);
|
||||
if (!FINode)
|
||||
break;
|
||||
|
||||
// FIXME: We need to handle this for VLAs.
|
||||
if (!FINode) {
|
||||
ReplaceUses(N.getValue(0), Chain);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (N2.getOpcode() == ISD::ADD &&
|
||||
N2.getOperand(0).getOpcode() == X86ISD::GlobalBaseReg)
|
||||
N2 = N2.getOperand(1);
|
||||
if (N2.getOpcode() != X86ISD::Wrapper)
|
||||
break;
|
||||
|
||||
// If N2 is not Wrapper(decriptor) then the llvm.declare is mangled
|
||||
// somehow, just ignore it.
|
||||
if (N2.getOpcode() != X86ISD::Wrapper) {
|
||||
ReplaceUses(N.getValue(0), Chain);
|
||||
return NULL;
|
||||
}
|
||||
GlobalAddressSDNode *GVNode =
|
||||
dyn_cast<GlobalAddressSDNode>(N2.getOperand(0));
|
||||
if (!GVNode)
|
||||
break;
|
||||
if (GVNode == 0) {
|
||||
ReplaceUses(N.getValue(0), Chain);
|
||||
return NULL;
|
||||
}
|
||||
SDValue Tmp1 = CurDAG->getTargetFrameIndex(FINode->getIndex(),
|
||||
TLI.getPointerTy());
|
||||
SDValue Tmp2 = CurDAG->getTargetGlobalAddress(GVNode->getGlobal(),
|
||||
@@ -1581,7 +1593,6 @@ SDNode *X86DAGToDAGISel::Select(SDValue N) {
|
||||
SDValue Ops[] = { Tmp1, Tmp2, Chain };
|
||||
return CurDAG->getTargetNode(TargetInstrInfo::DECLARE, dl,
|
||||
MVT::Other, Ops, 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user