diff options
Diffstat (limited to 'contrib/llvm/lib/CodeGen/BranchFolding.h')
| -rw-r--r-- | contrib/llvm/lib/CodeGen/BranchFolding.h | 115 | 
1 files changed, 115 insertions, 0 deletions
diff --git a/contrib/llvm/lib/CodeGen/BranchFolding.h b/contrib/llvm/lib/CodeGen/BranchFolding.h new file mode 100644 index 000000000000..b08739564060 --- /dev/null +++ b/contrib/llvm/lib/CodeGen/BranchFolding.h @@ -0,0 +1,115 @@ +//===-- 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/CodeGen/MachineBasicBlock.h" +#include <vector> + +namespace llvm { +  class MachineFunction; +  class MachineModuleInfo; +  class RegScavenger; +  class TargetInstrInfo; +  class TargetRegisterInfo; +  template<typename T> class SmallVectorImpl; + +  class BranchFolder { +  public: +    explicit BranchFolder(bool defaultEnableTailMerge); + +    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; + +    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; +    const TargetInstrInfo *TII; +    const TargetRegisterInfo *TRI; +    MachineModuleInfo *MMI; +    RegScavenger *RS; + +    bool TailMergeBlocks(MachineFunction &MF); +    bool TryTailMergeBlocks(MachineBasicBlock* SuccBB, +                       MachineBasicBlock* PredBB); +    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); +    unsigned CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB, +                                       unsigned maxCommonTailLength); + +    bool OptimizeBranches(MachineFunction &MF); +    bool OptimizeBlock(MachineBasicBlock *MBB); +    void RemoveDeadBlock(MachineBasicBlock *MBB); +    bool OptimizeImpDefsBlock(MachineBasicBlock *MBB); +  }; +} + +#endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */  | 
