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/ADT/SmallPtrSet.h"
14
#include "llvm/CodeGen/MachineBasicBlock.h"
18
class MachineFunction;
19
class MachineModuleInfo;
21
class TargetInstrInfo;
22
class TargetRegisterInfo;
26
explicit BranchFolder(bool defaultEnableTailMerge, bool CommonHoist);
28
bool OptimizeFunction(MachineFunction &MF,
29
const TargetInstrInfo *tii,
30
const TargetRegisterInfo *tri,
31
MachineModuleInfo *mmi);
33
class MergePotentialsElt {
35
MachineBasicBlock *Block;
37
MergePotentialsElt(unsigned h, MachineBasicBlock *b)
38
: Hash(h), Block(b) {}
40
unsigned getHash() const { return Hash; }
41
MachineBasicBlock *getBlock() const { return Block; }
43
void setBlock(MachineBasicBlock *MBB) {
47
bool operator<(const MergePotentialsElt &) const;
49
typedef std::vector<MergePotentialsElt>::iterator MPIterator;
50
std::vector<MergePotentialsElt> MergePotentials;
51
SmallPtrSet<const MachineBasicBlock*, 2> TriedMerging;
55
MachineBasicBlock::iterator TailStartPos;
57
SameTailElt(MPIterator mp, MachineBasicBlock::iterator tsp)
58
: MPIter(mp), TailStartPos(tsp) {}
60
MPIterator getMPIter() const {
63
MergePotentialsElt &getMergePotentialsElt() const {
66
MachineBasicBlock::iterator getTailStartPos() const {
69
unsigned getHash() const {
70
return getMergePotentialsElt().getHash();
72
MachineBasicBlock *getBlock() const {
73
return getMergePotentialsElt().getBlock();
75
bool tailIsWholeBlock() const {
76
return TailStartPos == getBlock()->begin();
79
void setBlock(MachineBasicBlock *MBB) {
80
getMergePotentialsElt().setBlock(MBB);
82
void setTailStartPos(MachineBasicBlock::iterator Pos) {
86
std::vector<SameTailElt> SameTails;
89
bool EnableHoistCommonCode;
90
const TargetInstrInfo *TII;
91
const TargetRegisterInfo *TRI;
92
MachineModuleInfo *MMI;
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,
103
MachineBasicBlock::iterator BBI1);
104
unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength,
105
MachineBasicBlock *SuccBB,
106
MachineBasicBlock *PredBB);
107
void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
108
MachineBasicBlock* PredBB);
109
bool CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
110
unsigned maxCommonTailLength,
111
unsigned &commonTailIndex);
113
bool OptimizeBranches(MachineFunction &MF);
114
bool OptimizeBlock(MachineBasicBlock *MBB);
115
void RemoveDeadBlock(MachineBasicBlock *MBB);
116
bool OptimizeImpDefsBlock(MachineBasicBlock *MBB);
118
bool HoistCommonCode(MachineFunction &MF);
119
bool HoistCommonCodeInSuccs(MachineBasicBlock *MBB);
123
#endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */