[llvm-commits] CVS: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
Rafael Espindola
rafael.espindola at gmail.com
Mon Jun 12 05:28:36 PDT 2006
Changes in directory llvm/lib/Target/ARM:
ARMISelDAGToDAG.cpp updated: 1.11 -> 1.12
---
Log message:
lower more then 4 formal arguments. The offset is currently hard coded.
implement SelectFrameIndex
---
Diffs of the changes: (+50 -15)
ARMISelDAGToDAG.cpp | 65 ++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 50 insertions(+), 15 deletions(-)
Index: llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp
diff -u llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.11 llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.12
--- llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:1.11 Mon Jun 5 17:26:14 2006
+++ llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp Mon Jun 12 07:28:08 2006
@@ -74,30 +74,49 @@
return DAG.getNode(ISD::BRIND, MVT::Other, Copy, LR);
}
-static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) {
+static SDOperand LowerFORMAL_ARGUMENT(SDOperand Op, SelectionDAG &DAG,
+ unsigned ArgNo) {
MachineFunction &MF = DAG.getMachineFunction();
- SSARegMap *RegMap = MF.getSSARegMap();
- std::vector<SDOperand> ArgValues;
+ MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
+ assert (ObjectVT == MVT::i32);
SDOperand Root = Op.getOperand(0);
+ SSARegMap *RegMap = MF.getSSARegMap();
- unsigned reg_idx = 0;
unsigned num_regs = 4;
-
static const unsigned REGS[] = {
ARM::R0, ARM::R1, ARM::R2, ARM::R3
};
- for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) {
- SDOperand ArgVal;
+ if(ArgNo < num_regs) {
+ unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
+ MF.addLiveIn(REGS[ArgNo], VReg);
+ return DAG.getCopyFromReg(Root, VReg, MVT::i32);
+ } else {
+ // If the argument is actually used, emit a load from the right stack
+ // slot.
+ if (!Op.Val->hasNUsesOfValue(0, ArgNo)) {
+ //hack
+ unsigned ArgOffset = 0;
+
+ MachineFrameInfo *MFI = MF.getFrameInfo();
+ unsigned ObjSize = MVT::getSizeInBits(ObjectVT)/8;
+ int FI = MFI->CreateFixedObject(ObjSize, ArgOffset);
+ SDOperand FIN = DAG.getFrameIndex(FI, MVT::i32);
+ return DAG.getLoad(ObjectVT, Root, FIN,
+ DAG.getSrcValue(NULL));
+ } else {
+ // Don't emit a dead load.
+ return DAG.getNode(ISD::UNDEF, ObjectVT);
+ }
+ }
+}
- MVT::ValueType ObjectVT = Op.getValue(ArgNo).getValueType();
- assert (ObjectVT == MVT::i32);
+static SDOperand LowerFORMAL_ARGUMENTS(SDOperand Op, SelectionDAG &DAG) {
+ std::vector<SDOperand> ArgValues;
+ SDOperand Root = Op.getOperand(0);
- assert(reg_idx < num_regs);
- unsigned VReg = RegMap->createVirtualRegister(&ARM::IntRegsRegClass);
- MF.addLiveIn(REGS[reg_idx], VReg);
- ArgVal = DAG.getCopyFromReg(Root, VReg, MVT::i32);
- ++reg_idx;
+ for (unsigned ArgNo = 0, e = Op.Val->getNumValues()-1; ArgNo != e; ++ArgNo) {
+ SDOperand ArgVal = LowerFORMAL_ARGUMENT(Op, DAG, ArgNo);
ArgValues.push_back(ArgVal);
}
@@ -164,8 +183,24 @@
ScheduleAndEmitDAG(DAG);
}
+static void SelectFrameIndex(SelectionDAG *CurDAG, SDOperand &Result, SDNode *N) {
+ int FI = cast<FrameIndexSDNode>(N)->getIndex();
+ Result = CurDAG->SelectNodeTo(N, ARM::movrr, MVT::i32,
+ CurDAG->getTargetFrameIndex(FI, MVT::i32));
+}
+
void ARMDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) {
- SelectCode(Result, Op);
+ SDNode *N = Op.Val;
+
+ switch (N->getOpcode()) {
+ default:
+ SelectCode(Result, Op);
+ break;
+
+ case ISD::FrameIndex:
+ SelectFrameIndex(CurDAG, Result, N);
+ break;
+ }
}
} // end anonymous namespace
More information about the llvm-commits
mailing list