| //===-- 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 */ |