@@ -93,8 +93,9 @@ template <class NodeT> class DomTreeNodeBase {
9393 DomTreeNodeBase (NodeT *BB, DomTreeNodeBase<NodeT> *iDom)
9494 : TheBB(BB), IDom(iDom), DFSNumIn(-1 ), DFSNumOut(-1 ) {}
9595
96- DomTreeNodeBase<NodeT> *addChild (DomTreeNodeBase<NodeT> *C) {
97- Children.push_back (C);
96+ std::unique_ptr<DomTreeNodeBase<NodeT>>
97+ addChild (std::unique_ptr<DomTreeNodeBase<NodeT>> C) {
98+ Children.push_back (C.get ());
9899 return C;
99100 }
100101
@@ -210,7 +211,8 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
210211 }
211212
212213protected:
213- typedef DenseMap<NodeT *, DomTreeNodeBase<NodeT> *> DomTreeNodeMapType;
214+ typedef DenseMap<NodeT *, std::unique_ptr<DomTreeNodeBase<NodeT>>>
215+ DomTreeNodeMapType;
214216 DomTreeNodeMapType DomTreeNodes;
215217 DomTreeNodeBase<NodeT> *RootNode;
216218
@@ -235,10 +237,6 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
235237 DenseMap<NodeT *, InfoRec> Info;
236238
237239 void reset () {
238- for (typename DomTreeNodeMapType::iterator I = this ->DomTreeNodes .begin (),
239- E = DomTreeNodes.end ();
240- I != E; ++I)
241- delete I->second ;
242240 DomTreeNodes.clear ();
243241 IDoms.clear ();
244242 this ->Roots .clear ();
@@ -314,7 +312,6 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
314312public:
315313 explicit DominatorTreeBase (bool isPostDom)
316314 : DominatorBase<NodeT>(isPostDom), DFSInfoValid(false ), SlowQueries(0 ) {}
317- ~DominatorTreeBase () { reset (); }
318315
319316 DominatorTreeBase (DominatorTreeBase &&Arg)
320317 : DominatorBase<NodeT>(
@@ -358,10 +355,10 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
358355 if (OI == OtherDomTreeNodes.end ())
359356 return true ;
360357
361- DomTreeNodeBase<NodeT> * MyNd = I->second ;
362- DomTreeNodeBase<NodeT> * OtherNd = OI->second ;
358+ DomTreeNodeBase<NodeT> & MyNd = * I->second ;
359+ DomTreeNodeBase<NodeT> & OtherNd = * OI->second ;
363360
364- if (MyNd-> compare (OtherNd))
361+ if (MyNd. compare (& OtherNd))
365362 return true ;
366363 }
367364
@@ -374,7 +371,10 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
374371 // / block. This is the same as using operator[] on this class.
375372 // /
376373 DomTreeNodeBase<NodeT> *getNode (NodeT *BB) const {
377- return DomTreeNodes.lookup (BB);
374+ auto I = DomTreeNodes.find (BB);
375+ if (I != DomTreeNodes.end ())
376+ return I->second .get ();
377+ return nullptr ;
378378 }
379379
380380 DomTreeNodeBase<NodeT> *operator [](NodeT *BB) const { return getNode (BB); }
@@ -555,8 +555,8 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
555555 DomTreeNodeBase<NodeT> *IDomNode = getNode (DomBB);
556556 assert (IDomNode && " Not immediate dominator specified for block!" );
557557 DFSInfoValid = false ;
558- return DomTreeNodes[BB] =
559- IDomNode-> addChild ( new DomTreeNodeBase<NodeT>(BB, IDomNode));
558+ return ( DomTreeNodes[BB] = IDomNode-> addChild (
559+ llvm::make_unique< DomTreeNodeBase<NodeT>> (BB, IDomNode))). get ( );
560560 }
561561
562562 // / changeImmediateDominator - This method is used to update the dominator
@@ -593,15 +593,6 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
593593 }
594594
595595 DomTreeNodes.erase (BB);
596- delete Node;
597- }
598-
599- // / removeNode - Removes a node from the dominator tree. Block must not
600- // / dominate any other blocks. Invalidates any node pointing to removed
601- // / block.
602- void removeNode (NodeT *BB) {
603- assert (getNode (BB) && " Removing node that isn't in dominator tree." );
604- DomTreeNodes.erase (BB);
605596 }
606597
607598 // / splitBlock - BB is split and now it has one successor. Update dominator
@@ -703,8 +694,8 @@ template <class NodeT> class DominatorTreeBase : public DominatorBase<NodeT> {
703694
704695 // Add a new tree node for this NodeT, and link it as a child of
705696 // IDomNode
706- DomTreeNodeBase<NodeT> *C = new DomTreeNodeBase<NodeT>(BB, IDomNode);
707- return this -> DomTreeNodes [BB] = IDomNode-> addChild (C );
697+ return ( this -> DomTreeNodes [BB] = IDomNode-> addChild (
698+ llvm::make_unique<DomTreeNodeBase<NodeT>>(BB, IDomNode))). get ( );
708699 }
709700
710701 NodeT *getIDom (NodeT *BB) const { return IDoms.lookup (BB); }
0 commit comments