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 | |
38 | ForwardDominanceFrontierBase<MachineBasicBlock> &getBase() { return Base; } |
39 | |
40 | const SmallVectorImpl<MachineBasicBlock *> &getRoots() const { |
41 | return Base.getRoots(); |
42 | } |
43 | |
44 | MachineBasicBlock *getRoot() const { |
45 | return Base.getRoot(); |
46 | } |
47 | |
48 | bool isPostDominator() const { |
49 | return Base.isPostDominator(); |
50 | } |
51 | |
52 | iterator begin() { |
53 | return Base.begin(); |
54 | } |
55 | |
56 | const_iterator begin() const { |
57 | return Base.begin(); |
58 | } |
59 | |
60 | iterator end() { |
61 | return Base.end(); |
62 | } |
63 | |
64 | const_iterator end() const { |
65 | return Base.end(); |
66 | } |
67 | |
68 | iterator find(MachineBasicBlock *B) { |
69 | return Base.find(B); |
70 | } |
71 | |
72 | const_iterator find(MachineBasicBlock *B) const { |
73 | return Base.find(B); |
74 | } |
75 | |
76 | iterator addBasicBlock(MachineBasicBlock *BB, const DomSetType &frontier) { |
77 | return Base.addBasicBlock(BB, frontier); |
78 | } |
79 | |
80 | void removeBlock(MachineBasicBlock *BB) { |
81 | return Base.removeBlock(BB); |
82 | } |
83 | |
84 | void addToFrontier(iterator I, MachineBasicBlock *Node) { |
85 | return Base.addToFrontier(I, Node); |
86 | } |
87 | |
88 | void removeFromFrontier(iterator I, MachineBasicBlock *Node) { |
89 | return Base.removeFromFrontier(I, Node); |
90 | } |
91 | |
92 | bool compareDomSet(DomSetType &DS1, const DomSetType &DS2) const { |
93 | return Base.compareDomSet(DS1, DS2); |
94 | } |
95 | |
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 | |