diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-12 17:33:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-12 17:33:11 +0000 |
commit | 1823c92aa711e38577d135461fba200423114ed8 (patch) | |
tree | ed93d2a9992a98cafe5410846bcd05b6d3f944bd /lib | |
parent | 4ed76e76bb3d9a7504b22ae3952b541ff68925d3 (diff) |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/X86/X86ISelDAGToDAG.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index 951742835b..20ae2ed20b 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -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; } } |