Put all LLVM code into the llvm namespace, as per bug 109.
[oota-llvm.git] / include / llvm / Analysis / PostDominators.h
index 3a4ac7f92c1de5b97ab957666748925e68b65f16..c8eb439b41ae627fa233ff9822d9606789290cb8 100644 (file)
@@ -1,4 +1,11 @@
-//=- llvm/Analysis/PostDominators.h - Post Dominator Calculation -*- C++ -*--=//
+//=- llvm/Analysis/PostDominators.h - Post Dominator Calculation-*- C++ -*-===//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
 //
 // This file exposes interfaces to post dominance information.
 //
 
 #include "llvm/Analysis/Dominators.h"
 
+namespace llvm {
 
-//===-------------------------------------
-// DominatorSet Class - Concrete subclass of DominatorSetBase that is used to
-// compute the post-dominator set.
-//
+
+/// PostDominatorSet Class - Concrete subclass of DominatorSetBase that is used
+/// to compute the post-dominator set.  Because there can be multiple exit nodes
+/// in an LLVM function, we calculate post dominators with a special null block
+/// which is the virtual exit node that the real exit nodes all virtually branch
+/// to.  Clients should be prepared to see an entry in the dominator sets with a
+/// null BasicBlock*.
+///
 struct PostDominatorSet : public DominatorSetBase {
   PostDominatorSet() : DominatorSetBase(true) {}
 
   virtual bool runOnFunction(Function &F);
 
-  // getAnalysisUsage - This obviously provides a dominator set, but it also
-  // uses the UnifyFunctionExitNode pass if building post-dominators
+  // getAnalysisUsage - This pass does not modify the function at all.
   //
-  virtual void getAnalysisUsage(AnalysisUsage &AU) const;
+  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+    AU.setPreservesAll();
+  }
 };
 
 
@@ -37,7 +50,7 @@ struct ImmediatePostDominators : public ImmediateDominatorsBase {
   virtual bool runOnFunction(Function &F) {
     IDoms.clear();     // Reset from the last time we were run...
     PostDominatorSet &DS = getAnalysis<PostDominatorSet>();
-    Root = DS.getRoot();
+    Roots = DS.getRoots();
     calcIDoms(DS);
     return false;
   }
@@ -59,7 +72,7 @@ struct PostDominatorTree : public DominatorTreeBase {
   virtual bool runOnFunction(Function &F) {
     reset();     // Reset from the last time we were run...
     PostDominatorSet &DS = getAnalysis<PostDominatorSet>();
-    Root = DS.getRoot();
+    Roots = DS.getRoots();
     calculate(DS);
     return false;
   }
@@ -83,8 +96,9 @@ struct PostDominanceFrontier : public DominanceFrontierBase {
   virtual bool runOnFunction(Function &) {
     Frontiers.clear();
     PostDominatorTree &DT = getAnalysis<PostDominatorTree>();
-    Root = DT.getRoot();
-    calculate(DT, DT[Root]);
+    Roots = DT.getRoots();
+    if (const DominatorTree::Node *Root = DT.getRootNode())
+      calculate(DT, Root);
     return false;
   }
 
@@ -105,4 +119,6 @@ private:
 static IncludeFile
 POST_DOMINATOR_INCLUDE_FILE((void*)&PostDominanceFrontier::stub);
 
+} // End llvm namespace
+
 #endif