PrologEpilogInserter.h [plain text]
#ifndef LLVM_CODEGEN_PEI_H
#define LLVM_CODEGEN_PEI_H
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/ADT/SparseBitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/Target/TargetRegisterInfo.h"
namespace llvm {
class RegScavenger;
class MachineBasicBlock;
class PEI : public MachineFunctionPass {
public:
static char ID;
PEI() : MachineFunctionPass(ID) {
initializePEIPass(*PassRegistry::getPassRegistry());
}
const char *getPassName() const {
return "Prolog/Epilog Insertion & Frame Finalization";
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const;
bool runOnMachineFunction(MachineFunction &Fn);
private:
RegScavenger *RS;
unsigned MinCSFrameIndex, MaxCSFrameIndex;
typedef SparseBitVector<> CSRegSet;
typedef DenseMap<MachineBasicBlock*, CSRegSet> CSRegBlockMap;
CSRegSet UsedCSRegs;
CSRegBlockMap CSRUsed;
CSRegBlockMap AnticIn, AnticOut;
CSRegBlockMap AvailIn, AvailOut;
CSRegBlockMap CSRSave;
CSRegBlockMap CSRRestore;
MachineBasicBlock* EntryBlock;
SmallVector<MachineBasicBlock*, 4> ReturnBlocks;
DenseMap<MachineBasicBlock*, MachineLoop*> TLLoops;
bool ShrinkWrapThisFunction;
bool FrameIndexVirtualScavenging;
#ifndef NDEBUG
MachineFunction* MF;
bool HasFastExitPath;
#endif
bool calculateSets(MachineFunction &Fn);
bool calcAnticInOut(MachineBasicBlock* MBB);
bool calcAvailInOut(MachineBasicBlock* MBB);
void calculateAnticAvail(MachineFunction &Fn);
bool addUsesForMEMERegion(MachineBasicBlock* MBB,
SmallVector<MachineBasicBlock*, 4>& blks);
bool addUsesForTopLevelLoops(SmallVector<MachineBasicBlock*, 4>& blks);
bool calcSpillPlacements(MachineBasicBlock* MBB,
SmallVector<MachineBasicBlock*, 4> &blks,
CSRegBlockMap &prevSpills);
bool calcRestorePlacements(MachineBasicBlock* MBB,
SmallVector<MachineBasicBlock*, 4> &blks,
CSRegBlockMap &prevRestores);
void placeSpillsAndRestores(MachineFunction &Fn);
void placeCSRSpillsAndRestores(MachineFunction &Fn);
void calculateCallsInformation(MachineFunction &Fn);
void calculateCalleeSavedRegisters(MachineFunction &Fn);
void insertCSRSpillsAndRestores(MachineFunction &Fn);
void calculateFrameObjectOffsets(MachineFunction &Fn);
void replaceFrameIndices(MachineFunction &Fn);
void scavengeFrameVirtualRegs(MachineFunction &Fn);
void insertPrologEpilogCode(MachineFunction &Fn);
void clearAnticAvailSets();
void clearAllSets();
void initShrinkWrappingInfo();
MachineBasicBlock* getTopLevelLoopPreheader(MachineLoop* LP);
MachineLoop* getTopLevelLoopParent(MachineLoop *LP);
void propagateUsesAroundLoop(MachineBasicBlock* MBB, MachineLoop* LP);
bool isReturnBlock(MachineBasicBlock* MBB);
#ifndef NDEBUG
void findFastExitPath();
void verifySpillRestorePlacement();
std::string getBasicBlockName(const MachineBasicBlock* MBB);
std::string stringifyCSRegSet(const CSRegSet& s);
void dumpSet(const CSRegSet& s);
void dumpUsed(MachineBasicBlock* MBB);
void dumpAllUsed();
void dumpSets(MachineBasicBlock* MBB);
void dumpSets1(MachineBasicBlock* MBB);
void dumpAllSets();
void dumpSRSets();
#endif
};
} #endif