diff --git a/include/llvm/Analysis/Dominators.h b/include/llvm/Analysis/Dominators.h index 5ef302fef38..af45646493f 100644 --- a/include/llvm/Analysis/Dominators.h +++ b/include/llvm/Analysis/Dominators.h @@ -15,8 +15,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_DOMINATORS_H -#define LLVM_DOMINATORS_H +#ifndef LLVM_ANALYSIS_DOMINATORS_H +#define LLVM_ANALYSIS_DOMINATORS_H #include "llvm/Pass.h" #include @@ -108,25 +108,6 @@ struct DominatorSet : public DominatorSetBase { }; -//===------------------------------------- -// DominatorSet Class - Concrete subclass of DominatorSetBase that is used to -// compute the post-dominator set. -// -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 - // - virtual void getAnalysisUsage(AnalysisUsage &AU) const; -}; - - - - - //===----------------------------------------------------------------------===// // // ImmediateDominators - Calculate the immediate dominator for each node in a @@ -182,29 +163,6 @@ struct ImmediateDominators : public ImmediateDominatorsBase { }; -//===------------------------------------- -// ImmediatePostDominators Class - Concrete subclass of ImmediateDominatorsBase -// that is used to compute the immediate post-dominators. -// -struct ImmediatePostDominators : public ImmediateDominatorsBase { - ImmediatePostDominators() : ImmediateDominatorsBase(true) {} - - virtual bool runOnFunction(Function &F) { - IDoms.clear(); // Reset from the last time we were run... - PostDominatorSet &DS = getAnalysis(); - Root = DS.getRoot(); - calcIDoms(DS); - return false; - } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -}; - - - //===----------------------------------------------------------------------===// // // DominatorTree - Calculate the immediate dominator tree for a function. @@ -284,30 +242,6 @@ private: }; -//===------------------------------------- -// PostDominatorTree Class - Concrete subclass of DominatorTree that is used to -// compute the a post-dominator tree. -// -struct PostDominatorTree : public DominatorTreeBase { - PostDominatorTree() : DominatorTreeBase(true) {} - - virtual bool runOnFunction(Function &F) { - reset(); // Reset from the last time we were run... - PostDominatorSet &DS = getAnalysis(); - Root = DS.getRoot(); - calculate(DS); - return false; - } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -private: - void calculate(const PostDominatorSet &DS); -}; - - //===----------------------------------------------------------------------===// // // DominanceFrontier - Calculate the dominance frontiers for a function. @@ -358,30 +292,4 @@ private: const DominatorTree::Node *Node); }; - -//===------------------------------------- - -// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is -// used to compute the a post-dominance frontier. -// -struct PostDominanceFrontier : public DominanceFrontierBase { - PostDominanceFrontier() : DominanceFrontierBase(true) {} - - virtual bool runOnFunction(Function &) { - Frontiers.clear(); - PostDominatorTree &DT = getAnalysis(); - Root = DT.getRoot(); - calculate(DT, DT[Root]); - return false; - } - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -private: - const DomSetType &calculate(const PostDominatorTree &DT, - const DominatorTree::Node *Node); -}; - #endif diff --git a/include/llvm/Analysis/PostDominators.h b/include/llvm/Analysis/PostDominators.h new file mode 100644 index 00000000000..3a4ac7f92c1 --- /dev/null +++ b/include/llvm/Analysis/PostDominators.h @@ -0,0 +1,108 @@ +//=- llvm/Analysis/PostDominators.h - Post Dominator Calculation -*- C++ -*--=// +// +// This file exposes interfaces to post dominance information. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ANALYSIS_POST_DOMINATORS_H +#define LLVM_ANALYSIS_POST_DOMINATORS_H + +#include "llvm/Analysis/Dominators.h" + + +//===------------------------------------- +// DominatorSet Class - Concrete subclass of DominatorSetBase that is used to +// compute the post-dominator set. +// +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 + // + virtual void getAnalysisUsage(AnalysisUsage &AU) const; +}; + + + +//===------------------------------------- +// ImmediatePostDominators Class - Concrete subclass of ImmediateDominatorsBase +// that is used to compute the immediate post-dominators. +// +struct ImmediatePostDominators : public ImmediateDominatorsBase { + ImmediatePostDominators() : ImmediateDominatorsBase(true) {} + + virtual bool runOnFunction(Function &F) { + IDoms.clear(); // Reset from the last time we were run... + PostDominatorSet &DS = getAnalysis(); + Root = DS.getRoot(); + calcIDoms(DS); + return false; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + } +}; + + +//===------------------------------------- +// PostDominatorTree Class - Concrete subclass of DominatorTree that is used to +// compute the a post-dominator tree. +// +struct PostDominatorTree : public DominatorTreeBase { + PostDominatorTree() : DominatorTreeBase(true) {} + + virtual bool runOnFunction(Function &F) { + reset(); // Reset from the last time we were run... + PostDominatorSet &DS = getAnalysis(); + Root = DS.getRoot(); + calculate(DS); + return false; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + } +private: + void calculate(const PostDominatorSet &DS); +}; + + +//===------------------------------------- +// PostDominanceFrontier Class - Concrete subclass of DominanceFrontier that is +// used to compute the a post-dominance frontier. +// +struct PostDominanceFrontier : public DominanceFrontierBase { + PostDominanceFrontier() : DominanceFrontierBase(true) {} + + virtual bool runOnFunction(Function &) { + Frontiers.clear(); + PostDominatorTree &DT = getAnalysis(); + Root = DT.getRoot(); + calculate(DT, DT[Root]); + return false; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); + } + + // stub - dummy function, just ignore it + static void stub(); + +private: + const DomSetType &calculate(const PostDominatorTree &DT, + const DominatorTree::Node *Node); +}; + +// Make sure that any clients of this file link in PostDominators.cpp +static IncludeFile +POST_DOMINATOR_INCLUDE_FILE((void*)&PostDominanceFrontier::stub); + +#endif diff --git a/lib/Analysis/PostDominators.cpp b/lib/Analysis/PostDominators.cpp index c3320ee3db8..8b66ff6cad1 100644 --- a/lib/Analysis/PostDominators.cpp +++ b/lib/Analysis/PostDominators.cpp @@ -4,7 +4,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/Analysis/Dominators.h" +#include "llvm/Analysis/PostDominators.h" #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h" #include "llvm/Support/CFG.h" #include "Support/DepthFirstIterator.h" @@ -183,3 +183,7 @@ PostDominanceFrontier::calculate(const PostDominatorTree &DT, return S; } + +// stub - a dummy function to make linking work ok. +void PostDominanceFrontier::stub() { +} diff --git a/lib/Transforms/Scalar/ADCE.cpp b/lib/Transforms/Scalar/ADCE.cpp index 618ff23b4fb..15b71fdf55f 100644 --- a/lib/Transforms/Scalar/ADCE.cpp +++ b/lib/Transforms/Scalar/ADCE.cpp @@ -10,7 +10,7 @@ #include "llvm/Transforms/Utils/Local.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Type.h" -#include "llvm/Analysis/Dominators.h" +#include "llvm/Analysis/PostDominators.h" #include "llvm/iTerminators.h" #include "llvm/iPHINode.h" #include "llvm/Constant.h"