X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FGenericDomTreeConstruction.h;h=3e867dc6cbf12cee4fc52bdc82795fbe6d35946c;hp=a0b444e7b9c4a6357f9218fe5a291158344d644b;hb=085ee025f04c9be4977e4c9dad1f3e6af7bbdc0a;hpb=2073b0a63cfd7ea54b5307953ce11f378365d73d diff --git a/include/llvm/Support/GenericDomTreeConstruction.h b/include/llvm/Support/GenericDomTreeConstruction.h index a0b444e7b9c..3e867dc6cbf 100644 --- a/include/llvm/Support/GenericDomTreeConstruction.h +++ b/include/llvm/Support/GenericDomTreeConstruction.h @@ -8,8 +8,8 @@ //===----------------------------------------------------------------------===// /// \file /// -/// Generic dominator tree construction - This file provides rouitens to -/// constructs immediate dominator information for a flow-graph based on the +/// Generic dominator tree construction - This file provides routines to +/// construct immediate dominator information for a flow-graph based on the /// algorithm described in this document: /// /// A Fast Algorithm for Finding Dominators in a Flowgraph @@ -21,9 +21,8 @@ /// //===----------------------------------------------------------------------===// - -#ifndef LLVM_SUPPORT_GENERIC_DOM_TREE_CONSTRUCTION_H -#define LLVM_SUPPORT_GENERIC_DOM_TREE_CONSTRUCTION_H +#ifndef LLVM_SUPPORT_GENERICDOMTREECONSTRUCTION_H +#define LLVM_SUPPORT_GENERICDOMTREECONSTRUCTION_H #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Support/GenericDomTree.h" @@ -88,7 +87,7 @@ unsigned DFSPass(DominatorTreeBase& DT, // Increment the successor number for the next time we get to it. ++Worklist.back().second; - + // Visit the successor next, if it isn't already visited. typename GraphT::NodeType* Succ = *NextSucc; @@ -103,9 +102,9 @@ unsigned DFSPass(DominatorTreeBase& DT, return N; } -template -typename GraphT::NodeType* -Eval(DominatorTreeBase& DT, +template +typename GraphT::NodeType * +Eval(DominatorTreeBase &DT, typename GraphT::NodeType *VIn, unsigned LastLinked) { typename DominatorTreeBase::InfoRec &VInInfo = DT.Info[VIn]; @@ -117,7 +116,7 @@ Eval(DominatorTreeBase& DT, if (VInInfo.Parent >= LastLinked) Work.push_back(VIn); - + while (!Work.empty()) { typename GraphT::NodeType* V = Work.back(); typename DominatorTreeBase::InfoRec &VInfo = @@ -125,11 +124,11 @@ Eval(DominatorTreeBase& DT, typename GraphT::NodeType* VAncestor = DT.Vertex[VInfo.Parent]; // Process Ancestor first - if (Visited.insert(VAncestor) && VInfo.Parent >= LastLinked) { + if (Visited.insert(VAncestor).second && VInfo.Parent >= LastLinked) { Work.push_back(VAncestor); continue; - } - Work.pop_back(); + } + Work.pop_back(); // Update VInfo based on Ancestor info if (VInfo.Parent < LastLinked) @@ -156,11 +155,11 @@ void Calculate(DominatorTreeBase::NodeType>& DT, bool MultipleRoots = (DT.Roots.size() > 1); if (MultipleRoots) { typename DominatorTreeBase::InfoRec &BBInfo = - DT.Info[NULL]; + DT.Info[nullptr]; BBInfo.DFSNum = BBInfo.Semi = ++N; - BBInfo.Label = NULL; + BBInfo.Label = nullptr; - DT.Vertex.push_back(NULL); // Vertex[n] = V; + DT.Vertex.push_back(nullptr); // Vertex[n] = V; } // Step #1: Number blocks in depth-first order and initialize variables used @@ -169,7 +168,7 @@ void Calculate(DominatorTreeBase::NodeType>& DT, i != e; ++i) N = DFSPass(DT, DT.Roots[i], N); - // it might be that some blocks did not get a DFS number (e.g., blocks of + // it might be that some blocks did not get a DFS number (e.g., blocks of // infinite loops). In these cases an artificial exit node is required. MultipleRoots |= (DT.isPostDominator() && N != GraphTraits::size(&F)); @@ -249,21 +248,24 @@ void Calculate(DominatorTreeBase::NodeType>& DT, // one exit block, or it may be the virtual exit (denoted by (BasicBlock *)0) // which postdominates all real exits if there are multiple exit blocks, or // an infinite loop. - typename GraphT::NodeType* Root = !MultipleRoots ? DT.Roots[0] : 0; + typename GraphT::NodeType* Root = !MultipleRoots ? DT.Roots[0] : nullptr; - DT.DomTreeNodes[Root] = DT.RootNode = - new DomTreeNodeBase(Root, 0); + DT.RootNode = + (DT.DomTreeNodes[Root] = + llvm::make_unique>( + Root, nullptr)).get(); // Loop over all of the reachable blocks in the function... for (unsigned i = 2; i <= N; ++i) { typename GraphT::NodeType* W = DT.Vertex[i]; - DomTreeNodeBase *BBNode = DT.DomTreeNodes[W]; - if (BBNode) continue; // Haven't calculated this node yet? + // Don't replace this with 'count', the insertion side effect is important + if (DT.DomTreeNodes[W]) + continue; // Haven't calculated this node yet? typename GraphT::NodeType* ImmDom = DT.getIDom(W); - assert(ImmDom || DT.DomTreeNodes[NULL]); + assert(ImmDom || DT.DomTreeNodes[nullptr]); // Get or calculate the node for the immediate dominator DomTreeNodeBase *IDomNode = @@ -271,19 +273,19 @@ void Calculate(DominatorTreeBase::NodeType>& DT, // Add a new tree node for this BasicBlock, and link it as a child of // IDomNode - DomTreeNodeBase *C = - new DomTreeNodeBase(W, IDomNode); - DT.DomTreeNodes[W] = IDomNode->addChild(C); + DT.DomTreeNodes[W] = IDomNode->addChild( + llvm::make_unique>( + W, IDomNode)); } // Free temporary memory used to construct idom's DT.IDoms.clear(); DT.Info.clear(); - std::vector().swap(DT.Vertex); + DT.Vertex.clear(); + DT.Vertex.shrink_to_fit(); DT.updateDFSNumbers(); } - } #endif