PrologEpilogInserter.cpp revision 1cbe4d0ad0888e50858cca83cf2a0d3083709513
158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//===-- PrologEpilogInserter.cpp - Insert Prolog/Epilog code in function --===//
2b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under
6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//
1058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// This pass is responsible for finalizing the functions frame layout, saving
1158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// callee saved registers, and for emitting prolog & epilog code for the
1258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// function.
1358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//
1458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// This pass must be run after register allocation.  After this pass is
1558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner// executed, it is illegal to construct MO_FrameIndex operands.
1658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//
1758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner//===----------------------------------------------------------------------===//
1858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner#include "llvm/CodeGen/Passes.h"
20f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner#include "llvm/CodeGen/MachineFunctionPass.h"
2158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/CodeGen/MachineInstr.h"
22eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h"
2358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/TargetMachine.h"
2458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner#include "llvm/Target/MRegisterInfo.h"
258bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h"
263501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h"
2758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
3058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnernamespace {
31f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner  struct PEI : public MachineFunctionPass {
32f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner    const char *getPassName() const {
33f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner      return "Prolog/Epilog Insertion & Frame Finalization";
3458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
3558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
3658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    /// runOnMachineFunction - Insert prolog/epilog code and replace abstract
3758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    /// frame indexes with appropriate references.
3858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    ///
3958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    bool runOnMachineFunction(MachineFunction &Fn) {
4058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Scan the function for modified caller saved registers and insert spill
4158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // code for any caller saved registers that are modified.  Also calculate
4258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // the MaxCallFrameSize and HasCalls variables for the function's frame
4358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // information and eliminates call frame pseudo instructions.
4458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      saveCallerSavedRegisters(Fn);
4558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
4658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Allow the target machine to make final modifications to the function
4758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // before the frame layout is finalized.
4858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      Fn.getTarget().getRegisterInfo()->processFunctionBeforeFrameFinalized(Fn);
4958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
5058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Calculate actual frame offsets for all of the abstract stack objects...
5158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      calculateFrameObjectOffsets(Fn);
5258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
534ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      // Add prolog and epilog code to the function.
544ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      insertPrologEpilogCode(Fn);
554ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
5658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Replace all MO_FrameIndex operands with physical register references
5758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // and actual offsets.
5858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      //
5958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      replaceFrameIndices(Fn);
6058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      return true;
6158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
6258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
6358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  private:
6458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void saveCallerSavedRegisters(MachineFunction &Fn);
6558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void calculateFrameObjectOffsets(MachineFunction &Fn);
6658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void replaceFrameIndices(MachineFunction &Fn);
6758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void insertPrologEpilogCode(MachineFunction &Fn);
6858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  };
6958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
7058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
71d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
7258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// createPrologEpilogCodeInserter - This function returns a pass that inserts
7358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// prolog and epilog code, and eliminates abstract frame references.
7458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
7519df3876e6dce016ec4c5ab28320a246ab285001Brian GaekeFunctionPass *createPrologEpilogCodeInserter() { return new PEI(); }
7658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
7758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
7858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// saveCallerSavedRegisters - Scan the function for modified caller saved
7958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// registers and insert spill code for any caller saved registers that are
8058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// modified.  Also calculate the MaxCallFrameSize and HasCalls variables for
8158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// the function's frame information and eliminates call frame pseudo
8258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// instructions.
8358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
8458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::saveCallerSavedRegisters(MachineFunction &Fn) {
8558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
8658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetFrameInfo &FrameInfo = Fn.getTarget().getFrameInfo();
8758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
8858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Get the callee saved register list...
8958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const unsigned *CSRegs = RegInfo->getCalleeSaveRegs();
9058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
9158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Get the function call frame set-up and tear-down instruction opcode
9258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int FrameSetupOpcode   = RegInfo->getCallFrameSetupOpcode();
9358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode();
9458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
9558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Early exit for targets which have no callee saved registers and no call
9658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // frame setup/destroy pseudo instructions.
9758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if ((CSRegs == 0 || CSRegs[0] == 0) &&
9858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      FrameSetupOpcode == -1 && FrameDestroyOpcode == -1)
9958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;
10058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
10158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // This bitset contains an entry for each physical register for the target...
10258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<bool> ModifiedRegs(MRegisterInfo::FirstVirtualRegister);
10358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  unsigned MaxCallFrameSize = 0;
10458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  bool HasCalls = false;
10558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
10658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
10758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); )
10858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      if ((*I)->getOpcode() == FrameSetupOpcode ||
10958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  (*I)->getOpcode() == FrameDestroyOpcode) {
11058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	assert((*I)->getNumOperands() == 1 && "Call Frame Setup/Destroy Pseudo"
11158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	       " instructions should have a single immediate argument!");
11258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	unsigned Size = (*I)->getOperand(0).getImmedValue();
11358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if (Size > MaxCallFrameSize) MaxCallFrameSize = Size;
11458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	HasCalls = true;
11558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	RegInfo->eliminateCallFramePseudoInstr(Fn, *BB, I);
11658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      } else {
11758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	for (unsigned i = 0, e = (*I)->getNumOperands(); i != e; ++i) {
11858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MachineOperand &MO = (*I)->getOperand(i);
1191cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner	  if (MO.isRegister() && MO.isDef()) {
1201cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner            assert(MRegisterInfo::isPhysicalRegister(MO.getReg()) &&
1211cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner                   "Register allocation must be performed!");
12258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	    ModifiedRegs[MO.getReg()] = true;         // Register is modified
1231cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner          }
1241cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner        }
12558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	++I;
12658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
12758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
128eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner  MachineFrameInfo *FFI = Fn.getFrameInfo();
12958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setHasCalls(HasCalls);
13058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setMaxCallFrameSize(MaxCallFrameSize);
13158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
13258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now figure out which *callee saved* registers are modified by the current
13358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // function, thus needing to be saved and restored in the prolog/epilog.
13458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  //
13558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<unsigned> RegsToSave;
13658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0; CSRegs[i]; ++i) {
13758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Reg = CSRegs[i];
13858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    if (ModifiedRegs[Reg]) {
13958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      RegsToSave.push_back(Reg);  // If modified register...
14073ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos    } else {
14173ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos      for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
14273ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos           *AliasSet; ++AliasSet) {  // Check alias registers too...
14373ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos	if (ModifiedRegs[*AliasSet]) {
14458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  RegsToSave.push_back(Reg);
14558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
14658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
14773ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos      }
14873ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos    }
14958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
15058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (RegsToSave.empty())
15258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;   // Early exit if no caller saved registers are modified!
15358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we know which registers need to be saved and restored, allocate
15558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // stack slots for them.
15658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<int> StackSlots;
15758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
158f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner    int FrameIdx = FFI->CreateStackObject(RegInfo->getRegClass(RegsToSave[i]));
15958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    StackSlots.push_back(FrameIdx);
16058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
16158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we have a stack slot for each register to be saved, insert spill
16358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // code into the entry block...
16458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock *MBB = Fn.begin();
16558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock::iterator I = MBB->begin();
16658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
16758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
16858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // Insert the spill to the stack frame...
17058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    RegInfo->storeRegToStackSlot(*MBB, I, RegsToSave[i], StackSlots[i], RC);
17158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
17258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
17358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Add code to restore the callee-save registers in each exiting block.
1743501feab811c86c9659248a4875fc31a3165f84dChris Lattner  const TargetInstrInfo &TII = Fn.getTarget().getInstrInfo();
17558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator FI = Fn.begin(), E = Fn.end(); FI != E; ++FI) {
17658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // If last instruction is a return instruction, add an epilogue
177b589bf7d77a57e961a871ae5ffee2381722d8c0fChris Lattner    if (!FI->empty() && TII.isReturn(FI->back()->getOpcode())) {
17858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      MBB = FI; I = MBB->end()-1;
17958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
18058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
18158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
18258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	RegInfo->loadRegFromStackSlot(*MBB, I, RegsToSave[i],StackSlots[i], RC);
18358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	--I;  // Insert in reverse order
18458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
18558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
18658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
18758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
18858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
18958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the
19158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// abstract stack objects...
19258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
19358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
19458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetFrameInfo &TFI = Fn.getTarget().getFrameInfo();
19558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
19658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  bool StackGrowsDown =
19758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    TFI.getStackGrowthDirection() == TargetFrameInfo::StackGrowsDown;
19858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(StackGrowsDown && "Only tested on stack down growing targets!");
19958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
20058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Loop over all of the stack objects, assigning sequential addresses...
201eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner  MachineFrameInfo *FFI = Fn.getFrameInfo();
20258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
203f85249ca7336cda5bd491c161cb163847774e868Chris Lattner  unsigned StackAlignment = TFI.getStackAlignment();
20478d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner
20558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Start at the beginning of the local area...
2064ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  int Offset = TFI.getOffsetOfLocalArea();
20758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
20858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset += FFI->getObjectSize(i);         // Allocate Size bytes...
20958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
21058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Align = FFI->getObjectAlignment(i);
211f85249ca7336cda5bd491c161cb163847774e868Chris Lattner    assert(Align <= StackAlignment && "Cannot align stack object to higher "
21278d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner           "alignment boundary than the stack itself!");
21358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset = (Offset+Align-1)/Align*Align;   // Adjust to Alignment boundary...
21458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
21558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    FFI->setObjectOffset(i, -Offset);        // Set the computed offset
21658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
21758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
21858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Align the final stack pointer offset...
21978d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner  Offset = (Offset+StackAlignment-1)/StackAlignment*StackAlignment;
22058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
22158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Set the final value of the stack pointer...
2224ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  FFI->setStackSize(Offset-TFI.getOffsetOfLocalArea());
2234ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner}
2244ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2254ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2264ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// insertPrologEpilogCode - Scan the function for modified caller saved
2274ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// registers, insert spill code for these caller saved registers, then add
2284ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// prolog and epilog code to the function.
2294ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner///
2304ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattnervoid PEI::insertPrologEpilogCode(MachineFunction &Fn) {
2314ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add prologue to the function...
2324ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  Fn.getTarget().getRegisterInfo()->emitPrologue(Fn);
2334ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2344ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add epilogue to restore the callee-save registers in each exiting block
2354ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  const TargetInstrInfo &TII = Fn.getTarget().getInstrInfo();
2364ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
2374ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner    // If last instruction is a return instruction, add an epilogue
2380416d2a70aea644c3e0c06301c29f3b81ec1e42dChris Lattner    if (!I->empty() && TII.isReturn(I->back()->getOpcode()))
2394ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      Fn.getTarget().getRegisterInfo()->emitEpilogue(Fn, *I);
2404ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  }
24158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
24258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
24358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
24458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// replaceFrameIndices - Replace all MO_FrameIndex operands with physical
24558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// register references and actual offsets.
24658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
24758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::replaceFrameIndices(MachineFunction &Fn) {
24858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (!Fn.getFrameInfo()->hasStackObjects()) return; // Nothing to do?
24958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
25058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetMachine &TM = Fn.getTarget();
25158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
25258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo &MRI = *TM.getRegisterInfo();
25358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
25458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
25558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
25658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      for (unsigned i = 0, e = (*I)->getNumOperands(); i != e; ++i)
25758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if ((*I)->getOperand(i).isFrameIndex()) {
25858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // If this instruction has a FrameIndex operand, we need to use that
25958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // target machine register info object to eliminate it.
26058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MRI.eliminateFrameIndex(Fn, I);
26158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
26258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
26358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
264d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
265d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
266