Skip to content

Commit

Permalink
[DomTree] Use SmallVector<DomTreeNodeBase *, 4> instead of std::vector.
Browse files Browse the repository at this point in the history
Currentl DomTreeNodeBase is using std::vectot to store it's children.
Using SmallVector should be more efficient in terms of compile-time.

A size of 4 seems to be the sweet-spot in terms of compile-time,
according to

http://llvm-compile-time-tracker.com/compare.php?from=9933188c90615c9c264ebb69117f09726e909a25&to=d7a801d027648877b20f0e00e822a7a64c58d976&stat=instructions

This results in the following geomean improvements

```
                       geomean insts     max rss
O3                          -0.31 %       +0.02 %
ReleaseThinLTO              -0.35 %       -0.12 %
ReleaseLTO                  -0.28 %       -0.12 %
O0                          -0.06 %       -0.02 %
NewPM O3                    -0.36 %       +0.05 %
ReleaseThinLTO (link only)  -0.44 %       -0.10 %
ReleaseLTO-g (link only):   -0.32 %       -0.03 %
```

I am not sure if there's any other benefits of using std::vector over
SmallVector.

Reviewed By: kuhar, asbirlea

Differential Revision: https://reviews.llvm.org/D87319
  • Loading branch information
fhahn committed Sep 9, 2020
1 parent 8cb8cea commit 3a61bfb
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions llvm/include/llvm/Support/GenericDomTree.h
Expand Up @@ -38,7 +38,6 @@
#include <memory>
#include <type_traits>
#include <utility>
#include <vector>

namespace llvm {

Expand All @@ -61,17 +60,17 @@ template <class NodeT> class DomTreeNodeBase {
NodeT *TheBB;
DomTreeNodeBase *IDom;
unsigned Level;
std::vector<DomTreeNodeBase *> Children;
SmallVector<DomTreeNodeBase *, 4> Children;
mutable unsigned DFSNumIn = ~0;
mutable unsigned DFSNumOut = ~0;

public:
DomTreeNodeBase(NodeT *BB, DomTreeNodeBase *iDom)
: TheBB(BB), IDom(iDom), Level(IDom ? IDom->Level + 1 : 0) {}

using iterator = typename std::vector<DomTreeNodeBase *>::iterator;
using iterator = typename SmallVector<DomTreeNodeBase *, 4>::iterator;
using const_iterator =
typename std::vector<DomTreeNodeBase *>::const_iterator;
typename SmallVector<DomTreeNodeBase *, 4>::const_iterator;

iterator begin() { return Children.begin(); }
iterator end() { return Children.end(); }
Expand Down Expand Up @@ -837,7 +836,7 @@ class DominatorTreeBase {
"NewBB should have a single successor!");
NodeRef NewBBSucc = *GraphT::child_begin(NewBB);

std::vector<NodeRef> PredBlocks;
SmallVector<NodeRef, 4> PredBlocks;
for (auto Pred : children<Inverse<N>>(NewBB))
PredBlocks.push_back(Pred);

Expand Down

0 comments on commit 3a61bfb

Please sign in to comment.