PrologEpilogInserter.cpp revision 8bd66e690779c838db51f55cf0b31d7206b3b659
158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//===-- PrologEpilogInserter.cpp - Insert Prolog/Epilog code in function --===//
258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//
358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// This pass is responsible for finalizing the functions frame layout, saving
458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// callee saved registers, and for emitting prolog & epilog code for the
558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// function.
658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//
758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// This pass must be run after register allocation.  After this pass is
858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// executed, it is illegal to construct MO_FrameIndex operands.
958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//
1058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//===----------------------------------------------------------------------===//
1158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
1258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Pass.h"
1358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/CodeGen/MachineFunction.h"
1458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/CodeGen/MachineInstr.h"
1558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/CodeGen/FunctionFrameInfo.h"
1658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/TargetMachine.h"
1758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/MRegisterInfo.h"
188bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h"
1958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/MachineInstrInfo.h"
2058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
2158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnernamespace {
2258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  struct PEI : public FunctionPass {
2358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    bool runOnFunction(Function &Fn) {
2458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      return runOnMachineFunction(MachineFunction::get(&Fn));
2558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
2658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
2758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    /// runOnMachineFunction - Insert prolog/epilog code and replace abstract
2858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    /// frame indexes with appropriate references.
2958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    ///
3058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    bool runOnMachineFunction(MachineFunction &Fn) {
3158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Scan the function for modified caller saved registers and insert spill
3258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // code for any caller saved registers that are modified.  Also calculate
3358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // the MaxCallFrameSize and HasCalls variables for the function's frame
3458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // information and eliminates call frame pseudo instructions.
3558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      saveCallerSavedRegisters(Fn);
3658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
3758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Allow the target machine to make final modifications to the function
3858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // before the frame layout is finalized.
3958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      Fn.getTarget().getRegisterInfo()->processFunctionBeforeFrameFinalized(Fn);
4058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
4158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Calculate actual frame offsets for all of the abstract stack objects...
4258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      calculateFrameObjectOffsets(Fn);
4358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
4458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Replace all MO_FrameIndex operands with physical register references
4558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // and actual offsets.
4658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      //
4758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      replaceFrameIndices(Fn);
4858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
4958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Add prolog and epilog code to the function.
5058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      insertPrologEpilogCode(Fn);
5158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      return true;
5258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
5358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
5458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  private:
5558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void saveCallerSavedRegisters(MachineFunction &Fn);
5658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void calculateFrameObjectOffsets(MachineFunction &Fn);
5758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void replaceFrameIndices(MachineFunction &Fn);
5858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void insertPrologEpilogCode(MachineFunction &Fn);
5958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  };
6058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
6158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
6258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// createPrologEpilogCodeInserter - This function returns a pass that inserts
6358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// prolog and epilog code, and eliminates abstract frame references.
6458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
6558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris LattnerPass *createPrologEpilogCodeInserter() { return new PEI(); }
6658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
6758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
6858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// saveCallerSavedRegisters - Scan the function for modified caller saved
6958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// registers and insert spill code for any caller saved registers that are
7058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// modified.  Also calculate the MaxCallFrameSize and HasCalls variables for
7158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// the function's frame information and eliminates call frame pseudo
7258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// instructions.
7358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
7458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::saveCallerSavedRegisters(MachineFunction &Fn) {
7558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
7658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetFrameInfo &FrameInfo = Fn.getTarget().getFrameInfo();
7758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
7858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Get the callee saved register list...
7958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const unsigned *CSRegs = RegInfo->getCalleeSaveRegs();
8058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
8158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Get the function call frame set-up and tear-down instruction opcode
8258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int FrameSetupOpcode   = RegInfo->getCallFrameSetupOpcode();
8358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode();
8458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
8558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Early exit for targets which have no callee saved registers and no call
8658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // frame setup/destroy pseudo instructions.
8758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if ((CSRegs == 0 || CSRegs[0] == 0) &&
8858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      FrameSetupOpcode == -1 && FrameDestroyOpcode == -1)
8958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;
9058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
9158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // This bitset contains an entry for each physical register for the target...
9258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<bool> ModifiedRegs(MRegisterInfo::FirstVirtualRegister);
9358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  unsigned MaxCallFrameSize = 0;
9458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  bool HasCalls = false;
9558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
9658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
9758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); )
9858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      if ((*I)->getOpcode() == FrameSetupOpcode ||
9958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  (*I)->getOpcode() == FrameDestroyOpcode) {
10058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	assert((*I)->getNumOperands() == 1 && "Call Frame Setup/Destroy Pseudo"
10158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	       " instructions should have a single immediate argument!");
10258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	unsigned Size = (*I)->getOperand(0).getImmedValue();
10358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if (Size > MaxCallFrameSize) MaxCallFrameSize = Size;
10458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	HasCalls = true;
10558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	RegInfo->eliminateCallFramePseudoInstr(Fn, *BB, I);
10658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      } else {
10758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	for (unsigned i = 0, e = (*I)->getNumOperands(); i != e; ++i) {
10858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MachineOperand &MO = (*I)->getOperand(i);
10958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  assert(!MO.isVirtualRegister() &&
11058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner		 "Register allocation must be performed!");
11158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  if (MO.isPhysicalRegister() && MO.opIsDef())
11258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	    ModifiedRegs[MO.getReg()] = true;         // Register is modified
11358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
11458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	++I;
11558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
11658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
11758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FunctionFrameInfo *FFI = Fn.getFrameInfo();
11858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setHasCalls(HasCalls);
11958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setMaxCallFrameSize(MaxCallFrameSize);
12058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
12158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now figure out which *callee saved* registers are modified by the current
12258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // function, thus needing to be saved and restored in the prolog/epilog.
12358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  //
12458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<unsigned> RegsToSave;
12558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0; CSRegs[i]; ++i) {
12658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Reg = CSRegs[i];
12758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    if (ModifiedRegs[Reg]) {
12858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      RegsToSave.push_back(Reg);  // If modified register...
12958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    } else if (const unsigned *AliasSet = RegInfo->getAliasSet(Reg))
13058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned j = 0; AliasSet[j]; ++j)     // Check alias registers too...
13158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if (ModifiedRegs[AliasSet[j]]) {
13258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  RegsToSave.push_back(Reg);
13358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
13458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
13558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
13658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
13758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (RegsToSave.empty())
13858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;   // Early exit if no caller saved registers are modified!
13958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
14058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we know which registers need to be saved and restored, allocate
14158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // stack slots for them.
14258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<int> StackSlots;
14358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
14458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
14558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    int FrameIdx = FFI->CreateStackObject(RC->getSize(), RC->getAlignment());
14658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    StackSlots.push_back(FrameIdx);
14758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
14858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
14958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we have a stack slot for each register to be saved, insert spill
15058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // code into the entry block...
15158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock *MBB = Fn.begin();
15258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock::iterator I = MBB->begin();
15358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
15458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
15558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // Insert the spill to the stack frame...
15758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    RegInfo->storeRegToStackSlot(*MBB, I, RegsToSave[i], StackSlots[i], RC);
15858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
15958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Add code to restore the callee-save registers in each exiting block.
16158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MachineInstrInfo &MII = Fn.getTarget().getInstrInfo();
16258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator FI = Fn.begin(), E = Fn.end(); FI != E; ++FI) {
16358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // If last instruction is a return instruction, add an epilogue
16458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    if (MII.isReturn(FI->back()->getOpcode())) {
16558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      MBB = FI; I = MBB->end()-1;
16658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
16858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
16958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	RegInfo->loadRegFromStackSlot(*MBB, I, RegsToSave[i],StackSlots[i], RC);
17058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	--I;  // Insert in reverse order
17158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
17258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
17358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
17458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
17558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
17658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
17758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the
17858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// abstract stack objects...
17958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
18058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
18158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetFrameInfo &TFI = Fn.getTarget().getFrameInfo();
18258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
18358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  bool StackGrowsDown =
18458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    TFI.getStackGrowthDirection() == TargetFrameInfo::StackGrowsDown;
18558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(StackGrowsDown && "Only tested on stack down growing targets!");
18658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
18758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Loop over all of the stack objects, assigning sequential addresses...
18858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FunctionFrameInfo *FFI = Fn.getFrameInfo();
18958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Start at the beginning of the local area...
19158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int Offset = -TFI.getOffsetOfLocalArea();
19258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
19358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset += FFI->getObjectSize(i);         // Allocate Size bytes...
19458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Align = FFI->getObjectAlignment(i);
19658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset = (Offset+Align-1)/Align*Align;   // Adjust to Alignment boundary...
19758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    FFI->setObjectOffset(i, -Offset);        // Set the computed offset
19958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
20058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Align the final stack pointer offset...
20258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  unsigned StackAlign = TFI.getStackAlignment();
20358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  Offset = (Offset+StackAlign-1)/StackAlign*StackAlign;
20458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Set the final value of the stack pointer...
20658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setStackSize(Offset);
20758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
20858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
21058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// replaceFrameIndices - Replace all MO_FrameIndex operands with physical
21158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// register references and actual offsets.
21258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
21358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::replaceFrameIndices(MachineFunction &Fn) {
21458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (!Fn.getFrameInfo()->hasStackObjects()) return; // Nothing to do?
21558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
21658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetMachine &TM = Fn.getTarget();
21758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
21858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo &MRI = *TM.getRegisterInfo();
21958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
22058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
22158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
22258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned i = 0, e = (*I)->getNumOperands(); i != e; ++i)
22358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if ((*I)->getOperand(i).isFrameIndex()) {
22458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // If this instruction has a FrameIndex operand, we need to use that
22558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // target machine register info object to eliminate it.
22658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MRI.eliminateFrameIndex(Fn, I);
22758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
22858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
22958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
23058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
23158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
23258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// insertPrologEpilogCode - Scan the function for modified caller saved
23358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// registers, insert spill code for these caller saved registers, then add
23458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// prolog and epilog code to the function.
23558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
23658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::insertPrologEpilogCode(MachineFunction &Fn) {
23758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Add prologue to the function...
23858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  Fn.getTarget().getRegisterInfo()->emitPrologue(Fn);
23958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
24058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Add epilogue to restore the callee-save registers in each exiting block
24158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MachineInstrInfo &MII = Fn.getTarget().getInstrInfo();
24258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
24358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // If last instruction is a return instruction, add an epilogue
24458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    if (MII.isReturn(I->back()->getOpcode()))
24558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      Fn.getTarget().getRegisterInfo()->emitEpilogue(Fn, *I);
24658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
24758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
248