diff options
Diffstat (limited to 'lib/CodeGen/BranchFolding.h')
| -rw-r--r-- | lib/CodeGen/BranchFolding.h | 84 | 
1 files changed, 84 insertions, 0 deletions
diff --git a/lib/CodeGen/BranchFolding.h b/lib/CodeGen/BranchFolding.h new file mode 100644 index 000000000000..9763e3339a20 --- /dev/null +++ b/lib/CodeGen/BranchFolding.h @@ -0,0 +1,84 @@ +//===-- 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 "llvm/CodeGen/MachineFunctionPass.h" +#include <vector> + +namespace llvm { +  class MachineFunction; +  class MachineModuleInfo; +  class RegScavenger; +  class TargetInstrInfo; +  class TargetRegisterInfo; + +  class BranchFolder { +  public: +    explicit BranchFolder(bool defaultEnableTailMerge); + +    bool OptimizeFunction(MachineFunction &MF, +                          const TargetInstrInfo *tii, +                          const TargetRegisterInfo *tri, +                          MachineModuleInfo *mmi); +  private: +    typedef std::pair<unsigned,MachineBasicBlock*> MergePotentialsElt; +    typedef std::vector<MergePotentialsElt>::iterator MPIterator; +    std::vector<MergePotentialsElt> MergePotentials; + +    typedef std::pair<MPIterator, MachineBasicBlock::iterator> SameTailElt; +    std::vector<SameTailElt> SameTails; + +    bool EnableTailMerge; +    const TargetInstrInfo *TII; +    const TargetRegisterInfo *TRI; +    MachineModuleInfo *MMI; +    RegScavenger *RS; + +    bool TailMergeBlocks(MachineFunction &MF); +    bool TryMergeBlocks(MachineBasicBlock* SuccBB, +                        MachineBasicBlock* PredBB); +    void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst, +                                 MachineBasicBlock *NewDest); +    MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB, +                                  MachineBasicBlock::iterator BBI1); +    unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength); +    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); +     +    bool CanFallThrough(MachineBasicBlock *CurBB); +    bool CanFallThrough(MachineBasicBlock *CurBB, bool BranchUnAnalyzable, +                        MachineBasicBlock *TBB, MachineBasicBlock *FBB, +                        const SmallVectorImpl<MachineOperand> &Cond); +  }; + + +  /// BranchFolderPass - Wrap branch folder in a machine function pass. +  class BranchFolderPass : public MachineFunctionPass, +                           public BranchFolder { +  public: +    static char ID; +    explicit BranchFolderPass(bool defaultEnableTailMerge) +      :  MachineFunctionPass(&ID), BranchFolder(defaultEnableTailMerge) {} + +    virtual bool runOnMachineFunction(MachineFunction &MF); +    virtual const char *getPassName() const { return "Control Flow Optimizer"; } +  }; +} + +#endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */  | 
