123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- //===-- 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_LIB_CODEGEN_BRANCHFOLDING_H
- #define LLVM_LIB_CODEGEN_BRANCHFOLDING_H
- #include "llvm/ADT/SmallPtrSet.h"
- #include "llvm/CodeGen/MachineBasicBlock.h"
- #include "llvm/Support/BlockFrequency.h"
- #include <vector>
- namespace llvm {
- class MachineBlockFrequencyInfo;
- class MachineBranchProbabilityInfo;
- class MachineFunction;
- class MachineModuleInfo;
- class RegScavenger;
- class TargetInstrInfo;
- class TargetRegisterInfo;
- class LLVM_LIBRARY_VISIBILITY BranchFolder {
- public:
- explicit BranchFolder(bool defaultEnableTailMerge, bool CommonHoist,
- const MachineBlockFrequencyInfo &MBFI,
- const MachineBranchProbabilityInfo &MBPI);
- 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;
- /// \brief This class keeps track of branch frequencies of newly created
- /// blocks and tail-merged blocks.
- class MBFIWrapper {
- public:
- MBFIWrapper(const MachineBlockFrequencyInfo &I) : MBFI(I) {}
- BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const;
- void setBlockFreq(const MachineBasicBlock *MBB, BlockFrequency F);
- private:
- const MachineBlockFrequencyInfo &MBFI;
- DenseMap<const MachineBasicBlock *, BlockFrequency> MergedBBFreq;
- };
- MBFIWrapper MBBFreqInfo;
- const MachineBranchProbabilityInfo &MBPI;
- bool TailMergeBlocks(MachineFunction &MF);
- bool TryTailMergeBlocks(MachineBasicBlock* SuccBB,
- MachineBasicBlock* PredBB);
- void setCommonTailEdgeWeights(MachineBasicBlock &TailMBB);
- void MaintainLiveIns(MachineBasicBlock *CurMBB,
- MachineBasicBlock *NewMBB);
- void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
- MachineBasicBlock *NewDest);
- MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
- MachineBasicBlock::iterator BBI1,
- const BasicBlock *BB);
- unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength,
- MachineBasicBlock *SuccBB,
- MachineBasicBlock *PredBB);
- void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
- MachineBasicBlock* PredBB);
- bool CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
- MachineBasicBlock *SuccBB,
- 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 */
|