X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FARM%2FARMISelDAGToDAG.cpp;h=3c6d21fc4097be68181c6f484973d87fa2104499;hb=9d7b5309c267048114f1438ec0366923c99ca34d;hp=f45accc4f3efffcd3bfa1811e3b10e8f3571d33c;hpb=f5f5dce897269885754fc79adeb809194da52942;p=oota-llvm.git diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp index f45accc4f3e..3c6d21fc409 100644 --- a/lib/Target/ARM/ARMISelDAGToDAG.cpp +++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -595,6 +595,8 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) { } } case ISD::ADD: { + if (!Subtarget->isThumb()) + break; // Select add sp, c to tADDhirr. SDValue N0 = Op.getOperand(0); SDValue N1 = Op.getOperand(1); @@ -837,13 +839,18 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) { SDValue N1 = Op.getOperand(1); SDValue N2 = Op.getOperand(2); FrameIndexSDNode *FINode = dyn_cast(N1); - if (!FINode) - break; + // FIXME: handle VLAs. + if (!FINode) { + ReplaceUses(Op.getValue(0), Chain); + return NULL; + } if (N2.getOpcode() == ARMISD::PIC_ADD && isa(N2.getOperand(0))) N2 = N2.getOperand(0); LoadSDNode *Ld = dyn_cast(N2); - if (!Ld) - break; + if (!Ld) { + ReplaceUses(Op.getValue(0), Chain); + return NULL; + } SDValue BasePtr = Ld->getBasePtr(); assert(BasePtr.getOpcode() == ARMISD::Wrapper && isa(BasePtr.getOperand(0)) && @@ -855,15 +862,17 @@ SDNode *ARMDAGToDAGISel::Select(SDValue Op) { GV = ACPV->getGV(); } else GV = dyn_cast(CP->getConstVal()); - if (GV) { - SDValue Tmp1 = CurDAG->getTargetFrameIndex(FINode->getIndex(), - TLI.getPointerTy()); - SDValue Tmp2 = CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy()); - SDValue Ops[] = { Tmp1, Tmp2, Chain }; - return CurDAG->getTargetNode(TargetInstrInfo::DECLARE, dl, - MVT::Other, Ops, 3); + if (!GV) { + ReplaceUses(Op.getValue(0), Chain); + return NULL; } - break; + + SDValue Tmp1 = CurDAG->getTargetFrameIndex(FINode->getIndex(), + TLI.getPointerTy()); + SDValue Tmp2 = CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy()); + SDValue Ops[] = { Tmp1, Tmp2, Chain }; + return CurDAG->getTargetNode(TargetInstrInfo::DECLARE, dl, + MVT::Other, Ops, 3); } }