BranchFolding.h revision 41cdc16e7301c91d2460aa14412f592695b0d4ed
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 <vector> 15 16namespace llvm { 17 class MachineFunction; 18 class MachineModuleInfo; 19 class RegScavenger; 20 class TargetInstrInfo; 21 class TargetRegisterInfo; 22 template<typename T> class SmallVectorImpl; 23 24 class BranchFolder { 25 public: 26 explicit BranchFolder(bool defaultEnableTailMerge); 27 28 bool OptimizeFunction(MachineFunction &MF, 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; 51 52 class SameTailElt { 53 MPIterator MPIter; 54 MachineBasicBlock::iterator TailStartPos; 55 public: 56 SameTailElt(MPIterator mp, MachineBasicBlock::iterator tsp) 57 : MPIter(mp), TailStartPos(tsp) {} 58 59 MPIterator getMPIter() const { 60 return MPIter; 61 } 62 MergePotentialsElt &getMergePotentialsElt() const { 63 return *getMPIter(); 64 } 65 MachineBasicBlock::iterator getTailStartPos() const { 66 return TailStartPos; 67 } 68 unsigned getHash() const { 69 return getMergePotentialsElt().getHash(); 70 } 71 MachineBasicBlock *getBlock() const { 72 return getMergePotentialsElt().getBlock(); 73 } 74 bool tailIsWholeBlock() const { 75 return TailStartPos == getBlock()->begin(); 76 } 77 78 void setBlock(MachineBasicBlock *MBB) { 79 getMergePotentialsElt().setBlock(MBB); 80 } 81 void setTailStartPos(MachineBasicBlock::iterator Pos) { 82 TailStartPos = Pos; 83 } 84 }; 85 std::vector<SameTailElt> SameTails; 86 87 bool EnableTailMerge; 88 const TargetInstrInfo *TII; 89 const TargetRegisterInfo *TRI; 90 MachineModuleInfo *MMI; 91 RegScavenger *RS; 92 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); 108 109 bool OptimizeBranches(MachineFunction &MF); 110 bool OptimizeBlock(MachineBasicBlock *MBB); 111 void RemoveDeadBlock(MachineBasicBlock *MBB); 112 bool OptimizeImpDefsBlock(MachineBasicBlock *MBB); 113 }; 114} 115 116#endif /* LLVM_CODEGEN_BRANCHFOLDING_HPP */ 117