LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
BranchFolding.h
Go to the documentation of this file.
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/ADT/SmallPtrSet.h"
15 #include <vector>
16 
17 namespace llvm {
18  class MachineFunction;
19  class MachineModuleInfo;
20  class RegScavenger;
21  class TargetInstrInfo;
22  class TargetRegisterInfo;
23 
24  class BranchFolder {
25  public:
26  explicit BranchFolder(bool defaultEnableTailMerge, bool CommonHoist);
27 
29  const TargetInstrInfo *tii,
30  const TargetRegisterInfo *tri,
31  MachineModuleInfo *mmi);
32  private:
33  class MergePotentialsElt {
34  unsigned Hash;
35  MachineBasicBlock *Block;
36  public:
37  MergePotentialsElt(unsigned h, MachineBasicBlock *b)
38  : Hash(h), Block(b) {}
39 
40  unsigned getHash() const { return Hash; }
41  MachineBasicBlock *getBlock() const { return Block; }
42 
43  void setBlock(MachineBasicBlock *MBB) {
44  Block = MBB;
45  }
46 
47  bool operator<(const MergePotentialsElt &) const;
48  };
49  typedef std::vector<MergePotentialsElt>::iterator MPIterator;
50  std::vector<MergePotentialsElt> MergePotentials;
52 
53  class SameTailElt {
54  MPIterator MPIter;
55  MachineBasicBlock::iterator TailStartPos;
56  public:
57  SameTailElt(MPIterator mp, MachineBasicBlock::iterator tsp)
58  : MPIter(mp), TailStartPos(tsp) {}
59 
60  MPIterator getMPIter() const {
61  return MPIter;
62  }
63  MergePotentialsElt &getMergePotentialsElt() const {
64  return *getMPIter();
65  }
66  MachineBasicBlock::iterator getTailStartPos() const {
67  return TailStartPos;
68  }
69  unsigned getHash() const {
70  return getMergePotentialsElt().getHash();
71  }
72  MachineBasicBlock *getBlock() const {
73  return getMergePotentialsElt().getBlock();
74  }
75  bool tailIsWholeBlock() const {
76  return TailStartPos == getBlock()->begin();
77  }
78 
79  void setBlock(MachineBasicBlock *MBB) {
80  getMergePotentialsElt().setBlock(MBB);
81  }
82  void setTailStartPos(MachineBasicBlock::iterator Pos) {
83  TailStartPos = Pos;
84  }
85  };
86  std::vector<SameTailElt> SameTails;
87 
88  bool EnableTailMerge;
89  bool EnableHoistCommonCode;
90  const TargetInstrInfo *TII;
91  const TargetRegisterInfo *TRI;
92  MachineModuleInfo *MMI;
93  RegScavenger *RS;
94 
95  bool TailMergeBlocks(MachineFunction &MF);
96  bool TryTailMergeBlocks(MachineBasicBlock* SuccBB,
97  MachineBasicBlock* PredBB);
98  void MaintainLiveIns(MachineBasicBlock *CurMBB,
99  MachineBasicBlock *NewMBB);
100  void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
101  MachineBasicBlock *NewDest);
102  MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
104  const BasicBlock *BB);
105  unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength,
106  MachineBasicBlock *SuccBB,
107  MachineBasicBlock *PredBB);
108  void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
109  MachineBasicBlock* PredBB);
110  bool CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
111  MachineBasicBlock *SuccBB,
112  unsigned maxCommonTailLength,
113  unsigned &commonTailIndex);
114 
115  bool OptimizeBranches(MachineFunction &MF);
116  bool OptimizeBlock(MachineBasicBlock *MBB);
117  void RemoveDeadBlock(MachineBasicBlock *MBB);
118  bool OptimizeImpDefsBlock(MachineBasicBlock *MBB);
119 
120  bool HoistCommonCode(MachineFunction &MF);
121  bool HoistCommonCodeInSuccs(MachineBasicBlock *MBB);
122  };
123 }
124 
125 #endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */
void operator<(const Optional< T > &X, const Optional< U > &Y)
Poison comparison between two Optional objects. Clients needs to explicitly compare the underlying va...
BranchFolder(bool defaultEnableTailMerge, bool CommonHoist)
bundle_iterator< MachineInstr, instr_iterator > iterator
LLVM Basic Block Representation.
Definition: BasicBlock.h:72
static unsigned getHash(const void *V)
Definition: EarlyCSE.cpp:38
bool OptimizeFunction(MachineFunction &MF, const TargetInstrInfo *tii, const TargetRegisterInfo *tri, MachineModuleInfo *mmi)