16db0dea22585a1b7577f24a97e60769e65e0a342Michael Gottesman//===-- PrologEpilogInserter.h - Prolog/Epilog code insertion -*- C++ -*---===// 2378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// 3378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// The LLVM Compiler Infrastructure 4378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// 5378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// This file is distributed under the University of Illinois Open Source 6378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// License. See LICENSE.TXT for details. 7378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// 8378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby//===----------------------------------------------------------------------===// 9378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// 10378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// This pass is responsible for finalizing the functions frame layout, saving 11378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// callee saved registers, and for emitting prolog & epilog code for the 12378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// function. 13378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// 14378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// This pass must be run after register allocation. After this pass is 15378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// executed, it is illegal to construct MO_FrameIndex operands. 16378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby// 17378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby//===----------------------------------------------------------------------===// 18378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 19378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby#ifndef LLVM_CODEGEN_PEI_H 20378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby#define LLVM_CODEGEN_PEI_H 21378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 22a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/DenseMap.h" 23a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/SparseBitVector.h" 24378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby#include "llvm/CodeGen/MachineFunctionPass.h" 25378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby#include "llvm/CodeGen/MachineLoopInfo.h" 26a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/CodeGen/Passes.h" 27b58f498f7502e7e1833decbbbb4df771367c7341Jim Grosbach#include "llvm/Target/TargetRegisterInfo.h" 28378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 29378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosbynamespace llvm { 30378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby class RegScavenger; 31378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby class MachineBasicBlock; 32378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 3355c06ae7afa3f862a6bb4a4441fe485c135f5b5eBenjamin Kramer class PEI : public MachineFunctionPass { 34378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby public: 35378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby static char ID; 36081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson PEI() : MachineFunctionPass(ID) { 37081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializePEIPass(*PassRegistry::getPassRegistry()); 38081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson } 39378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override; 41378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 42378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby /// runOnMachineFunction - Insert prolog/epilog code and replace abstract 43378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby /// frame indexes with appropriate references. 44378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby /// 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnMachineFunction(MachineFunction &Fn) override; 46378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 47378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby private: 48378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby RegScavenger *RS; 49378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 50378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby // MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved 51378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby // stack frame indexes. 52378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby unsigned MinCSFrameIndex, MaxCSFrameIndex; 53378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 54378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby // Entry and return blocks of the current function. 55378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby MachineBasicBlock* EntryBlock; 56378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby SmallVector<MachineBasicBlock*, 4> ReturnBlocks; 57378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 5865c58daa8b8985d2116216043103009815a55e77Jim Grosbach // Flag to control whether to use the register scavenger to resolve 5965c58daa8b8985d2116216043103009815a55e77Jim Grosbach // frame index materialization registers. Set according to 6065c58daa8b8985d2116216043103009815a55e77Jim Grosbach // TRI->requiresFrameIndexScavenging() for the curren function. 6165c58daa8b8985d2116216043103009815a55e77Jim Grosbach bool FrameIndexVirtualScavenging; 6265c58daa8b8985d2116216043103009815a55e77Jim Grosbach 6383dd2ae095626d8e461f8a69214ec2b97ff18c2fRafael Espindola void calculateSets(MachineFunction &Fn); 6433b350bf24be396a127c81af045468765731afc7Anton Korobeynikov void calculateCallsInformation(MachineFunction &Fn); 65378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby void calculateCalleeSavedRegisters(MachineFunction &Fn); 66378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby void insertCSRSpillsAndRestores(MachineFunction &Fn); 67378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby void calculateFrameObjectOffsets(MachineFunction &Fn); 68378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby void replaceFrameIndices(MachineFunction &Fn); 69da07e9df843015f8c306ed7863dbb8c8055fd85fManman Ren void replaceFrameIndices(MachineBasicBlock *BB, MachineFunction &Fn, 70da07e9df843015f8c306ed7863dbb8c8055fd85fManman Ren int &SPAdj); 713d6cb88a64fe67064de206405951eb326d86fc0cJim Grosbach void scavengeFrameVirtualRegs(MachineFunction &Fn); 72378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby void insertPrologEpilogCode(MachineFunction &Fn); 73378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby 74378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby // Convenience for recognizing return blocks. 75378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby bool isReturnBlock(MachineBasicBlock* MBB); 76378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby }; 77378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby} // End llvm namespace 78378553cb079aba2b8dee5d52b5166316d4132d5aJohn Mosby#endif 79