[llvm-commits] [llvm] r43115 - in /llvm/trunk: include/llvm/Analysis/DominatorInternals.h include/llvm/Analysis/Dominators.h lib/Transforms/Utils/CodeExtractor.cpp lib/Transforms/Utils/LoopSimplify.cpp

Hartmut Kaiser hartmut.kaiser at gmail.com
Thu Oct 18 05:47:23 PDT 2007


Owen,

Everything seems to be fine now.

Thanks!
Regards Hartmut 

> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu 
> [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Owen Anderson
> Sent: Thursday, October 18, 2007 12:14 AM
> To: llvm-commits at cs.uiuc.edu
> Subject: [llvm-commits] [llvm] r43115 - in /llvm/trunk: 
> include/llvm/Analysis/DominatorInternals.h 
> include/llvm/Analysis/Dominators.h 
> lib/Transforms/Utils/CodeExtractor.cpp 
> lib/Transforms/Utils/LoopSimplify.cpp
> 
> Author: resistor
> Date: Thu Oct 18 00:13:52 2007
> New Revision: 43115
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=43115&view=rev
> Log:
> Move Split<...>() into DomTreeBase.  This should make the 
> #include's of DominatorInternals.h in CodeExtractor and 
> LoopSimplify unnecessary.
> 
> Hartmut, could you confirm that this fixes the issues you were seeing?
> 
> Modified:
>     llvm/trunk/include/llvm/Analysis/DominatorInternals.h
>     llvm/trunk/include/llvm/Analysis/Dominators.h
>     llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
>     llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
> 
> Modified: llvm/trunk/include/llvm/Analysis/DominatorInternals.h
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/An
alysis/DominatorInternals.h?rev=43115&r1=43114&r2=43115> &view=diff
> 
> ==============================================================
> ================
> --- llvm/trunk/include/llvm/Analysis/DominatorInternals.h (original)
> +++ llvm/trunk/include/llvm/Analysis/DominatorInternals.h Thu Oct 18 
> +++ 00:13:52 2007
> @@ -303,93 +303,6 @@
>    DT.DFSInfoValid = false;
>  }
>  
> -// NewBB is split and now it has one successor. Update 
> dominator tree to -// reflect this change.
> -template<class NodeT, class GraphT>
> -void Split(DominatorTreeBase<typename GraphT::NodeType>& DT,
> -           typename GraphT::NodeType* NewBB) {
> -  assert(std::distance(GraphT::child_begin(NewBB), 
> GraphT::child_end(NewBB)) == 1
> -         && "NewBB should have a single successor!");
> -  typename GraphT::NodeType* NewBBSucc = *GraphT::child_begin(NewBB);
> -
> -  std::vector<typename GraphT::NodeType*> PredBlocks;
> -  for (typename GraphTraits<Inverse<NodeT> >::ChildIteratorType PI =
> -       GraphTraits<Inverse<NodeT> >::child_begin(NewBB),
> -       PE = GraphTraits<Inverse<NodeT> >::child_end(NewBB); 
> PI != PE; ++PI)
> -    PredBlocks.push_back(*PI);  
> -
> -    assert(!PredBlocks.empty() && "No predblocks??");
> -
> -    // The newly inserted basic block will dominate existing 
> basic blocks iff the
> -    // PredBlocks dominate all of the non-pred blocks.  If 
> all predblocks dominate
> -    // the non-pred blocks, then they all must be the same block!
> -    //
> -    bool NewBBDominatesNewBBSucc = true;
> -    {
> -      typename GraphT::NodeType* OnePred = PredBlocks[0];
> -      unsigned i = 1, e = PredBlocks.size();
> -      for (i = 1; !DT.isReachableFromEntry(OnePred); ++i) {
> -        assert(i != e && "Didn't find reachable pred?");
> -        OnePred = PredBlocks[i];
> -      }
> -  
> -      for (; i != e; ++i)
> -        if (PredBlocks[i] != OnePred && 
> DT.isReachableFromEntry(OnePred)) {
> -          NewBBDominatesNewBBSucc = false;
> -          break;
> -        }
> -
> -    if (NewBBDominatesNewBBSucc)
> -      for (typename GraphTraits<Inverse<NodeT> 
> >::ChildIteratorType PI =
> -           GraphTraits<Inverse<NodeT> >::child_begin(NewBBSucc),
> -           E = GraphTraits<Inverse<NodeT> 
> >::child_end(NewBBSucc); PI != E; ++PI)
> -        if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI)) {
> -          NewBBDominatesNewBBSucc = false;
> -          break;
> -        }
> -  }
> -
> -  // The other scenario where the new block can dominate its 
> successors are when
> -  // all predecessors of NewBBSucc that are not NewBB are 
> dominated by NewBBSucc
> -  // already.
> -  if (!NewBBDominatesNewBBSucc) {
> -    NewBBDominatesNewBBSucc = true;
> -    for (typename GraphTraits<Inverse<NodeT> 
> >::ChildIteratorType PI = 
> -         GraphTraits<Inverse<NodeT> >::child_begin(NewBBSucc),
> -         E = GraphTraits<Inverse<NodeT> 
> >::child_end(NewBBSucc); PI != E; ++PI)
> -       if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI)) {
> -        NewBBDominatesNewBBSucc = false;
> -        break;
> -      }
> -  }
> -
> -  // Find NewBB's immediate dominator and create new 
> dominator tree node for
> -  // NewBB.
> -  BasicBlock *NewBBIDom = 0;
> -  unsigned i = 0;
> -  for (i = 0; i < PredBlocks.size(); ++i)
> -    if (DT.isReachableFromEntry(PredBlocks[i])) {
> -      NewBBIDom = PredBlocks[i];
> -      break;
> -    }
> -  assert(i != PredBlocks.size() && "No reachable preds?");
> -  for (i = i + 1; i < PredBlocks.size(); ++i) {
> -    if (DT.isReachableFromEntry(PredBlocks[i]))
> -      NewBBIDom = DT.findNearestCommonDominator(NewBBIDom, 
> PredBlocks[i]);
> -  }
> -  assert(NewBBIDom && "No immediate dominator found??");
> -
> -  // Create the new dominator tree node... and set the idom of NewBB.
> -  DomTreeNode *NewBBNode = DT.addNewBlock(NewBB, NewBBIDom);
> -
> -  // If NewBB strictly dominates other blocks, then it is 
> now the immediate
> -  // dominator of NewBBSucc.  Update the dominator tree as 
> appropriate.
> -  if (NewBBDominatesNewBBSucc) {
> -    DomTreeNode *NewBBSuccNode = DT.getNode(NewBBSucc);
> -    DT.changeImmediateDominator(NewBBSuccNode, NewBBNode);
> -  }
> -}
> -
>  }
>  
>  #endif
> 
> Modified: llvm/trunk/include/llvm/Analysis/Dominators.h
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/An
alysis/Dominators.h?rev=43115&r1=43114&r2=43115&view=diff
> 
> ==============================================================
> ================
> --- llvm/trunk/include/llvm/Analysis/Dominators.h (original)
> +++ llvm/trunk/include/llvm/Analysis/Dominators.h Thu Oct 18 00:13:52 
> +++ 2007
> @@ -202,6 +202,93 @@
>      Vertex.clear();
>      RootNode = 0;
>    }
> +  
> +  // NewBB is split and now it has one successor. Update 
> dominator tree 
> + to  // reflect this change.
> +  template<class N, class GraphT>
> +  void Split(DominatorTreeBase<typename GraphT::NodeType>& DT,
> +             typename GraphT::NodeType* NewBB) {
> +    assert(std::distance(GraphT::child_begin(NewBB), 
> GraphT::child_end(NewBB)) == 1
> +           && "NewBB should have a single successor!");
> +    typename GraphT::NodeType* NewBBSucc = 
> *GraphT::child_begin(NewBB);
> +
> +    std::vector<typename GraphT::NodeType*> PredBlocks;
> +    for (typename GraphTraits<Inverse<N> >::ChildIteratorType PI =
> +         GraphTraits<Inverse<N> >::child_begin(NewBB),
> +         PE = GraphTraits<Inverse<N> >::child_end(NewBB); PI 
> != PE; ++PI)
> +      PredBlocks.push_back(*PI);
> +
> +      assert(!PredBlocks.empty() && "No predblocks??");
> +
> +      // The newly inserted basic block will dominate 
> existing basic blocks iff the
> +      // PredBlocks dominate all of the non-pred blocks.  If 
> all predblocks dominate
> +      // the non-pred blocks, then they all must be the same block!
> +      //
> +      bool NewBBDominatesNewBBSucc = true;
> +      {
> +        typename GraphT::NodeType* OnePred = PredBlocks[0];
> +        unsigned i = 1, e = PredBlocks.size();
> +        for (i = 1; !DT.isReachableFromEntry(OnePred); ++i) {
> +          assert(i != e && "Didn't find reachable pred?");
> +          OnePred = PredBlocks[i];
> +        }
> +
> +        for (; i != e; ++i)
> +          if (PredBlocks[i] != OnePred && 
> DT.isReachableFromEntry(OnePred)) {
> +            NewBBDominatesNewBBSucc = false;
> +            break;
> +          }
> +
> +      if (NewBBDominatesNewBBSucc)
> +        for (typename GraphTraits<Inverse<N> 
> >::ChildIteratorType PI =
> +             GraphTraits<Inverse<N> >::child_begin(NewBBSucc),
> +             E = GraphTraits<Inverse<N> 
> >::child_end(NewBBSucc); PI != E; ++PI)
> +          if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI)) {
> +            NewBBDominatesNewBBSucc = false;
> +            break;
> +          }
> +    }
> +
> +    // The other scenario where the new block can dominate 
> its successors are when
> +    // all predecessors of NewBBSucc that are not NewBB are 
> dominated by NewBBSucc
> +    // already.
> +    if (!NewBBDominatesNewBBSucc) {
> +      NewBBDominatesNewBBSucc = true;
> +      for (typename GraphTraits<Inverse<N> >::ChildIteratorType PI = 
> +           GraphTraits<Inverse<N> >::child_begin(NewBBSucc),
> +           E = GraphTraits<Inverse<N> 
> >::child_end(NewBBSucc); PI != E; ++PI)
> +         if (*PI != NewBB && !DT.dominates(NewBBSucc, *PI)) {
> +          NewBBDominatesNewBBSucc = false;
> +          break;
> +        }
> +    }
> +
> +    // Find NewBB's immediate dominator and create new 
> dominator tree node for
> +    // NewBB.
> +    BasicBlock *NewBBIDom = 0;
> +    unsigned i = 0;
> +    for (i = 0; i < PredBlocks.size(); ++i)
> +      if (DT.isReachableFromEntry(PredBlocks[i])) {
> +        NewBBIDom = PredBlocks[i];
> +        break;
> +      }
> +    assert(i != PredBlocks.size() && "No reachable preds?");
> +    for (i = i + 1; i < PredBlocks.size(); ++i) {
> +      if (DT.isReachableFromEntry(PredBlocks[i]))
> +        NewBBIDom = DT.findNearestCommonDominator(NewBBIDom, 
> PredBlocks[i]);
> +    }
> +    assert(NewBBIDom && "No immediate dominator found??");
> +
> +    // Create the new dominator tree node... and set the 
> idom of NewBB.
> +    DomTreeNode *NewBBNode = DT.addNewBlock(NewBB, NewBBIDom);
> +
> +    // If NewBB strictly dominates other blocks, then it is 
> now the immediate
> +    // dominator of NewBBSucc.  Update the dominator tree as 
> appropriate.
> +    if (NewBBDominatesNewBBSucc) {
> +      DomTreeNode *NewBBSuccNode = DT.getNode(NewBBSucc);
> +      DT.changeImmediateDominator(NewBBSuccNode, NewBBNode);
> +    }
> +  }
>  
>  public:
>    DominatorTreeBase(intptr_t ID, bool isPostDom) @@ -425,6 +512,15 @@
>      assert(getNode(BB) && "Removing node that isn't in 
> dominator tree.");
>      DomTreeNodes.erase(BB);
>    }
> +  
> +  /// splitBlock - BB is split and now it has one successor. Update 
> + dominator  /// tree to reflect this change.
> +  void splitBlock(NodeT* NewBB) {
> +    if (this->IsPostDominators)
> +      Split<Inverse<NodeT*>, GraphTraits<Inverse<NodeT*> > 
> >(*this, NewBB);
> +    else
> +      Split<NodeT*, GraphTraits<NodeT*> >(*this, NewBB);  }
>  
>    /// print - Convert to human readable form
>    ///
> @@ -471,21 +567,6 @@
>    friend void Calculate(DominatorTreeBase<typename 
> GraphT::NodeType>& DT,
>                          Function& F);
>    
> -  template<class N, class GraphT>
> -  friend void Split(DominatorTreeBase<typename GraphT::NodeType>& DT,
> -                    typename GraphT::NodeType* NewBB);
> -
> -public:
> -  /// splitBlock - BB is split and now it has one successor. 
> Update dominator
> -  /// tree to reflect this change.
> -  void splitBlock(NodeT* NewBB) {
> -    if (this->IsPostDominators)
> -      Split<Inverse<NodeT*>, GraphTraits<Inverse<NodeT*> > 
> >(*this, NewBB);
> -    else
> -      Split<NodeT*, GraphTraits<NodeT*> >(*this, NewBB);
> -  }
> -
> -protected:
>    /// updateDFSNumbers - Assign In and Out numbers to the 
> nodes while walking
>    /// dominator tree in dfs order.
>    void updateDFSNumbers() {
> 
> Modified: llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/
Utils/CodeExtractor.cpp?rev=43115&r1=43114&r2=43115&view=diff
> 
> ==============================================================
> ================
> --- llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp Thu Oct 18 
> +++ 00:13:52 2007
> @@ -21,7 +21,6 @@
>  #include "llvm/Module.h"
>  #include "llvm/Pass.h"
>  #include "llvm/Analysis/Dominators.h"
> -#include "llvm/Analysis/DominatorInternals.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Analysis/Verifier.h"
>  #include "llvm/Transforms/Utils/BasicBlockUtils.h"
> 
> Modified: llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/
Utils/LoopSimplify.cpp?rev=43115&r1=43114&r2=43115&view=diff
> 
> ==============================================================
> ================
> --- llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp (original)
> +++ llvm/trunk/lib/Transforms/Utils/LoopSimplify.cpp Thu Oct 
> 18 00:13:52 
> +++ 2007
> @@ -40,7 +40,6 @@
>  #include "llvm/Type.h"
>  #include "llvm/Analysis/AliasAnalysis.h"
>  #include "llvm/Analysis/Dominators.h"
> -#include "llvm/Analysis/DominatorInternals.h"
>  #include "llvm/Analysis/LoopInfo.h"
>  #include "llvm/Support/CFG.h"
>  #include "llvm/Support/Compiler.h"
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list