PrologEpilogInserter.cpp revision 9bcdcd17c7219dbc68de2f11ca2de86471c8c390
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"
2705d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattnerusing namespace llvm;
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
2958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnernamespace {
30f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner  struct PEI : public MachineFunctionPass {
31f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner    const char *getPassName() const {
32f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner      return "Prolog/Epilog Insertion & Frame Finalization";
3358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
3458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
3558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    /// runOnMachineFunction - Insert prolog/epilog code and replace abstract
3658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    /// frame indexes with appropriate references.
3758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    ///
3858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    bool runOnMachineFunction(MachineFunction &Fn) {
3958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Scan the function for modified caller saved registers and insert spill
4058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // code for any caller saved registers that are modified.  Also calculate
4158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // the MaxCallFrameSize and HasCalls variables for the function's frame
4258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // information and eliminates call frame pseudo instructions.
4358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      saveCallerSavedRegisters(Fn);
4458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
4558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Allow the target machine to make final modifications to the function
4658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // before the frame layout is finalized.
4758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      Fn.getTarget().getRegisterInfo()->processFunctionBeforeFrameFinalized(Fn);
4858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
4958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Calculate actual frame offsets for all of the abstract stack objects...
5058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      calculateFrameObjectOffsets(Fn);
5158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
524ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      // Add prolog and epilog code to the function.
534ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      insertPrologEpilogCode(Fn);
544ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
5558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // Replace all MO_FrameIndex operands with physical register references
5658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      // and actual offsets.
5758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      //
5858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      replaceFrameIndices(Fn);
5958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      return true;
6058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    }
6158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
6258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  private:
6358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void saveCallerSavedRegisters(MachineFunction &Fn);
6458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void calculateFrameObjectOffsets(MachineFunction &Fn);
6558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void replaceFrameIndices(MachineFunction &Fn);
6658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    void insertPrologEpilogCode(MachineFunction &Fn);
6758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  };
6858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
6958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
70d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
7158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// createPrologEpilogCodeInserter - This function returns a pass that inserts
7258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// prolog and epilog code, and eliminates abstract frame references.
7358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
7405d8350c12d8d81de1d8af6f7da155bc1c1da50eChris LattnerFunctionPass *llvm::createPrologEpilogCodeInserter() { return new PEI(); }
7558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
7658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
7758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// saveCallerSavedRegisters - Scan the function for modified caller saved
7858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// registers and insert spill code for any caller saved registers that are
7958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// modified.  Also calculate the MaxCallFrameSize and HasCalls variables for
8058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// the function's frame information and eliminates call frame pseudo
8158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// instructions.
8258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
8358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::saveCallerSavedRegisters(MachineFunction &Fn) {
8458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
859bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner  const TargetFrameInfo &FrameInfo = *Fn.getTarget().getFrameInfo();
8658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
8758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Get the callee saved register list...
8858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const unsigned *CSRegs = RegInfo->getCalleeSaveRegs();
8958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
9058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Get the function call frame set-up and tear-down instruction opcode
9158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int FrameSetupOpcode   = RegInfo->getCallFrameSetupOpcode();
9258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  int FrameDestroyOpcode = RegInfo->getCallFrameDestroyOpcode();
9358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
9458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Early exit for targets which have no callee saved registers and no call
9558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // frame setup/destroy pseudo instructions.
9658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if ((CSRegs == 0 || CSRegs[0] == 0) &&
9758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      FrameSetupOpcode == -1 && FrameDestroyOpcode == -1)
9858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;
9958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
10058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // This bitset contains an entry for each physical register for the target...
101859a18b5833f3566799313ecba8db4916500485bAlkis Evlogimenos  std::vector<bool> ModifiedRegs(RegInfo->getNumRegs());
10258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  unsigned MaxCallFrameSize = 0;
10358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  bool HasCalls = false;
10458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
10558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
10658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); )
107c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos      if (I->getOpcode() == FrameSetupOpcode ||
108c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	  I->getOpcode() == FrameDestroyOpcode) {
109c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	assert(I->getNumOperands() == 1 && "Call Frame Setup/Destroy Pseudo"
11058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	       " instructions should have a single immediate argument!");
111c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	unsigned Size = I->getOperand(0).getImmedValue();
11258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	if (Size > MaxCallFrameSize) MaxCallFrameSize = Size;
11358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	HasCalls = true;
114c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	RegInfo->eliminateCallFramePseudoInstr(Fn, *BB, I++);
11558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      } else {
116c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i) {
117c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	  MachineOperand &MO = I->getOperand(i);
1181cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner	  if (MO.isRegister() && MO.isDef()) {
1191cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner            assert(MRegisterInfo::isPhysicalRegister(MO.getReg()) &&
1201cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner                   "Register allocation must be performed!");
12158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	    ModifiedRegs[MO.getReg()] = true;         // Register is modified
1221cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner          }
1231cbe4d0ad0888e50858cca83cf2a0d3083709513Chris Lattner        }
12458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	++I;
12558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      }
12658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
127eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner  MachineFrameInfo *FFI = Fn.getFrameInfo();
12858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setHasCalls(HasCalls);
12958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  FFI->setMaxCallFrameSize(MaxCallFrameSize);
13058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
13158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now figure out which *callee saved* registers are modified by the current
13258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // function, thus needing to be saved and restored in the prolog/epilog.
13358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  //
13458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<unsigned> RegsToSave;
13558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0; CSRegs[i]; ++i) {
13658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Reg = CSRegs[i];
13758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    if (ModifiedRegs[Reg]) {
13858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner      RegsToSave.push_back(Reg);  // If modified register...
13973ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos    } else {
14073ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos      for (const unsigned *AliasSet = RegInfo->getAliasSet(Reg);
14173ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos           *AliasSet; ++AliasSet) {  // Check alias registers too...
14273ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos	if (ModifiedRegs[*AliasSet]) {
14358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  RegsToSave.push_back(Reg);
14458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
14558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
14673ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos      }
14773ff5120eb8b8c0ccbfed8a17f1024c67a75f319Alkis Evlogimenos    }
14858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
14958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (RegsToSave.empty())
15158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    return;   // Early exit if no caller saved registers are modified!
15258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
15358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we know which registers need to be saved and restored, allocate
15458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // stack slots for them.
15558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  std::vector<int> StackSlots;
15658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
157f00a3f905e8cd99ab4d3dbbde1a9d510516e0fa2Chris Lattner    int FrameIdx = FFI->CreateStackObject(RegInfo->getRegClass(RegsToSave[i]));
15858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    StackSlots.push_back(FrameIdx);
15958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
16058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Now that we have a stack slot for each register to be saved, insert spill
16258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // code into the entry block...
16358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock *MBB = Fn.begin();
16458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  MachineBasicBlock::iterator I = MBB->begin();
16558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = RegsToSave.size(); i != e; ++i) {
16658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    const TargetRegisterClass *RC = RegInfo->getRegClass(RegsToSave[i]);
16758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
16858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // Insert the spill to the stack frame...
16958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    RegInfo->storeRegToStackSlot(*MBB, I, RegsToSave[i], StackSlots[i], RC);
17058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
17158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
17258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Add code to restore the callee-save registers in each exiting block.
1739bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner  const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
17458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator FI = Fn.begin(), E = Fn.end(); FI != E; ++FI) {
17558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    // If last instruction is a return instruction, add an epilogue
176c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos    if (!FI->empty() && TII.isReturn(FI->back().getOpcode())) {
177c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos      MBB = FI;
178c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos      I = MBB->end(); --I;
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) {
1949bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris 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
20505d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // Start at the beginning of the local area.
2064ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  int Offset = TFI.getOffsetOfLocalArea();
20705d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner
20805d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // Check to see if there are any fixed sized objects that are preallocated in
20905d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // the local area.  We currently don't support filling in holes in between
21005d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // fixed sized objects, so we just skip to the end of the last fixed sized
21105d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // preallocated object.
21205d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  for (int i = FFI->getObjectIndexBegin(); i != 0; ++i) {
21305d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner    int FixedOff = -FFI->getObjectOffset(i);
21405d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner    if (FixedOff > Offset) Offset = FixedOff;
21505d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  }
21605d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner
21758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
21858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset += FFI->getObjectSize(i);         // Allocate Size bytes...
21958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
22058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Align = FFI->getObjectAlignment(i);
221f85249ca7336cda5bd491c161cb163847774e868Chris Lattner    assert(Align <= StackAlignment && "Cannot align stack object to higher "
22278d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner           "alignment boundary than the stack itself!");
22358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset = (Offset+Align-1)/Align*Align;   // Adjust to Alignment boundary...
22458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
22558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    FFI->setObjectOffset(i, -Offset);        // Set the computed offset
22658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
22758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
22893799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  // Align the final stack pointer offset, but only if there are calls in the
22993799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  // function.  This ensures that any calls to subroutines have their stack
23093799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  // frames suitable aligned.
23193799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  if (FFI->hasCalls())
23293799292c1c04c53ff077a427737b3ffbd0445abChris Lattner    Offset = (Offset+StackAlignment-1)/StackAlignment*StackAlignment;
23358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
23458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Set the final value of the stack pointer...
2354ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  FFI->setStackSize(Offset-TFI.getOffsetOfLocalArea());
2364ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner}
2374ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2384ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2394ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// insertPrologEpilogCode - Scan the function for modified caller saved
2404ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// registers, insert spill code for these caller saved registers, then add
2414ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// prolog and epilog code to the function.
2424ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner///
2434ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattnervoid PEI::insertPrologEpilogCode(MachineFunction &Fn) {
2444ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add prologue to the function...
2454ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  Fn.getTarget().getRegisterInfo()->emitPrologue(Fn);
2464ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2474ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add epilogue to restore the callee-save registers in each exiting block
2489bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner  const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
2494ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
2504ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner    // If last instruction is a return instruction, add an epilogue
251c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos    if (!I->empty() && TII.isReturn(I->back().getOpcode()))
2524ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      Fn.getTarget().getRegisterInfo()->emitEpilogue(Fn, *I);
2534ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  }
25458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
25558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
25658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
25758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// replaceFrameIndices - Replace all MO_FrameIndex operands with physical
25858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// register references and actual offsets.
25958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
26058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::replaceFrameIndices(MachineFunction &Fn) {
26158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (!Fn.getFrameInfo()->hasStackObjects()) return; // Nothing to do?
26258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
26358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetMachine &TM = Fn.getTarget();
26458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
26558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo &MRI = *TM.getRegisterInfo();
26658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
26758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
26858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
269c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos      for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
270c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	if (I->getOperand(i).isFrameIndex()) {
27158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // If this instruction has a FrameIndex operand, we need to use that
27258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // target machine register info object to eliminate it.
27358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MRI.eliminateFrameIndex(Fn, I);
27458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
27558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
27658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
277