BranchFolding.h revision cd4f04d6bcb7aefa24d92582fbadfe17519f4756
1//===-- BranchFolding.h - Fold machine code branch instructions --*- C++ -*===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CODEGEN_BRANCHFOLDING_HPP
11#define LLVM_CODEGEN_BRANCHFOLDING_HPP
12
13#include "llvm/CodeGen/MachineBasicBlock.h"
14#include "llvm/CodeGen/MachineFunctionPass.h"
15#include "llvm/Target/TargetMachine.h"
16#include <vector>
17
18namespace llvm {
19  class MachineFunction;
20  class MachineModuleInfo;
21  class RegScavenger;
22  class TargetInstrInfo;
23  class TargetRegisterInfo;
24
25  class BranchFolder {
26  public:
27    explicit BranchFolder(bool defaultEnableTailMerge, CodeGenOpt::Level OL);
28
29    bool OptimizeFunction(MachineFunction &MF,
30                          const TargetInstrInfo *tii,
31                          const TargetRegisterInfo *tri,
32                          MachineModuleInfo *mmi);
33  private:
34    typedef std::pair<unsigned,MachineBasicBlock*> MergePotentialsElt;
35    typedef std::vector<MergePotentialsElt>::iterator MPIterator;
36    std::vector<MergePotentialsElt> MergePotentials;
37
38    typedef std::pair<MPIterator, MachineBasicBlock::iterator> SameTailElt;
39    std::vector<SameTailElt> SameTails;
40
41    CodeGenOpt::Level OptLevel;
42    bool EnableTailMerge;
43    const TargetInstrInfo *TII;
44    const TargetRegisterInfo *TRI;
45    MachineModuleInfo *MMI;
46    RegScavenger *RS;
47
48    bool TailMergeBlocks(MachineFunction &MF);
49    bool TryMergeBlocks(MachineBasicBlock* SuccBB,
50                        MachineBasicBlock* PredBB);
51    void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
52                                 MachineBasicBlock *NewDest);
53    MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
54                                  MachineBasicBlock::iterator BBI1);
55    unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength);
56    void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
57                                                MachineBasicBlock* PredBB);
58    unsigned CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
59                                       unsigned maxCommonTailLength);
60
61    bool OptimizeBranches(MachineFunction &MF);
62    bool OptimizeBlock(MachineBasicBlock *MBB);
63    void RemoveDeadBlock(MachineBasicBlock *MBB);
64    bool OptimizeImpDefsBlock(MachineBasicBlock *MBB);
65
66    bool CanFallThrough(MachineBasicBlock *CurBB);
67    bool CanFallThrough(MachineBasicBlock *CurBB, bool BranchUnAnalyzable,
68                        MachineBasicBlock *TBB, MachineBasicBlock *FBB,
69                        const SmallVectorImpl<MachineOperand> &Cond);
70  };
71
72
73  /// BranchFolderPass - Wrap branch folder in a machine function pass.
74  class BranchFolderPass : public MachineFunctionPass,
75                           public BranchFolder {
76  public:
77    static char ID;
78    explicit BranchFolderPass(bool defaultEnableTailMerge,
79                              CodeGenOpt::Level OptLevel)
80      :  MachineFunctionPass(&ID),
81      BranchFolder(defaultEnableTailMerge, OptLevel) {}
82
83    virtual bool runOnMachineFunction(MachineFunction &MF);
84    virtual const char *getPassName() const { return "Control Flow Optimizer"; }
85  };
86}
87
88#endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */
89