diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-06-17 02:01:22 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-06-17 02:01:22 +0000 |
commit | 851bc0453350254cd45a91b6af9592003562d707 (patch) | |
tree | f79d103d5f8efb809f1e6a1992dff52f46661a6a /lib/Target/X86/X86ISelDAGToDAG.cpp | |
parent | fc196f9ee909ac35837f6f771a42aa0dec817584 (diff) | |
download | external_llvm-851bc0453350254cd45a91b6af9592003562d707.zip external_llvm-851bc0453350254cd45a91b6af9592003562d707.tar.gz external_llvm-851bc0453350254cd45a91b6af9592003562d707.tar.bz2 |
Rather than avoiding to wrap ISD::DECLARE GV operand in X86ISD::Wrapper, simply handle it at dagisel time with x86 specific isel code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52377 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86ISelDAGToDAG.cpp')
-rw-r--r-- | lib/Target/X86/X86ISelDAGToDAG.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp index 5ee9122..e0b8e01 100644 --- a/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -1578,6 +1578,28 @@ SDNode *X86DAGToDAGISel::Select(SDOperand N) { return ResNode; break; } + + case ISD::DECLARE: { + // Handle DECLARE nodes here because the second operand may have been + // wrapped in X86ISD::Wrapper. + SDOperand Chain = Node->getOperand(0); + SDOperand N1 = Node->getOperand(1); + SDOperand N2 = Node->getOperand(2); + if (isa<FrameIndexSDNode>(N1) && + 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()); + SDOperand Tmp2 = CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy()); + AddToISelQueue(Chain); + SDOperand Ops[] = { Tmp1, Tmp2, Chain }; + return CurDAG->getTargetNode(TargetInstrInfo::DECLARE, + MVT::Other, Ops, 3); + } + break; + } } SDNode *ResNode = SelectCode(N); |