diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-08-25 00:45:43 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-08-25 00:45:43 +0000 |
| commit | e4c338d0d8b454b4e5fb12452625ce3497b8af87 (patch) | |
| tree | 11c2c1323e1cc39cfac3d49e21b77be5728b9139 /llvm/lib | |
| parent | bbe0e7df2cf487900a0ff6b90a4e7011deaef0f0 (diff) | |
| download | bcm5719-llvm-e4c338d0d8b454b4e5fb12452625ce3497b8af87.tar.gz bcm5719-llvm-e4c338d0d8b454b4e5fb12452625ce3497b8af87.zip | |
Fully implement frame index, so that we can pass the address of alloca's
around to functions and stuff
llvm-svn: 23036
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index aaf2bba2ad4..32ea4c4b47b 100644 --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -369,9 +369,10 @@ bool PPC32DAGToDAGISel::SelectAddr(SDOperand Addr, SDOperand &Op1, if (Addr.getOpcode() == ISD::ADD) { if (isIntImmediate(Addr.getOperand(1), imm) && isInt16(imm)) { Op1 = getI32Imm(Lo16(imm)); - if (isa<FrameIndexSDNode>(Addr.getOperand(0))) { + if (FrameIndexSDNode *FI = + dyn_cast<FrameIndexSDNode>(Addr.getOperand(0))) { ++FrameOff; - Op2 = Addr.getOperand(0); + Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); } else { Op2 = Select(Addr.getOperand(0)); } @@ -396,9 +397,9 @@ bool PPC32DAGToDAGISel::SelectAddr(SDOperand Addr, SDOperand &Op1, Op2 = CurDAG->getTargetNode(PPC::LIS, MVT::i32, Op1); return false; } - } else if (isa<FrameIndexSDNode>(Addr)) { + } else if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(Addr)) { Op1 = getI32Imm(0); - Op2 = Addr; + Op2 = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); return false; } else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Addr)) { Op1 = Addr; @@ -530,6 +531,13 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { else CurDAG->SelectNodeTo(N, N->getValueType(0), PPC::IMPLICIT_DEF_FP); break; + case ISD::FrameIndex: { + int FI = cast<FrameIndexSDNode>(N)->getIndex(); + CurDAG->SelectNodeTo(N, MVT::i32, PPC::ADDI, + CurDAG->getTargetFrameIndex(FI, MVT::i32), + getI32Imm(0)); + break; + } case ISD::GlobalAddress: { GlobalValue *GV = cast<GlobalAddressSDNode>(N)->getGlobal(); SDOperand Tmp; |

