[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