| //===-- BranchFolding.h - Fold machine code branch instructions --*- C++ -*===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_CODEGEN_BRANCHFOLDING_HPP | |
| #define LLVM_CODEGEN_BRANCHFOLDING_HPP | |
| #include "llvm/ADT/SmallPtrSet.h" | |
| #include "llvm/CodeGen/MachineBasicBlock.h" | |
| #include <vector> | |
| namespace llvm { | |
| class MachineFunction; | |
| class MachineModuleInfo; | |
| class RegScavenger; | |
| class TargetInstrInfo; | |
| class TargetRegisterInfo; | |
| class BranchFolder { | |
| public: | |
| explicit BranchFolder(bool defaultEnableTailMerge, bool CommonHoist); | |
| bool OptimizeFunction(MachineFunction &MF, | |
| const TargetInstrInfo *tii, | |
| const TargetRegisterInfo *tri, | |
| MachineModuleInfo *mmi); | |
| private: | |
| class MergePotentialsElt { | |
| unsigned Hash; | |
| MachineBasicBlock *Block; | |
| public: | |
| MergePotentialsElt(unsigned h, MachineBasicBlock *b) | |
| : Hash(h), Block(b) {} | |
| unsigned getHash() const { return Hash; } | |
| MachineBasicBlock *getBlock() const { return Block; } | |
| void setBlock(MachineBasicBlock *MBB) { | |
| Block = MBB; | |
| } | |
| bool operator<(const MergePotentialsElt &) const; | |
| }; | |
| typedef std::vector<MergePotentialsElt>::iterator MPIterator; | |
| std::vector<MergePotentialsElt> MergePotentials; | |
| SmallPtrSet<const MachineBasicBlock*, 2> TriedMerging; | |
| class SameTailElt { | |
| MPIterator MPIter; | |
| MachineBasicBlock::iterator TailStartPos; | |
| public: | |
| SameTailElt(MPIterator mp, MachineBasicBlock::iterator tsp) | |
| : MPIter(mp), TailStartPos(tsp) {} | |
| MPIterator getMPIter() const { | |
| return MPIter; | |
| } | |
| MergePotentialsElt &getMergePotentialsElt() const { | |
| return *getMPIter(); | |
| } | |
| MachineBasicBlock::iterator getTailStartPos() const { | |
| return TailStartPos; | |
| } | |
| unsigned getHash() const { | |
| return getMergePotentialsElt().getHash(); | |
| } | |
| MachineBasicBlock *getBlock() const { | |
| return getMergePotentialsElt().getBlock(); | |
| } | |
| bool tailIsWholeBlock() const { | |
| return TailStartPos == getBlock()->begin(); | |
| } | |
| void setBlock(MachineBasicBlock *MBB) { | |
| getMergePotentialsElt().setBlock(MBB); | |
| } | |
| void setTailStartPos(MachineBasicBlock::iterator Pos) { | |
| TailStartPos = Pos; | |
| } | |
| }; | |
| std::vector<SameTailElt> SameTails; | |
| bool EnableTailMerge; | |
| bool EnableHoistCommonCode; | |
| const TargetInstrInfo *TII; | |
| const TargetRegisterInfo *TRI; | |
| MachineModuleInfo *MMI; | |
| RegScavenger *RS; | |
| bool TailMergeBlocks(MachineFunction &MF); | |
| bool TryTailMergeBlocks(MachineBasicBlock* SuccBB, | |
| MachineBasicBlock* PredBB); | |
| void MaintainLiveIns(MachineBasicBlock *CurMBB, | |
| MachineBasicBlock *NewMBB); | |
| void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst, | |
| MachineBasicBlock *NewDest); | |
| MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB, | |
| MachineBasicBlock::iterator BBI1); | |
| unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength, | |
| MachineBasicBlock *SuccBB, | |
| MachineBasicBlock *PredBB); | |
| void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB, | |
| MachineBasicBlock* PredBB); | |
| bool CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB, | |
| unsigned maxCommonTailLength, | |
| unsigned &commonTailIndex); | |
| bool OptimizeBranches(MachineFunction &MF); | |
| bool OptimizeBlock(MachineBasicBlock *MBB); | |
| void RemoveDeadBlock(MachineBasicBlock *MBB); | |
| bool OptimizeImpDefsBlock(MachineBasicBlock *MBB); | |
| bool HoistCommonCode(MachineFunction &MF); | |
| bool HoistCommonCodeInSuccs(MachineBasicBlock *MBB); | |
| }; | |
| } | |
| #endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */ |