blob: f1ebc4fefb61258fca708d2abb418561fc25ae53 [file] [log] [blame]
Evan Cheng030a0a02009-09-04 07:47:40 +00001//===-- 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 <vector>
16
17namespace llvm {
18 class MachineFunction;
19 class MachineModuleInfo;
20 class RegScavenger;
21 class TargetInstrInfo;
22 class TargetRegisterInfo;
23
24 class BranchFolder {
25 public:
Bob Wilsona5971032009-10-28 20:46:46 +000026 explicit BranchFolder(bool defaultEnableTailMerge);
Evan Cheng030a0a02009-09-04 07:47:40 +000027
28 bool OptimizeFunction(MachineFunction &MF,
29 const TargetInstrInfo *tii,
30 const TargetRegisterInfo *tri,
31 MachineModuleInfo *mmi);
32 private:
33 typedef std::pair<unsigned,MachineBasicBlock*> MergePotentialsElt;
34 typedef std::vector<MergePotentialsElt>::iterator MPIterator;
35 std::vector<MergePotentialsElt> MergePotentials;
36
37 typedef std::pair<MPIterator, MachineBasicBlock::iterator> SameTailElt;
38 std::vector<SameTailElt> SameTails;
39
40 bool EnableTailMerge;
41 const TargetInstrInfo *TII;
42 const TargetRegisterInfo *TRI;
43 MachineModuleInfo *MMI;
44 RegScavenger *RS;
45
46 bool TailMergeBlocks(MachineFunction &MF);
Dan Gohman412a3b92009-11-11 19:49:34 +000047 bool TryTailMergeBlocks(MachineBasicBlock* SuccBB,
48 MachineBasicBlock* PredBB);
Evan Cheng030a0a02009-09-04 07:47:40 +000049 void ReplaceTailWithBranchTo(MachineBasicBlock::iterator OldInst,
50 MachineBasicBlock *NewDest);
51 MachineBasicBlock *SplitMBBAt(MachineBasicBlock &CurMBB,
52 MachineBasicBlock::iterator BBI1);
Dan Gohman412a3b92009-11-11 19:49:34 +000053 unsigned ComputeSameTails(unsigned CurHash, unsigned minCommonTailLength,
54 MachineBasicBlock *SuccBB,
55 MachineBasicBlock *PredBB);
Evan Cheng030a0a02009-09-04 07:47:40 +000056 void RemoveBlocksWithHash(unsigned CurHash, MachineBasicBlock* SuccBB,
57 MachineBasicBlock* PredBB);
58 unsigned CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
59 unsigned maxCommonTailLength);
60
Dan Gohman412a3b92009-11-11 19:49:34 +000061 bool TailDuplicate(MachineBasicBlock *TailBB,
62 bool PrevFallsThrough,
63 MachineFunction &MF);
64
Evan Cheng030a0a02009-09-04 07:47:40 +000065 bool OptimizeBranches(MachineFunction &MF);
66 bool OptimizeBlock(MachineBasicBlock *MBB);
67 void RemoveDeadBlock(MachineBasicBlock *MBB);
68 bool OptimizeImpDefsBlock(MachineBasicBlock *MBB);
69
70 bool CanFallThrough(MachineBasicBlock *CurBB);
71 bool CanFallThrough(MachineBasicBlock *CurBB, bool BranchUnAnalyzable,
72 MachineBasicBlock *TBB, MachineBasicBlock *FBB,
73 const SmallVectorImpl<MachineOperand> &Cond);
74 };
75
76
77 /// BranchFolderPass - Wrap branch folder in a machine function pass.
78 class BranchFolderPass : public MachineFunctionPass,
79 public BranchFolder {
80 public:
81 static char ID;
Bob Wilsona5971032009-10-28 20:46:46 +000082 explicit BranchFolderPass(bool defaultEnableTailMerge)
83 : MachineFunctionPass(&ID), BranchFolder(defaultEnableTailMerge) {}
Evan Cheng030a0a02009-09-04 07:47:40 +000084
85 virtual bool runOnMachineFunction(MachineFunction &MF);
86 virtual const char *getPassName() const { return "Control Flow Optimizer"; }
87 };
88}
89
90#endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */