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