forked from OSchip/llvm-project
				
			Added Mips support for DYNAMIC_STACKALLOC
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. llvm-svn: 54485
This commit is contained in:
		
							parent
							
								
									de5161fdf2
								
							
						
					
					
						commit
						02ff450f13
					
				| 
						 | 
				
			
			@ -102,6 +102,7 @@ MipsTargetLowering(MipsTargetMachine &TM): TargetLowering(TM)
 | 
			
		|||
  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 
 | 
			
		||||
| 
						 | 
				
			
			@ -165,6 +166,7 @@ LowerOperation(SDValue Op, SelectionDAG &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);
 | 
			
		||||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue