PostDominators.cpp revision eb702350f7ac9c8910755fba44a98bc9a09beb4f
1//===- DominatorSet.cpp - Dominator Set Calculation --------------*- C++ -*--=//
2//
3// This file provides a simple class to calculate the dominator set of a
4// function.
5//
6//===----------------------------------------------------------------------===//
7
8#include "llvm/Analysis/Dominators.h"
9#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
10#include "llvm/Support/CFG.h"
11#include "llvm/Assembly/Writer.h"
12#include "Support/DepthFirstIterator.h"
13#include "Support/STLExtras.h"
14#include "Support/SetOperations.h"
15#include <algorithm>
16using std::set;
17
18//===----------------------------------------------------------------------===//
19//  DominatorSet Implementation
20//===----------------------------------------------------------------------===//
21
22static RegisterAnalysis<DominatorSet>
23A("domset", "Dominator Set Construction");
24static RegisterAnalysis<PostDominatorSet>
25B("postdomset", "Post-Dominator Set Construction");
26
27AnalysisID DominatorSet::ID = A;
28AnalysisID PostDominatorSet::ID = B;
29
30// 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//
33bool DominatorSetBase::dominates(Instruction *A, Instruction *B) const {
34  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();
39  for (; &*I != A && &*I != B; ++I) /*empty*/;
40
41  // A dominates B if it is found first in the basic block...
42  return &*I == A;
43}
44
45// runOnFunction - This method calculates the forward dominator sets for the
46// specified function.
47//
48bool DominatorSet::runOnFunction(Function &F) {
49  Doms.clear();   // Reset from the last time we were run...
50  Root = &F.getEntryNode();
51  assert(pred_begin(Root) == pred_end(Root) &&
52	 "Root node has predecessors in function!");
53
54  bool Changed;
55  do {
56    Changed = false;
57
58    DomSetType WorkingSet;
59    df_iterator<Function*> It = df_begin(&F), End = df_end(&F);
60    for ( ; It != End; ++It) {
61      BasicBlock *BB = *It;
62      pred_iterator PI = pred_begin(BB), PEnd = pred_end(BB);
63      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);
87  return false;
88}
89
90
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.
94//
95bool PostDominatorSet::runOnFunction(Function &F) {
96  Doms.clear();   // Reset from the last time we were run...
97  // Since we require that the unify all exit nodes pass has been run, we know
98  // that there can be at most one return instruction in the function left.
99  // Get it.
100  //
101  Root = getAnalysis<UnifyFunctionExitNodes>().getExitNode();
102
103  if (Root == 0) {  // No exit node for the function?  Postdomsets are all empty
104    for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI)
105      Doms[FI] = DomSetType();
106    return false;
107  }
108
109  bool Changed;
110  do {
111    Changed = false;
112
113    set<const BasicBlock*> Visited;
114    DomSetType WorkingSet;
115    idf_iterator<BasicBlock*> It = idf_begin(Root), End = idf_end(Root);
116    for ( ; It != End; ++It) {
117      BasicBlock *BB = *It;
118      succ_iterator PI = succ_begin(BB), PEnd = succ_end(BB);
119      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);
143  return false;
144}
145
146// getAnalysisUsage - This obviously provides a post-dominator set, but it also
147// requires the UnifyFunctionExitNodes pass.
148//
149void PostDominatorSet::getAnalysisUsage(AnalysisUsage &AU) const {
150  AU.setPreservesAll();
151  AU.addRequired(UnifyFunctionExitNodes::ID);
152}
153
154static 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}
170
171//===----------------------------------------------------------------------===//
172//  ImmediateDominators Implementation
173//===----------------------------------------------------------------------===//
174
175static RegisterAnalysis<ImmediateDominators>
176C("idom", "Immediate Dominators Construction");
177static RegisterAnalysis<ImmediatePostDominators>
178D("postidom", "Immediate Post-Dominators Construction");
179
180AnalysisID ImmediateDominators::ID = C;
181AnalysisID ImmediatePostDominators::ID = D;
182
183// calcIDoms - Calculate the immediate dominator mapping, given a set of
184// dominators for every basic block.
185void ImmediateDominatorsBase::calcIDoms(const DominatorSetBase &DS) {
186  // 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) {
191    BasicBlock *BB = DI->first;
192    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
219void 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
226
227//===----------------------------------------------------------------------===//
228//  DominatorTree Implementation
229//===----------------------------------------------------------------------===//
230
231static RegisterAnalysis<DominatorTree>
232E("domtree", "Dominator Tree Construction");
233static RegisterAnalysis<PostDominatorTree>
234F("postdomtree", "Post-Dominator Tree Construction");
235
236AnalysisID DominatorTree::ID = E;
237AnalysisID PostDominatorTree::ID = F;
238
239// DominatorTreeBase::reset - Free all of the tree node memory.
240//
241void DominatorTreeBase::reset() {
242  for (NodeMapType::iterator I = Nodes.begin(), E = Nodes.end(); I != E; ++I)
243    delete I->second;
244  Nodes.clear();
245}
246
247
248void DominatorTree::calculate(const DominatorSet &DS) {
249  Nodes[Root] = new Node(Root, 0);   // Add a node for the root...
250
251  // 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
258
259    // 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...
276      //
277      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;
288      }
289    }
290  }
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) {
298    // Iterate over all nodes in depth first order...
299    for (idf_iterator<BasicBlock*> I = idf_begin(Root), E = idf_end(Root);
300         I != E; ++I) {
301      BasicBlock *BB = *I;
302      const DominatorSet::DomSetType &Dominators = DS.getDominators(BB);
303      unsigned DomSetSize = Dominators.size();
304      if (DomSetSize == 1) continue;  // Root node... IDom = null
305
306      // 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
313      // the function.
314      //
315      DominatorSet::DomSetType::const_iterator I = Dominators.begin();
316      DominatorSet::DomSetType::const_iterator End = Dominators.end();
317      for (; I != End; ++I) {   // Iterate over dominators...
318	// 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
323	// 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	}
337      }
338    }
339  }
340}
341
342static 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}
361
362
363//===----------------------------------------------------------------------===//
364//  DominanceFrontier Implementation
365//===----------------------------------------------------------------------===//
366
367static RegisterAnalysis<DominanceFrontier>
368G("domfrontier", "Dominance Frontier Construction");
369static RegisterAnalysis<PostDominanceFrontier>
370H("postdomfrontier", "Post-Dominance Frontier Construction");
371
372AnalysisID DominanceFrontier::ID = G;
373AnalysisID PostDominanceFrontier::ID = H;
374
375const DominanceFrontier::DomSetType &
376DominanceFrontier::calculate(const DominatorTree &DT,
377                             const DominatorTree::Node *Node) {
378  // Loop over CFG successors to calculate DFlocal[Node]
379  BasicBlock *BB = Node->getNode();
380  DomSetType &S = Frontiers[BB];       // The new set to fill in...
381
382  for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB);
383       SI != SE; ++SI) {
384    // 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;
396    const DomSetType &ChildDF = calculate(DT, IDominee);
397
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}
407
408const DominanceFrontier::DomSetType &
409PostDominanceFrontier::calculate(const PostDominatorTree &DT,
410                                 const DominatorTree::Node *Node) {
411  // Loop over CFG successors to calculate DFlocal[Node]
412  BasicBlock *BB = Node->getNode();
413  DomSetType &S = Frontiers[BB];       // The new set to fill in...
414  if (!Root) return S;
415
416  for (pred_iterator SI = pred_begin(BB), SE = pred_end(BB);
417       SI != SE; ++SI) {
418    // 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  //
427  for (PostDominatorTree::Node::const_iterator
428         NI = Node->begin(), NE = Node->end(); NI != NE; ++NI) {
429    DominatorTree::Node *IDominee = *NI;
430    const DomSetType &ChildDF = calculate(DT, IDominee);
431
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}
441
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}
450