LLVM: include/llvm/Support/GenericIteratedDominanceFrontier.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#ifndef LLVM_SUPPORT_GENERICITERATEDDOMINANCEFRONTIER_H
24#define LLVM_SUPPORT_GENERICITERATEDDOMINANCEFRONTIER_H
25
30#include
31
32namespace llvm {
33
34namespace IDFCalculatorDetail {
35
36
37
38
43
45};
46
47}
48
49
50
51
52
53
54
55
56
57
59public:
61 std::conditional_t<IsPostDom, Inverse<NodeTy *>, NodeTy *>;
64
66
69 : DT(DT), ChildrenGetter(C) {}
70
71
72
73
74
75
78 }
79
80
81
82
83
84
86 LiveInBlocks = &Blocks;
87 useLiveIn = true;
88 }
89
90
91
93 LiveInBlocks = nullptr;
94 useLiveIn = false;
95 }
96
97
98
99
100
101
102
104
105private:
108 bool useLiveIn = false;
111};
112
113
114
115
116
117namespace IDFCalculatorDetail {
118
119template <class NodeTy, bool IsPostDom>
122 using OrderedNodeTy =
124
125 return children(N);
126}
127
128}
129
130template <class NodeTy, bool IsPostDom>
133
134
135
136
137 using DomTreeNodePair =
138 std::pair<DomTreeNodeBase *, std::pair<unsigned, unsigned>>;
139 using IDFPriorityQueue =
140 std::priority_queue<DomTreeNodePair, SmallVector<DomTreeNodePair, 32>,
142
143 IDFPriorityQueue PQ;
144
146
150 if (useLiveIn) {
151 VisitedPQ.reserve(LiveInBlocks->size());
152 VisitedWorklist.reserve(LiveInBlocks->size());
153 }
154
155 for (NodeTy *BB : *DefBlocks)
157 PQ.push({Node, std::make_pair(Node->getLevel(), Node->getDFSNumIn())});
159 }
160
161 while (!PQ.empty()) {
162 DomTreeNodePair RootPair = PQ.top();
163 PQ.pop();
165 unsigned RootLevel = RootPair.second.first;
166
167
168
169
170
171
174
175 while (!Worklist.empty()) {
177 NodeTy *BB = Node->getBlock();
178
179
180 auto DoWork = [&](NodeTy *Succ) {
182
183 const unsigned SuccLevel = SuccNode->getLevel();
184 if (SuccLevel > RootLevel)
185 return;
186
187 if (!VisitedPQ.insert(SuccNode).second)
188 return;
189
190 NodeTy *SuccBB = SuccNode->getBlock();
191 if (useLiveIn && !LiveInBlocks->count(SuccBB))
192 return;
193
195 if (!DefBlocks->count(SuccBB))
196 PQ.push(std::make_pair(
197 SuccNode, std::make_pair(SuccLevel, SuccNode->getDFSNumIn())));
198 };
199
200 for (auto *Succ : ChildrenGetter.get(BB))
201 DoWork(Succ);
202
203 for (auto DomChild : *Node) {
204 if (VisitedWorklist.insert(DomChild).second)
206 }
207 }
208 }
209}
210
211}
212
213#endif
DenseMap< Block *, BlockRelaxAux > Blocks
This file defines a set of templates that efficiently compute a dominator tree over a generic graph.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
Base class for the actual dominator tree node.
unsigned getDFSNumIn() const
getDFSNumIn/getDFSNumOut - These return the DFS visitation order for nodes in the dominator tree.
unsigned getLevel() const
Core dominator tree base class.
void updateDFSNumbers() const
updateDFSNumbers - Assign In and Out numbers to the nodes while walking dominator tree in dfs order.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
Determine the iterated dominance frontier, given a set of defining blocks, and optionally,...
IDFCalculatorBase(DominatorTreeBase< NodeTy, IsPostDom > &DT)
void resetLiveInBlocks()
Reset the live-in block set to be empty, and tell the IDF calculator to not use liveness anymore.
void calculate(SmallVectorImpl< NodeTy * > &IDFBlocks)
Calculate iterated dominance frontiers.
void setLiveInBlocks(const SmallPtrSetImpl< NodeTy * > &Blocks)
Give the IDF calculator the set of blocks in which the value is live on entry to the block.
void setDefiningBlocks(const SmallPtrSetImpl< NodeTy * > &Blocks)
Give the IDF calculator the set of blocks in which the value is defined.
IDFCalculatorBase(DominatorTreeBase< NodeTy, IsPostDom > &DT, const ChildrenGetterTy &C)
std::conditional_t< IsPostDom, Inverse< NodeTy * >, NodeTy * > OrderedNodeTy
void reserve(size_type NumEntries)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A range adaptor for a pair of iterators.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
typename GraphType::UnknownGraphTypeError NodeRef
Specialization for BasicBlock for the optional use of GraphDiff.
Generic utility class used for getting the children of a basic block.
iterator_range< ChildIteratorType > range
typename GraphTraits< NodeTy * >::ChildIteratorType ChildIteratorType
typename GraphTraits< NodeTy * >::NodeRef NodeRef
range get(const NodeRef &N)
Function object to check whether the second component of a container supported by std::get (like std:...