Added Mips support for DYNAMIC_STACKALLOC
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 7 Aug 2008 19:08:11 +0000 (19:08 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 7 Aug 2008 19:08:11 +0000 (19:08 +0000)
Fixed bug in adjustMipsStackFrame, which was breaking
while trying to access a dead stack object index. Also added
one more alignment before fixing the callee saved registers
stack offset adjustment.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54485 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsISelLowering.cpp
lib/Target/Mips/MipsISelLowering.h
lib/Target/Mips/MipsRegisterInfo.cpp

index e286df197ca32e200f5dffec49c750b4a36b3e6e..fb0cb63aa9c92f9d35e559f03081b14d2e65d30d 100644 (file)
@@ -92,16 +92,17 @@ MipsTargetLowering(MipsTargetMachine &TM): TargetLowering(TM)
   AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
 
   // Mips Custom Operations
-  setOperationAction(ISD::GlobalAddress,    MVT::i32,   Custom);
-  setOperationAction(ISD::GlobalTLSAddress, MVT::i32,   Custom);
-  setOperationAction(ISD::RET,              MVT::Other, Custom);
-  setOperationAction(ISD::JumpTable,        MVT::i32,   Custom);
-  setOperationAction(ISD::ConstantPool,     MVT::i32,   Custom);
-  setOperationAction(ISD::SELECT,           MVT::f32,   Custom);
-  setOperationAction(ISD::SELECT,           MVT::i32,   Custom);
-  setOperationAction(ISD::SELECT_CC,        MVT::i32,   Custom);
-  setOperationAction(ISD::SETCC,            MVT::f32,   Custom);
-  setOperationAction(ISD::BRCOND,           MVT::Other, Custom);
+  setOperationAction(ISD::GlobalAddress,      MVT::i32,   Custom);
+  setOperationAction(ISD::GlobalTLSAddress,   MVT::i32,   Custom);
+  setOperationAction(ISD::RET,                MVT::Other, Custom);
+  setOperationAction(ISD::JumpTable,          MVT::i32,   Custom);
+  setOperationAction(ISD::ConstantPool,       MVT::i32,   Custom);
+  setOperationAction(ISD::SELECT,             MVT::f32,   Custom);
+  setOperationAction(ISD::SELECT,             MVT::i32,   Custom);
+  setOperationAction(ISD::SELECT_CC,          MVT::i32,   Custom);
+  setOperationAction(ISD::SETCC,              MVT::f32,   Custom);
+  setOperationAction(ISD::BRCOND,             MVT::Other, Custom);
+  setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i32,   Custom);
 
   // We custom lower AND/OR to handle the case where the DAG contain 'ands/ors' 
   // with operands comming from setcc fp comparions. This is necessary since 
@@ -161,19 +162,20 @@ LowerOperation(SDValue Op, SelectionDAG &DAG)
 {
   switch (Op.getOpcode()) 
   {
-    case ISD::AND:              return LowerANDOR(Op, DAG);
-    case ISD::BRCOND:           return LowerBRCOND(Op, DAG);
-    case ISD::CALL:             return LowerCALL(Op, DAG);
-    case ISD::ConstantPool:     return LowerConstantPool(Op, DAG);
-    case ISD::FORMAL_ARGUMENTS: return LowerFORMAL_ARGUMENTS(Op, DAG);
-    case ISD::GlobalAddress:    return LowerGlobalAddress(Op, DAG);
-    case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG);
-    case ISD::JumpTable:        return LowerJumpTable(Op, DAG);
-    case ISD::OR:               return LowerANDOR(Op, DAG);
-    case ISD::RET:              return LowerRET(Op, DAG);
-    case ISD::SELECT:           return LowerSELECT(Op, DAG);
-    case ISD::SELECT_CC:        return LowerSELECT_CC(Op, DAG);
-    case ISD::SETCC:            return LowerSETCC(Op, DAG);
+    case ISD::AND:                return LowerANDOR(Op, DAG);
+    case ISD::BRCOND:             return LowerBRCOND(Op, DAG);
+    case ISD::CALL:               return LowerCALL(Op, DAG);
+    case ISD::ConstantPool:       return LowerConstantPool(Op, DAG);
+    case ISD::DYNAMIC_STACKALLOC: return LowerDYNAMIC_STACKALLOC(Op, DAG);
+    case ISD::FORMAL_ARGUMENTS:   return LowerFORMAL_ARGUMENTS(Op, DAG);
+    case ISD::GlobalAddress:      return LowerGlobalAddress(Op, DAG);
+    case ISD::GlobalTLSAddress:   return LowerGlobalTLSAddress(Op, DAG);
+    case ISD::JumpTable:          return LowerJumpTable(Op, DAG);
+    case ISD::OR:                 return LowerANDOR(Op, DAG);
+    case ISD::RET:                return LowerRET(Op, DAG);
+    case ISD::SELECT:             return LowerSELECT(Op, DAG);
+    case ISD::SELECT_CC:          return LowerSELECT_CC(Op, DAG);
+    case ISD::SETCC:              return LowerSETCC(Op, DAG);
   }
   return SDValue();
 }
@@ -361,6 +363,29 @@ MipsTargetLowering::EmitInstrWithCustomInserter(MachineInstr *MI,
 //  Misc Lower Operation implementation
 //===----------------------------------------------------------------------===//
 
+SDValue MipsTargetLowering::
+LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG)
+{
+  SDValue Chain = Op.getOperand(0);
+  SDValue Size = Op.getOperand(1);
+
+  // Get a reference from Mips stack pointer
+  SDValue StackPointer = DAG.getCopyFromReg(Chain, Mips::SP, MVT::i32);
+
+  // Subtract the dynamic size from the actual stack size to
+  // obtain the new stack size.
+  SDValue Sub = DAG.getNode(ISD::SUB, MVT::i32, StackPointer, Size);
+
+  // The Sub result contains the new stack start address, so it 
+  // must be placed in the stack pointer register.
+  Chain = DAG.getCopyToReg(StackPointer.getValue(1), Mips::SP, Sub);
+  
+  // This node always has two return values: a new stack pointer 
+  // value and a chain
+  SDValue Ops[2] = { Sub, Chain };
+  return DAG.getMergeValues(Ops, 2);
+}
+
 SDValue MipsTargetLowering::
 LowerANDOR(SDValue Op, SelectionDAG &DAG)
 {
index 25b11619fd7d8b49559a4d1f97f59d843c173d4e..3c8afb81a8b0ce2efb0e96d281925baadb93d3de 100644 (file)
@@ -93,6 +93,7 @@ namespace llvm {
     SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG);
     SDValue LowerCALL(SDValue Op, SelectionDAG &DAG);
     SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
+    SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG);
     SDValue LowerFORMAL_ARGUMENTS(SDValue Op, SelectionDAG &DAG);
     SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
     SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG);
index 424cf03f6b26b94af3e831097e6f9ddfed31883a..6d75f460d34a43d2996999e950ddbe33d3123b14 100644 (file)
@@ -249,6 +249,8 @@ void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const
   for (int i = 0, e = MFI->getObjectIndexEnd(); i != e; ++i) {
     if (i >= MinCSFI && i <= MaxCSFI)
       continue;
+    if (MFI->isDeadObjectIndex(i))
+      continue;
     unsigned Offset = MFI->getObjectOffset(i) - CalleeSavedAreaSize;
     if (LastOffsetFI == -1)
       LastOffsetFI = i;
@@ -266,6 +268,7 @@ void MipsRegisterInfo::adjustMipsStackFrame(MachineFunction &MF) const
   if (LastOffsetFI >= 0)
     StackOffset = MFI->getObjectOffset(LastOffsetFI)+ 
                   MFI->getObjectAlignment(LastOffsetFI);
+  StackOffset = ((StackOffset+StackAlign-1)/StackAlign*StackAlign);
 
   for (unsigned i = 0, e = CSI.size(); i != e ; ++i) {
     if (CSI[i].getRegClass() != Mips::CPURegsRegisterClass)