diff options
-rw-r--r-- | lib/Target/X86/X86ISelDAGToDAG.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index e0b8e01295..3a4496f002 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -1585,10 +1585,14 @@ SDNode *X86DAGToDAGISel::Select(SDOperand N) { SDOperand Chain = Node->getOperand(0); SDOperand N1 = Node->getOperand(1); SDOperand N2 = Node->getOperand(2); - if (isa<FrameIndexSDNode>(N1) && - N2.getOpcode() == X86ISD::Wrapper && + if (!isa<FrameIndexSDNode>(N1)) + break; + int FI = cast<FrameIndexSDNode>(N1)->getIndex(); + if (N2.getOpcode() == ISD::ADD && + N2.getOperand(0).getOpcode() == X86ISD::GlobalBaseReg) + N2 = N2.getOperand(1); + if (N2.getOpcode() == X86ISD::Wrapper && isa<GlobalAddressSDNode>(N2.getOperand(0))) { - int FI = cast<FrameIndexSDNode>(N1)->getIndex(); GlobalValue *GV = cast<GlobalAddressSDNode>(N2.getOperand(0))->getGlobal(); SDOperand Tmp1 = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy()); |