1 //===- llvm/CodeGen/MachineDominanceFrontier.h ------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H 10 #define LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H 11 12 #include "llvm/Analysis/DominanceFrontier.h" 13 #include "llvm/Analysis/DominanceFrontierImpl.h" 14 #include "llvm/CodeGen/MachineBasicBlock.h" 15 #include "llvm/CodeGen/MachineFunctionPass.h" 16 #include "llvm/Support/GenericDomTree.h" 17 18 namespace llvm { 19 20 class MachineDominanceFrontier : public MachineFunctionPass { 21 ForwardDominanceFrontierBase<MachineBasicBlock> Base; 22 23 public: 24 using DomTreeT = DomTreeBase<MachineBasicBlock>; 25 using DomTreeNodeT = DomTreeNodeBase<MachineBasicBlock>; 26 using DomSetType = DominanceFrontierBase<MachineBasicBlock, false>::DomSetType; 27 using iterator = DominanceFrontierBase<MachineBasicBlock, false>::iterator; 28 using const_iterator = 29 DominanceFrontierBase<MachineBasicBlock, false>::const_iterator; 30 31 MachineDominanceFrontier(const MachineDominanceFrontier &) = delete; 32 MachineDominanceFrontier &operator=(const MachineDominanceFrontier &) = delete; 33 34 static char ID; 35 36 MachineDominanceFrontier(); 37 getBase()38 ForwardDominanceFrontierBase<MachineBasicBlock> &getBase() { return Base; } 39 getRoots()40 const SmallVectorImpl<MachineBasicBlock *> &getRoots() const { 41 return Base.getRoots(); 42 } 43 getRoot()44 MachineBasicBlock *getRoot() const { 45 return Base.getRoot(); 46 } 47 isPostDominator()48 bool isPostDominator() const { 49 return Base.isPostDominator(); 50 } 51 begin()52 iterator begin() { 53 return Base.begin(); 54 } 55 begin()56 const_iterator begin() const { 57 return Base.begin(); 58 } 59 end()60 iterator end() { 61 return Base.end(); 62 } 63 end()64 const_iterator end() const { 65 return Base.end(); 66 } 67 find(MachineBasicBlock * B)68 iterator find(MachineBasicBlock *B) { 69 return Base.find(B); 70 } 71 find(MachineBasicBlock * B)72 const_iterator find(MachineBasicBlock *B) const { 73 return Base.find(B); 74 } 75 addBasicBlock(MachineBasicBlock * BB,const DomSetType & frontier)76 iterator addBasicBlock(MachineBasicBlock *BB, const DomSetType &frontier) { 77 return Base.addBasicBlock(BB, frontier); 78 } 79 removeBlock(MachineBasicBlock * BB)80 void removeBlock(MachineBasicBlock *BB) { 81 return Base.removeBlock(BB); 82 } 83 addToFrontier(iterator I,MachineBasicBlock * Node)84 void addToFrontier(iterator I, MachineBasicBlock *Node) { 85 return Base.addToFrontier(I, Node); 86 } 87 removeFromFrontier(iterator I,MachineBasicBlock * Node)88 void removeFromFrontier(iterator I, MachineBasicBlock *Node) { 89 return Base.removeFromFrontier(I, Node); 90 } 91 compareDomSet(DomSetType & DS1,const DomSetType & DS2)92 bool compareDomSet(DomSetType &DS1, const DomSetType &DS2) const { 93 return Base.compareDomSet(DS1, DS2); 94 } 95 compare(DominanceFrontierBase<MachineBasicBlock,false> & Other)96 bool compare(DominanceFrontierBase<MachineBasicBlock, false> &Other) const { 97 return Base.compare(Other); 98 } 99 100 bool runOnMachineFunction(MachineFunction &F) override; 101 102 void releaseMemory() override; 103 104 void getAnalysisUsage(AnalysisUsage &AU) const override; 105 }; 106 107 } // end namespace llvm 108 109 #endif // LLVM_CODEGEN_MACHINEDOMINANCEFRONTIER_H 110