blob: 8dd731a5de17704418ea7478f8c0914140b5457c [file] [log] [blame]
Chris Lattner17152292001-07-02 05:46:38 +00001//===- DominatorSet.cpp - Dominator Set Calculation --------------*- C++ -*--=//
2//
Chris Lattner2fbfdcf2002-04-07 20:49:59 +00003// This file provides a simple class to calculate the dominator set of a
4// function.
Chris Lattner17152292001-07-02 05:46:38 +00005//
6//===----------------------------------------------------------------------===//
7
8#include "llvm/Analysis/Dominators.h"
Chris Lattnerfc514f42002-05-07 19:18:48 +00009#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
Chris Lattner221d6882002-02-12 21:07:25 +000010#include "llvm/Support/CFG.h"
Chris Lattnera59cbb22002-07-27 01:12:17 +000011#include "llvm/Assembly/Writer.h"
Chris Lattnercee8f9a2001-11-27 00:03:19 +000012#include "Support/DepthFirstIterator.h"
13#include "Support/STLExtras.h"
Chris Lattnereb5230c2002-02-05 03:35:31 +000014#include "Support/SetOperations.h"
Chris Lattner17152292001-07-02 05:46:38 +000015#include <algorithm>
Chris Lattner697954c2002-01-20 22:54:45 +000016using std::set;
17
Chris Lattner94108ab2001-07-06 16:58:22 +000018//===----------------------------------------------------------------------===//
Chris Lattner17152292001-07-02 05:46:38 +000019// DominatorSet Implementation
20//===----------------------------------------------------------------------===//
21
Chris Lattner1e435162002-07-26 21:12:44 +000022static RegisterAnalysis<DominatorSet>
Chris Lattner17689df2002-07-30 16:27:52 +000023A("domset", "Dominator Set Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +000024static RegisterAnalysis<PostDominatorSet>
Chris Lattner17689df2002-07-30 16:27:52 +000025B("postdomset", "Post-Dominator Set Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +000026
Chris Lattnera59cbb22002-07-27 01:12:17 +000027AnalysisID DominatorSet::ID = A;
28AnalysisID PostDominatorSet::ID = B;
Chris Lattner94108ab2001-07-06 16:58:22 +000029
Chris Lattneref704a22002-05-13 22:03:16 +000030// dominates - Return true if A dominates B. This performs the special checks
31// neccesary if A and B are in the same basic block.
32//
Chris Lattnerce6ef112002-07-26 18:40:14 +000033bool DominatorSetBase::dominates(Instruction *A, Instruction *B) const {
Chris Lattneref704a22002-05-13 22:03:16 +000034 BasicBlock *BBA = A->getParent(), *BBB = B->getParent();
35 if (BBA != BBB) return dominates(BBA, BBB);
36
37 // Loop through the basic block until we find A or B.
38 BasicBlock::iterator I = BBA->begin();
Chris Lattner7e708292002-06-25 16:13:24 +000039 for (; &*I != A && &*I != B; ++I) /*empty*/;
Chris Lattneref704a22002-05-13 22:03:16 +000040
41 // A dominates B if it is found first in the basic block...
Chris Lattner7e708292002-06-25 16:13:24 +000042 return &*I == A;
Chris Lattneref704a22002-05-13 22:03:16 +000043}
Chris Lattner93193f82002-01-31 00:42:27 +000044
Chris Lattnerce6ef112002-07-26 18:40:14 +000045// runOnFunction - This method calculates the forward dominator sets for the
46// specified function.
Chris Lattner94108ab2001-07-06 16:58:22 +000047//
Chris Lattnerce6ef112002-07-26 18:40:14 +000048bool DominatorSet::runOnFunction(Function &F) {
49 Doms.clear(); // Reset from the last time we were run...
Chris Lattner7e708292002-06-25 16:13:24 +000050 Root = &F.getEntryNode();
Chris Lattner455889a2002-02-12 22:39:50 +000051 assert(pred_begin(Root) == pred_end(Root) &&
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000052 "Root node has predecessors in function!");
Chris Lattnerff5a8c42001-11-26 18:52:02 +000053
Chris Lattner17152292001-07-02 05:46:38 +000054 bool Changed;
55 do {
56 Changed = false;
57
58 DomSetType WorkingSet;
Chris Lattner7e708292002-06-25 16:13:24 +000059 df_iterator<Function*> It = df_begin(&F), End = df_end(&F);
Chris Lattner17152292001-07-02 05:46:38 +000060 for ( ; It != End; ++It) {
Chris Lattnera298d272002-04-28 00:15:57 +000061 BasicBlock *BB = *It;
62 pred_iterator PI = pred_begin(BB), PEnd = pred_end(BB);
Chris Lattner17152292001-07-02 05:46:38 +000063 if (PI != PEnd) { // Is there SOME predecessor?
64 // Loop until we get to a predecessor that has had it's dom set filled
65 // in at least once. We are guaranteed to have this because we are
66 // traversing the graph in DFO and have handled start nodes specially.
67 //
68 while (Doms[*PI].size() == 0) ++PI;
69 WorkingSet = Doms[*PI];
70
71 for (++PI; PI != PEnd; ++PI) { // Intersect all of the predecessor sets
72 DomSetType &PredSet = Doms[*PI];
73 if (PredSet.size())
74 set_intersect(WorkingSet, PredSet);
75 }
76 }
77
78 WorkingSet.insert(BB); // A block always dominates itself
79 DomSetType &BBSet = Doms[BB];
80 if (BBSet != WorkingSet) {
81 BBSet.swap(WorkingSet); // Constant time operation!
82 Changed = true; // The sets changed.
83 }
84 WorkingSet.clear(); // Clear out the set for next iteration
85 }
86 } while (Changed);
Chris Lattnerce6ef112002-07-26 18:40:14 +000087 return false;
Chris Lattner94108ab2001-07-06 16:58:22 +000088}
Chris Lattner17152292001-07-02 05:46:38 +000089
Chris Lattnerce6ef112002-07-26 18:40:14 +000090
91// Postdominator set construction. This converts the specified function to only
92// have a single exit node (return stmt), then calculates the post dominance
93// sets for the function.
Chris Lattner94108ab2001-07-06 16:58:22 +000094//
Chris Lattnerce6ef112002-07-26 18:40:14 +000095bool PostDominatorSet::runOnFunction(Function &F) {
96 Doms.clear(); // Reset from the last time we were run...
Chris Lattner93193f82002-01-31 00:42:27 +000097 // Since we require that the unify all exit nodes pass has been run, we know
Chris Lattner2fbfdcf2002-04-07 20:49:59 +000098 // that there can be at most one return instruction in the function left.
Chris Lattner93193f82002-01-31 00:42:27 +000099 // Get it.
100 //
Chris Lattner483e14e2002-04-27 07:27:19 +0000101 Root = getAnalysis<UnifyFunctionExitNodes>().getExitNode();
Chris Lattner94108ab2001-07-06 16:58:22 +0000102
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000103 if (Root == 0) { // No exit node for the function? Postdomsets are all empty
Chris Lattner7e708292002-06-25 16:13:24 +0000104 for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
105 Doms[FI] = DomSetType();
Chris Lattnerce6ef112002-07-26 18:40:14 +0000106 return false;
Chris Lattner384e5b12001-08-23 17:07:19 +0000107 }
Chris Lattner94108ab2001-07-06 16:58:22 +0000108
109 bool Changed;
110 do {
111 Changed = false;
112
113 set<const BasicBlock*> Visited;
114 DomSetType WorkingSet;
Chris Lattner93193f82002-01-31 00:42:27 +0000115 idf_iterator<BasicBlock*> It = idf_begin(Root), End = idf_end(Root);
Chris Lattner94108ab2001-07-06 16:58:22 +0000116 for ( ; It != End; ++It) {
Chris Lattnera298d272002-04-28 00:15:57 +0000117 BasicBlock *BB = *It;
118 succ_iterator PI = succ_begin(BB), PEnd = succ_end(BB);
Chris Lattner94108ab2001-07-06 16:58:22 +0000119 if (PI != PEnd) { // Is there SOME predecessor?
120 // Loop until we get to a successor that has had it's dom set filled
121 // in at least once. We are guaranteed to have this because we are
122 // traversing the graph in DFO and have handled start nodes specially.
123 //
124 while (Doms[*PI].size() == 0) ++PI;
125 WorkingSet = Doms[*PI];
126
127 for (++PI; PI != PEnd; ++PI) { // Intersect all of the successor sets
128 DomSetType &PredSet = Doms[*PI];
129 if (PredSet.size())
130 set_intersect(WorkingSet, PredSet);
131 }
132 }
133
134 WorkingSet.insert(BB); // A block always dominates itself
135 DomSetType &BBSet = Doms[BB];
136 if (BBSet != WorkingSet) {
137 BBSet.swap(WorkingSet); // Constant time operation!
138 Changed = true; // The sets changed.
139 }
140 WorkingSet.clear(); // Clear out the set for next iteration
141 }
142 } while (Changed);
Chris Lattnerce6ef112002-07-26 18:40:14 +0000143 return false;
Chris Lattner17152292001-07-02 05:46:38 +0000144}
145
Chris Lattnerce6ef112002-07-26 18:40:14 +0000146// getAnalysisUsage - This obviously provides a post-dominator set, but it also
147// requires the UnifyFunctionExitNodes pass.
Chris Lattner93193f82002-01-31 00:42:27 +0000148//
Chris Lattnerce6ef112002-07-26 18:40:14 +0000149void PostDominatorSet::getAnalysisUsage(AnalysisUsage &AU) const {
Chris Lattnerf57b8452002-04-27 06:56:12 +0000150 AU.setPreservesAll();
Chris Lattnerce6ef112002-07-26 18:40:14 +0000151 AU.addRequired(UnifyFunctionExitNodes::ID);
Chris Lattner93193f82002-01-31 00:42:27 +0000152}
153
Chris Lattnera59cbb22002-07-27 01:12:17 +0000154static ostream &operator<<(ostream &o, const set<BasicBlock*> &BBs) {
155 for (set<BasicBlock*>::const_iterator I = BBs.begin(), E = BBs.end();
156 I != E; ++I) {
157 o << " ";
158 WriteAsOperand(o, *I, false);
159 o << "\n";
160 }
161 return o;
162}
163
164void DominatorSetBase::print(std::ostream &o) const {
165 for (const_iterator I = begin(), E = end(); I != E; ++I)
166 o << "=============================--------------------------------\n"
167 << "\nDominator Set For Basic Block\n" << I->first
168 << "-------------------------------\n" << I->second << "\n";
169}
Chris Lattner17152292001-07-02 05:46:38 +0000170
171//===----------------------------------------------------------------------===//
172// ImmediateDominators Implementation
173//===----------------------------------------------------------------------===//
174
Chris Lattner1e435162002-07-26 21:12:44 +0000175static RegisterAnalysis<ImmediateDominators>
Chris Lattner17689df2002-07-30 16:27:52 +0000176C("idom", "Immediate Dominators Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +0000177static RegisterAnalysis<ImmediatePostDominators>
Chris Lattner17689df2002-07-30 16:27:52 +0000178D("postidom", "Immediate Post-Dominators Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +0000179
Chris Lattnera59cbb22002-07-27 01:12:17 +0000180AnalysisID ImmediateDominators::ID = C;
181AnalysisID ImmediatePostDominators::ID = D;
Chris Lattner93193f82002-01-31 00:42:27 +0000182
Chris Lattner17152292001-07-02 05:46:38 +0000183// calcIDoms - Calculate the immediate dominator mapping, given a set of
184// dominators for every basic block.
Chris Lattnerce6ef112002-07-26 18:40:14 +0000185void ImmediateDominatorsBase::calcIDoms(const DominatorSetBase &DS) {
Chris Lattner17152292001-07-02 05:46:38 +0000186 // Loop over all of the nodes that have dominators... figuring out the IDOM
187 // for each node...
188 //
189 for (DominatorSet::const_iterator DI = DS.begin(), DEnd = DS.end();
190 DI != DEnd; ++DI) {
Chris Lattnera298d272002-04-28 00:15:57 +0000191 BasicBlock *BB = DI->first;
Chris Lattner17152292001-07-02 05:46:38 +0000192 const DominatorSet::DomSetType &Dominators = DI->second;
193 unsigned DomSetSize = Dominators.size();
194 if (DomSetSize == 1) continue; // Root node... IDom = null
195
196 // Loop over all dominators of this node. This corresponds to looping over
197 // nodes in the dominator chain, looking for a node whose dominator set is
198 // equal to the current nodes, except that the current node does not exist
199 // in it. This means that it is one level higher in the dom chain than the
200 // current node, and it is our idom!
201 //
202 DominatorSet::DomSetType::const_iterator I = Dominators.begin();
203 DominatorSet::DomSetType::const_iterator End = Dominators.end();
204 for (; I != End; ++I) { // Iterate over dominators...
205 // All of our dominators should form a chain, where the number of elements
206 // in the dominator set indicates what level the node is at in the chain.
207 // We want the node immediately above us, so it will have an identical
208 // dominator set, except that BB will not dominate it... therefore it's
209 // dominator set size will be one less than BB's...
210 //
211 if (DS.getDominators(*I).size() == DomSetSize - 1) {
212 IDoms[BB] = *I;
213 break;
214 }
215 }
216 }
217}
218
Chris Lattnera59cbb22002-07-27 01:12:17 +0000219void ImmediateDominatorsBase::print(ostream &o) const {
220 for (const_iterator I = begin(), E = end(); I != E; ++I)
221 o << "=============================--------------------------------\n"
222 << "\nImmediate Dominator For Basic Block\n" << *I->first
223 << "is: \n" << *I->second << "\n";
224}
225
Chris Lattner17152292001-07-02 05:46:38 +0000226
227//===----------------------------------------------------------------------===//
228// DominatorTree Implementation
229//===----------------------------------------------------------------------===//
230
Chris Lattner1e435162002-07-26 21:12:44 +0000231static RegisterAnalysis<DominatorTree>
Chris Lattner17689df2002-07-30 16:27:52 +0000232E("domtree", "Dominator Tree Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +0000233static RegisterAnalysis<PostDominatorTree>
Chris Lattner17689df2002-07-30 16:27:52 +0000234F("postdomtree", "Post-Dominator Tree Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +0000235
Chris Lattnera59cbb22002-07-27 01:12:17 +0000236AnalysisID DominatorTree::ID = E;
237AnalysisID PostDominatorTree::ID = F;
Chris Lattner93193f82002-01-31 00:42:27 +0000238
Chris Lattnerce6ef112002-07-26 18:40:14 +0000239// DominatorTreeBase::reset - Free all of the tree node memory.
Chris Lattner17152292001-07-02 05:46:38 +0000240//
Chris Lattnerce6ef112002-07-26 18:40:14 +0000241void DominatorTreeBase::reset() {
Chris Lattner17152292001-07-02 05:46:38 +0000242 for (NodeMapType::iterator I = Nodes.begin(), E = Nodes.end(); I != E; ++I)
243 delete I->second;
Chris Lattner93193f82002-01-31 00:42:27 +0000244 Nodes.clear();
Chris Lattner17152292001-07-02 05:46:38 +0000245}
246
247
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000248void DominatorTree::calculate(const DominatorSet &DS) {
Chris Lattner17152292001-07-02 05:46:38 +0000249 Nodes[Root] = new Node(Root, 0); // Add a node for the root...
250
Chris Lattnerce6ef112002-07-26 18:40:14 +0000251 // Iterate over all nodes in depth first order...
252 for (df_iterator<BasicBlock*> I = df_begin(Root), E = df_end(Root);
253 I != E; ++I) {
254 BasicBlock *BB = *I;
255 const DominatorSet::DomSetType &Dominators = DS.getDominators(BB);
256 unsigned DomSetSize = Dominators.size();
257 if (DomSetSize == 1) continue; // Root node... IDom = null
Chris Lattner94108ab2001-07-06 16:58:22 +0000258
Chris Lattnerce6ef112002-07-26 18:40:14 +0000259 // Loop over all dominators of this node. This corresponds to looping over
260 // nodes in the dominator chain, looking for a node whose dominator set is
261 // equal to the current nodes, except that the current node does not exist
262 // in it. This means that it is one level higher in the dom chain than the
263 // current node, and it is our idom! We know that we have already added
264 // a DominatorTree node for our idom, because the idom must be a
265 // predecessor in the depth first order that we are iterating through the
266 // function.
267 //
268 DominatorSet::DomSetType::const_iterator I = Dominators.begin();
269 DominatorSet::DomSetType::const_iterator End = Dominators.end();
270 for (; I != End; ++I) { // Iterate over dominators...
271 // All of our dominators should form a chain, where the number of
272 // elements in the dominator set indicates what level the node is at in
273 // the chain. We want the node immediately above us, so it will have
274 // an identical dominator set, except that BB will not dominate it...
275 // therefore it's dominator set size will be one less than BB's...
Chris Lattner17152292001-07-02 05:46:38 +0000276 //
Chris Lattnerce6ef112002-07-26 18:40:14 +0000277 if (DS.getDominators(*I).size() == DomSetSize - 1) {
278 // We know that the immediate dominator should already have a node,
279 // because we are traversing the CFG in depth first order!
280 //
281 Node *IDomNode = Nodes[*I];
282 assert(IDomNode && "No node for IDOM?");
283
284 // Add a new tree node for this BasicBlock, and link it as a child of
285 // IDomNode
286 Nodes[BB] = IDomNode->addChild(new Node(BB, IDomNode));
287 break;
Chris Lattner94108ab2001-07-06 16:58:22 +0000288 }
289 }
Chris Lattnerce6ef112002-07-26 18:40:14 +0000290 }
291}
292
293
294void PostDominatorTree::calculate(const PostDominatorSet &DS) {
295 Nodes[Root] = new Node(Root, 0); // Add a node for the root...
296
297 if (Root) {
Chris Lattner94108ab2001-07-06 16:58:22 +0000298 // Iterate over all nodes in depth first order...
Chris Lattner93193f82002-01-31 00:42:27 +0000299 for (idf_iterator<BasicBlock*> I = idf_begin(Root), E = idf_end(Root);
Chris Lattner3ff43872001-09-28 22:56:31 +0000300 I != E; ++I) {
Chris Lattnera298d272002-04-28 00:15:57 +0000301 BasicBlock *BB = *I;
Chris Lattner94108ab2001-07-06 16:58:22 +0000302 const DominatorSet::DomSetType &Dominators = DS.getDominators(BB);
303 unsigned DomSetSize = Dominators.size();
304 if (DomSetSize == 1) continue; // Root node... IDom = null
305
Chris Lattner3ff43872001-09-28 22:56:31 +0000306 // Loop over all dominators of this node. This corresponds to looping
307 // over nodes in the dominator chain, looking for a node whose dominator
308 // set is equal to the current nodes, except that the current node does
309 // not exist in it. This means that it is one level higher in the dom
310 // chain than the current node, and it is our idom! We know that we have
311 // already added a DominatorTree node for our idom, because the idom must
312 // be a predecessor in the depth first order that we are iterating through
Chris Lattner2fbfdcf2002-04-07 20:49:59 +0000313 // the function.
Chris Lattner94108ab2001-07-06 16:58:22 +0000314 //
315 DominatorSet::DomSetType::const_iterator I = Dominators.begin();
316 DominatorSet::DomSetType::const_iterator End = Dominators.end();
317 for (; I != End; ++I) { // Iterate over dominators...
Chris Lattner93193f82002-01-31 00:42:27 +0000318 // All of our dominators should form a chain, where the number
319 // of elements in the dominator set indicates what level the
320 // node is at in the chain. We want the node immediately
321 // above us, so it will have an identical dominator set,
322 // except that BB will not dominate it... therefore it's
Chris Lattner94108ab2001-07-06 16:58:22 +0000323 // dominator set size will be one less than BB's...
324 //
325 if (DS.getDominators(*I).size() == DomSetSize - 1) {
326 // We know that the immediate dominator should already have a node,
327 // because we are traversing the CFG in depth first order!
328 //
329 Node *IDomNode = Nodes[*I];
330 assert(IDomNode && "No node for IDOM?");
331
332 // Add a new tree node for this BasicBlock, and link it as a child of
333 // IDomNode
334 Nodes[BB] = IDomNode->addChild(new Node(BB, IDomNode));
335 break;
336 }
Chris Lattner17152292001-07-02 05:46:38 +0000337 }
338 }
339 }
340}
341
Chris Lattnera59cbb22002-07-27 01:12:17 +0000342static ostream &operator<<(ostream &o, const DominatorTreeBase::Node *Node) {
343 return o << Node->getNode()
344 << "\n------------------------------------------\n";
345}
346
347static void PrintDomTree(const DominatorTreeBase::Node *N, ostream &o,
348 unsigned Lev) {
349 o << "Level #" << Lev << ": " << N;
350 for (DominatorTreeBase::Node::const_iterator I = N->begin(), E = N->end();
351 I != E; ++I) {
352 PrintDomTree(*I, o, Lev+1);
353 }
354}
355
356void DominatorTreeBase::print(std::ostream &o) const {
357 o << "=============================--------------------------------\n"
358 << "Inorder Dominator Tree:\n";
359 PrintDomTree(Nodes.find(getRoot())->second, o, 1);
360}
Chris Lattner17152292001-07-02 05:46:38 +0000361
362
363//===----------------------------------------------------------------------===//
364// DominanceFrontier Implementation
365//===----------------------------------------------------------------------===//
366
Chris Lattner1e435162002-07-26 21:12:44 +0000367static RegisterAnalysis<DominanceFrontier>
Chris Lattner17689df2002-07-30 16:27:52 +0000368G("domfrontier", "Dominance Frontier Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +0000369static RegisterAnalysis<PostDominanceFrontier>
Chris Lattner17689df2002-07-30 16:27:52 +0000370H("postdomfrontier", "Post-Dominance Frontier Construction", true);
Chris Lattner1e435162002-07-26 21:12:44 +0000371
Chris Lattnera59cbb22002-07-27 01:12:17 +0000372AnalysisID DominanceFrontier::ID = G;
373AnalysisID PostDominanceFrontier::ID = H;
Chris Lattner93193f82002-01-31 00:42:27 +0000374
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000375const DominanceFrontier::DomSetType &
Chris Lattnerce6ef112002-07-26 18:40:14 +0000376DominanceFrontier::calculate(const DominatorTree &DT,
377 const DominatorTree::Node *Node) {
Chris Lattner17152292001-07-02 05:46:38 +0000378 // Loop over CFG successors to calculate DFlocal[Node]
Chris Lattnera298d272002-04-28 00:15:57 +0000379 BasicBlock *BB = Node->getNode();
Chris Lattner17152292001-07-02 05:46:38 +0000380 DomSetType &S = Frontiers[BB]; // The new set to fill in...
381
Chris Lattnera298d272002-04-28 00:15:57 +0000382 for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB);
Chris Lattner455889a2002-02-12 22:39:50 +0000383 SI != SE; ++SI) {
Chris Lattner17152292001-07-02 05:46:38 +0000384 // Does Node immediately dominate this successor?
385 if (DT[*SI]->getIDom() != Node)
386 S.insert(*SI);
387 }
388
389 // At this point, S is DFlocal. Now we union in DFup's of our children...
390 // Loop through and visit the nodes that Node immediately dominates (Node's
391 // children in the IDomTree)
392 //
393 for (DominatorTree::Node::const_iterator NI = Node->begin(), NE = Node->end();
394 NI != NE; ++NI) {
395 DominatorTree::Node *IDominee = *NI;
Chris Lattnerce6ef112002-07-26 18:40:14 +0000396 const DomSetType &ChildDF = calculate(DT, IDominee);
Chris Lattner17152292001-07-02 05:46:38 +0000397
398 DomSetType::const_iterator CDFI = ChildDF.begin(), CDFE = ChildDF.end();
399 for (; CDFI != CDFE; ++CDFI) {
400 if (!Node->dominates(DT[*CDFI]))
401 S.insert(*CDFI);
402 }
403 }
404
405 return S;
406}
Chris Lattner94108ab2001-07-06 16:58:22 +0000407
Chris Lattner1b7f7dc2002-04-28 16:21:30 +0000408const DominanceFrontier::DomSetType &
Chris Lattnerce6ef112002-07-26 18:40:14 +0000409PostDominanceFrontier::calculate(const PostDominatorTree &DT,
410 const DominatorTree::Node *Node) {
Chris Lattner94108ab2001-07-06 16:58:22 +0000411 // Loop over CFG successors to calculate DFlocal[Node]
Chris Lattnera298d272002-04-28 00:15:57 +0000412 BasicBlock *BB = Node->getNode();
Chris Lattner94108ab2001-07-06 16:58:22 +0000413 DomSetType &S = Frontiers[BB]; // The new set to fill in...
Chris Lattner384e5b12001-08-23 17:07:19 +0000414 if (!Root) return S;
Chris Lattner94108ab2001-07-06 16:58:22 +0000415
Chris Lattnera298d272002-04-28 00:15:57 +0000416 for (pred_iterator SI = pred_begin(BB), SE = pred_end(BB);
Chris Lattner455889a2002-02-12 22:39:50 +0000417 SI != SE; ++SI) {
Chris Lattner94108ab2001-07-06 16:58:22 +0000418 // Does Node immediately dominate this predeccessor?
419 if (DT[*SI]->getIDom() != Node)
420 S.insert(*SI);
421 }
422
423 // At this point, S is DFlocal. Now we union in DFup's of our children...
424 // Loop through and visit the nodes that Node immediately dominates (Node's
425 // children in the IDomTree)
426 //
Chris Lattnerce6ef112002-07-26 18:40:14 +0000427 for (PostDominatorTree::Node::const_iterator
428 NI = Node->begin(), NE = Node->end(); NI != NE; ++NI) {
Chris Lattner94108ab2001-07-06 16:58:22 +0000429 DominatorTree::Node *IDominee = *NI;
Chris Lattnerce6ef112002-07-26 18:40:14 +0000430 const DomSetType &ChildDF = calculate(DT, IDominee);
Chris Lattner94108ab2001-07-06 16:58:22 +0000431
432 DomSetType::const_iterator CDFI = ChildDF.begin(), CDFE = ChildDF.end();
433 for (; CDFI != CDFE; ++CDFI) {
434 if (!Node->dominates(DT[*CDFI]))
435 S.insert(*CDFI);
436 }
437 }
438
439 return S;
440}
Chris Lattnera59cbb22002-07-27 01:12:17 +0000441
442void DominanceFrontierBase::print(std::ostream &o) const {
443 for (const_iterator I = begin(), E = end(); I != E; ++I) {
444 o << "=============================--------------------------------\n"
445 << "\nDominance Frontier For Basic Block\n";
446 WriteAsOperand(o, I->first, false);
447 o << " is: \n" << I->second << "\n";
448 }
449}