PrologEpilogInserter.cpp revision 73ff5120eb8b8c0ccbfed8a17f1024c67a75f319
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
12f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner#include "llvm/CodeGen/Passes.h"
13f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner#include "llvm/CodeGen/MachineFunctionPass.h"
1458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/CodeGen/MachineInstr.h"
15eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h"
1658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/TargetMachine.h"
1758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/MRegisterInfo.h"
188bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h"
193501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
2058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
2158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnernamespace {
22f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner  struct PEI : public MachineFunctionPass {
23f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner    const char *getPassName() const {
24f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner      return "Prolog/Epilog Insertion & Frame Finalization";
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
444ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      // Add prolog and epilog code to the function.
454ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      insertPrologEpilogCode(Fn);
464ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
4758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Replace all MO_FrameIndex operands with physical register references
4858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // and actual offsets.
4958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      //
5058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      replaceFrameIndices(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///
6519df3876e6dce016ec4c5ab28320a246ab285001Brian GaekeFunctionPass *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!");
1115f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve	  if (MO.isPhysicalRegister() &&
1125f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve	      (MO.opIsDefOnly() || MO.opIsDefAndUse()))
11358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	    ModifiedRegs[MO.getReg()] = true;         // Register is modified
11458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
11558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	++I;
11658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
11758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
118eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner  MachineFrameInfo *FFI = Fn.getFrameInfo();
11958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setHasCalls(HasCalls);
12058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setMaxCallFrameSize(MaxCallFrameSize);
12158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
12258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now figure out which *callee saved* registers are modified by the current
12358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // function, thus needing to be saved and restored in the prolog/epilog.
12458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  //
12558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<unsigned> RegsToSave;
12658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0; CSRegs[i]; ++i) {
12758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Reg = CSRegs[i];
12858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    if (ModifiedRegs[Reg]) {
12958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      RegsToSave.push_back(Reg);  // If modified register...
13073ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos    } else {
13173ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos      for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
13273ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos           *AliasSet; ++AliasSet) {  // Check alias registers too...
13373ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos	if (ModifiedRegs[*AliasSet]) {
13458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  RegsToSave.push_back(Reg);
13558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
13658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
13773ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos      }
13873ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos    }
13958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
14058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
14158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (RegsToSave.empty())
14258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;   // Early exit if no caller saved registers are modified!
14358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
14458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we know which registers need to be saved and restored, allocate
14558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // stack slots for them.
14658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<int> StackSlots;
14758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
148f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner    int FrameIdx = FFI->CreateStackObject(RegInfo->getRegClass(RegsToSave[i]));
14958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    StackSlots.push_back(FrameIdx);
15058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
15158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we have a stack slot for each register to be saved, insert spill
15358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // code into the entry block...
15458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock *MBB = Fn.begin();
15558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock::iterator I = MBB->begin();
15658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
15758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
15858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // Insert the spill to the stack frame...
16058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    RegInfo->storeRegToStackSlot(*MBB, I, RegsToSave[i], StackSlots[i], RC);
16158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
16258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Add code to restore the callee-save registers in each exiting block.
1643501feab811c86c9659248a4875fc31a3165f84dChris Lattner  const TargetInstrInfo &TII = Fn.getTarget().getInstrInfo();
16558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator FI = Fn.begin(), E = Fn.end(); FI != E; ++FI) {
16658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // If last instruction is a return instruction, add an epilogue
167b589bf7d77a57e961a871ae5ffee2381722d8c0fChris Lattner    if (!FI->empty() && TII.isReturn(FI->back()->getOpcode())) {
16858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      MBB = FI; I = MBB->end()-1;
16958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
17058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
17158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
17258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	RegInfo->loadRegFromStackSlot(*MBB, I, RegsToSave[i],StackSlots[i], RC);
17358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	--I;  // Insert in reverse order
17458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
17558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
17658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
17758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
17858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
17958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
18058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the
18158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// abstract stack objects...
18258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
18358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
18458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetFrameInfo &TFI = Fn.getTarget().getFrameInfo();
18558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
18658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  bool StackGrowsDown =
18758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    TFI.getStackGrowthDirection() == TargetFrameInfo::StackGrowsDown;
18858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(StackGrowsDown && "Only tested on stack down growing targets!");
18958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Loop over all of the stack objects, assigning sequential addresses...
191eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner  MachineFrameInfo *FFI = Fn.getFrameInfo();
19258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
193f85249ca7336cda5bd491c161cb163847774e868Chris Lattner  unsigned StackAlignment = TFI.getStackAlignment();
19478d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner
19558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Start at the beginning of the local area...
1964ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  int Offset = TFI.getOffsetOfLocalArea();
19758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
19858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset += FFI->getObjectSize(i);         // Allocate Size bytes...
19958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Align = FFI->getObjectAlignment(i);
201f85249ca7336cda5bd491c161cb163847774e868Chris Lattner    assert(Align <= StackAlignment && "Cannot align stack object to higher "
20278d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner           "alignment boundary than the stack itself!");
20358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset = (Offset+Align-1)/Align*Align;   // Adjust to Alignment boundary...
20458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    FFI->setObjectOffset(i, -Offset);        // Set the computed offset
20658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
20758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Align the final stack pointer offset...
20978d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner  Offset = (Offset+StackAlignment-1)/StackAlignment*StackAlignment;
21058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
21158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Set the final value of the stack pointer...
2124ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  FFI->setStackSize(Offset-TFI.getOffsetOfLocalArea());
2134ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner}
2144ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2154ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2164ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// insertPrologEpilogCode - Scan the function for modified caller saved
2174ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// registers, insert spill code for these caller saved registers, then add
2184ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// prolog and epilog code to the function.
2194ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner///
2204ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattnervoid PEI::insertPrologEpilogCode(MachineFunction &Fn) {
2214ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add prologue to the function...
2224ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  Fn.getTarget().getRegisterInfo()->emitPrologue(Fn);
2234ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2244ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add epilogue to restore the callee-save registers in each exiting block
2254ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  const TargetInstrInfo &TII = Fn.getTarget().getInstrInfo();
2264ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
2274ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner    // If last instruction is a return instruction, add an epilogue
2280416d2a70aea644c3e0c06301c29f3b81ec1e42dChris Lattner    if (!I->empty() && TII.isReturn(I->back()->getOpcode()))
2294ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      Fn.getTarget().getRegisterInfo()->emitEpilogue(Fn, *I);
2304ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  }
23158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
23258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
23358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
23458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// replaceFrameIndices - Replace all MO_FrameIndex operands with physical
23558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// register references and actual offsets.
23658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
23758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::replaceFrameIndices(MachineFunction &Fn) {
23858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (!Fn.getFrameInfo()->hasStackObjects()) return; // Nothing to do?
23958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
24058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetMachine &TM = Fn.getTarget();
24158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
24258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo &MRI = *TM.getRegisterInfo();
24358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
24458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
24558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
24658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned i = 0, e = (*I)->getNumOperands(); i != e; ++i)
24758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if ((*I)->getOperand(i).isFrameIndex()) {
24858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // If this instruction has a FrameIndex operand, we need to use that
24958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // target machine register info object to eliminate it.
25058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MRI.eliminateFrameIndex(Fn, I);
25158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
25258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
25358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
254