1 //===-- BranchFolding.h - Fold machine code branch instructions --*- C++ -*===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_CODEGEN_BRANCHFOLDING_HPP
11 #define LLVM_CODEGEN_BRANCHFOLDING_HPP
13 #include "llvm/CodeGen/MachineBasicBlock.h"
17 class MachineFunction;
18 class MachineModuleInfo;
20 class TargetInstrInfo;
21 class TargetRegisterInfo;
25 explicit BranchFolder(bool defaultEnableTailMerge, bool CommonHoist);
27 bool OptimizeFunction(MachineFunction &MF,
28 const TargetInstrInfo *tii,
29 const TargetRegisterInfo *tri,
30 MachineModuleInfo *mmi);
32 class MergePotentialsElt {
34 MachineBasicBlock *Block;
36 MergePotentialsElt(unsigned h, MachineBasicBlock *b)
37 : Hash(h), Block(b) {}
39 unsigned getHash() const { return Hash; }
40 MachineBasicBlock *getBlock() const { return Block; }
42 void setBlock(MachineBasicBlock *MBB) {
46 bool operator<(const MergePotentialsElt &) const;
48 typedef std::vector<MergePotentialsElt>::iterator MPIterator;
49 std::vector<MergePotentialsElt> MergePotentials;
53 MachineBasicBlock::iterator TailStartPos;
55 SameTailElt(MPIterator mp, MachineBasicBlock::iterator tsp)
56 : MPIter(mp), TailStartPos(tsp) {}
58 MPIterator getMPIter() const {
61 MergePotentialsElt &getMergePotentialsElt() const {
64 MachineBasicBlock::iterator getTailStartPos() const {
67 unsigned getHash() const {
68 return getMergePotentialsElt().getHash();
70 MachineBasicBlock *getBlock() const {
71 return getMergePotentialsElt().getBlock();
73 bool tailIsWholeBlock() const {
74 return TailStartPos == getBlock()->begin();
77 void setBlock(MachineBasicBlock *MBB) {
78 getMergePotentialsElt().setBlock(MBB);
80 void setTailStartPos(MachineBasicBlock::iterator Pos) {
84 std::vector<SameTailElt> SameTails;
87 bool EnableHoistCommonCode;
88 const TargetInstrInfo *TII;
89 const TargetRegisterInfo *TRI;
90 MachineModuleInfo *MMI;
93 bool TailMergeBlocks(MachineFunction &MF);
94 bool TryTailMergeBlocks(MachineBasicBlock* SuccBB,
95 MachineBasicBlock* PredBB);
96 void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
97 MachineBasicBlock *NewDest);
98 MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
99 MachineBasicBlock::iterator BBI1);
100 unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength,
101 MachineBasicBlock *SuccBB,
102 MachineBasicBlock *PredBB);
103 void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
104 MachineBasicBlock* PredBB);
105 bool CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
106 unsigned maxCommonTailLength,
107 unsigned &commonTailIndex);
109 bool OptimizeBranches(MachineFunction &MF);
110 bool OptimizeBlock(MachineBasicBlock *MBB);
111 void RemoveDeadBlock(MachineBasicBlock *MBB);
112 bool OptimizeImpDefsBlock(MachineBasicBlock *MBB);
114 bool HoistCommonCode(MachineFunction &MF);
115 bool HoistCommonCodeInSuccs(MachineBasicBlock *MBB);
119 #endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */