aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-08-25 00:45:43 +0000
committerChris Lattner <sabre@nondot.org>2005-08-25 00:45:43 +0000
commite28e40a2733c5d9a568d1569e2d1d8461716b22d (patch)
tree50540cfa770a144afe643447874e6247e37c964c
parentafb2dd43de61f4585e75d1f3ab93a9ac4b3b7592 (diff)
Fully implement frame index, so that we can pass the address of alloca's
around to functions and stuff git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23036 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/PowerPC/PPCISelDAGToDAG.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index aaf2bba2ad..32ea4c4b47 100644
--- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/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;