PrologEpilogInserter.cpp revision 7f7bbc2fdb833485ac3d865a405fd948e58e8ddb
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
19958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Loop over all of the stack objects, assigning sequential addresses...
200eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner  MachineFrameInfo *FFI = Fn.getFrameInfo();
20158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
202f85249ca7336cda5bd491c161cb163847774e868Chris Lattner  unsigned StackAlignment = TFI.getStackAlignment();
20378d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner
20405d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // Start at the beginning of the local area.
205577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  // The Offset is the distance from the stack top in the direction
206577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  // of stack growth -- so it's always positive.
2074ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  int Offset = TFI.getOffsetOfLocalArea();
208577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  if (StackGrowsDown)
2097f7bbc2fdb833485ac3d865a405fd948e58e8ddbChris Lattner    Offset = -Offset;
210577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  assert(Offset >= 0
211577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner         && "Local area offset should be in direction of stack growth");
212577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner
213577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  // If there are fixed sized objects that are preallocated in the local area,
214577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  // non-fixed objects can't be allocated right at the start of local area.
215577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  // We currently don't support filling in holes in between fixed sized objects,
216577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner  // so we adjust 'Offset' to point to the end of last fixed sized
21705d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  // preallocated object.
21805d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  for (int i = FFI->getObjectIndexBegin(); i != 0; ++i) {
219577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    int FixedOff;
220577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    if (StackGrowsDown) {
221577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      // The maximum distance from the stack pointer is at lower address of
222577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      // the object -- which is given by offset. For down growing stack
223577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      // the offset is negative, so we negate the offset to get the distance.
224577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      FixedOff = -FFI->getObjectOffset(i);
225577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    } else {
226577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      // The maximum distance from the start pointer is at the upper
227577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      // address of the object.
228577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      FixedOff = FFI->getObjectOffset(i) + FFI->getObjectSize(i);
229577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    }
230577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    if (FixedOff > Offset) Offset = FixedOff;
23105d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner  }
23205d8350c12d8d81de1d8af6f7da155bc1c1da50eChris Lattner
23358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (unsigned i = 0, e = FFI->getObjectIndexEnd(); i != e; ++i) {
234577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    // If stack grows down, we need to add size of find the lowest
235577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    // address of the object.
236577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    if (StackGrowsDown)
237577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      Offset += FFI->getObjectSize(i);
23858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
23958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    unsigned Align = FFI->getObjectAlignment(i);
240f85249ca7336cda5bd491c161cb163847774e868Chris Lattner    assert(Align <= StackAlignment && "Cannot align stack object to higher "
24178d6db5627bdf41ab3ffd96133821647dbc60d53Chris Lattner           "alignment boundary than the stack itself!");
24258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    Offset = (Offset+Align-1)/Align*Align;   // Adjust to Alignment boundary...
24358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
244577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    if (StackGrowsDown) {
245577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      FFI->setObjectOffset(i, -Offset);        // Set the computed offset
246577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    } else {
247577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      FFI->setObjectOffset(i, Offset);
248577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner      Offset += FFI->getObjectSize(i);
249577aec14288b86ab1fb07e164375ebc7d3038cb7Chris Lattner    }
25058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  }
25158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
25293799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  // Align the final stack pointer offset, but only if there are calls in the
25393799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  // function.  This ensures that any calls to subroutines have their stack
25493799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  // frames suitable aligned.
25593799292c1c04c53ff077a427737b3ffbd0445abChris Lattner  if (FFI->hasCalls())
25693799292c1c04c53ff077a427737b3ffbd0445abChris Lattner    Offset = (Offset+StackAlignment-1)/StackAlignment*StackAlignment;
25758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
25858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  // Set the final value of the stack pointer...
2597f7bbc2fdb833485ac3d865a405fd948e58e8ddbChris Lattner  FFI->setStackSize(Offset+TFI.getOffsetOfLocalArea());
2604ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner}
2614ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2624ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2634ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// insertPrologEpilogCode - Scan the function for modified caller saved
2644ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// registers, insert spill code for these caller saved registers, then add
2654ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner/// prolog and epilog code to the function.
2664ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner///
2674ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattnervoid PEI::insertPrologEpilogCode(MachineFunction &Fn) {
2684ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add prologue to the function...
2694ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  Fn.getTarget().getRegisterInfo()->emitPrologue(Fn);
2704ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner
2714ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  // Add epilogue to restore the callee-save registers in each exiting block
2729bcdcd17c7219dbc68de2f11ca2de86471c8c390Chris Lattner  const TargetInstrInfo &TII = *Fn.getTarget().getInstrInfo();
2734ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) {
2744ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner    // If last instruction is a return instruction, add an epilogue
275c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos    if (!I->empty() && TII.isReturn(I->back().getOpcode()))
2764ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner      Fn.getTarget().getRegisterInfo()->emitEpilogue(Fn, *I);
2774ac7d7302b36a5d20f71b5c290c63a7f6c345289Chris Lattner  }
27858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
27958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
28058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
28158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// replaceFrameIndices - Replace all MO_FrameIndex operands with physical
28258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner/// register references and actual offsets.
28358b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner///
28458b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattnervoid PEI::replaceFrameIndices(MachineFunction &Fn) {
28558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  if (!Fn.getFrameInfo()->hasStackObjects()) return; // Nothing to do?
28658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
28758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const TargetMachine &TM = Fn.getTarget();
28858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  assert(TM.getRegisterInfo() && "TM::getRegisterInfo() must be implemented!");
28958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  const MRegisterInfo &MRI = *TM.getRegisterInfo();
29058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner
29158b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner  for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB)
29258b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner    for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ++I)
293c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos      for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
294c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos	if (I->getOperand(i).isFrameIndex()) {
29558b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // If this instruction has a FrameIndex operand, we need to use that
29658b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  // target machine register info object to eliminate it.
29758b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  MRI.eliminateFrameIndex(Fn, I);
29858b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	  break;
29958b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner	}
30058b3328ac709a5706a8bfa522012ed90f1b4d4bdChris Lattner}
301