Skip to content

Commit a72d6ef

Browse files
committed
unique_ptrify the value in DominatorTreeBase::DomTreeNodes
(noticed the need for an explicit dtor in a recent commit & figured I'd tidy that up) llvm-svn: 226028
1 parent 456f271 commit a72d6ef

File tree

2 files changed

+27
-33
lines changed

2 files changed

+27
-33
lines changed

llvm/include/llvm/Support/GenericDomTree.h

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

212213
protected:
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> {
314312
public:
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); }

llvm/include/llvm/Support/GenericDomTreeConstruction.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,15 +251,17 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT,
251251
// an infinite loop.
252252
typename GraphT::NodeType* Root = !MultipleRoots ? DT.Roots[0] : nullptr;
253253

254-
DT.DomTreeNodes[Root] = DT.RootNode =
255-
new DomTreeNodeBase<typename GraphT::NodeType>(Root, nullptr);
254+
DT.RootNode =
255+
(DT.DomTreeNodes[Root] =
256+
llvm::make_unique<DomTreeNodeBase<typename GraphT::NodeType>>(
257+
Root, nullptr)).get();
256258

257259
// Loop over all of the reachable blocks in the function...
258260
for (unsigned i = 2; i <= N; ++i) {
259261
typename GraphT::NodeType* W = DT.Vertex[i];
260262

261-
DomTreeNodeBase<typename GraphT::NodeType> *BBNode = DT.DomTreeNodes[W];
262-
if (BBNode) continue; // Haven't calculated this node yet?
263+
if (DT.DomTreeNodes[W])
264+
continue; // Haven't calculated this node yet?
263265

264266
typename GraphT::NodeType* ImmDom = DT.getIDom(W);
265267

@@ -271,15 +273,16 @@ void Calculate(DominatorTreeBase<typename GraphTraits<NodeT>::NodeType>& DT,
271273

272274
// Add a new tree node for this BasicBlock, and link it as a child of
273275
// IDomNode
274-
DomTreeNodeBase<typename GraphT::NodeType> *C =
275-
new DomTreeNodeBase<typename GraphT::NodeType>(W, IDomNode);
276-
DT.DomTreeNodes[W] = IDomNode->addChild(C);
276+
DT.DomTreeNodes[W] = IDomNode->addChild(
277+
llvm::make_unique<DomTreeNodeBase<typename GraphT::NodeType>>(
278+
W, IDomNode));
277279
}
278280

279281
// Free temporary memory used to construct idom's
280282
DT.IDoms.clear();
281283
DT.Info.clear();
282-
std::vector<typename GraphT::NodeType*>().swap(DT.Vertex);
284+
DT.Vertex.clear();
285+
DT.Vertex.shrink_to_fit();
283286

284287
DT.updateDFSNumbers();
285288
}

0 commit comments

Comments
 (0)