@@ -262,7 +262,10 @@ class DominatorTreeBase {
262
262
SmallVector<std::unique_ptr<DomTreeNodeBase<NodeT>>>;
263
263
DomTreeNodeStorageTy DomTreeNodes;
264
264
// For graphs where blocks don't have numbers, create a numbering here.
265
- DenseMap<const NodeT *, unsigned > NodeNumberMap;
265
+ // TODO: use an empty struct with [[no_unique_address]] in C++20.
266
+ std::conditional_t <!GraphHasNodeNumbers<NodeT *>,
267
+ DenseMap<const NodeT *, unsigned >, std::tuple<>>
268
+ NodeNumberMap;
266
269
DomTreeNodeBase<NodeT> *RootNode = nullptr ;
267
270
ParentPtr Parent = nullptr ;
268
271
@@ -355,12 +358,8 @@ class DominatorTreeBase {
355
358
}
356
359
357
360
private:
358
- template <typename T>
359
- using has_number_t =
360
- decltype (GraphTraits<T *>::getNumber(std::declval<T *>()));
361
-
362
361
std::optional<unsigned > getNodeIndex (const NodeT *BB) const {
363
- if constexpr (is_detected< has_number_t , NodeT>::value ) {
362
+ if constexpr (GraphHasNodeNumbers< NodeT *> ) {
364
363
// BB can be nullptr, map nullptr to index 0.
365
364
assert (BlockNumberEpoch ==
366
365
GraphTraits<ParentPtr>::getNumberEpoch (Parent) &&
@@ -374,7 +373,7 @@ class DominatorTreeBase {
374
373
}
375
374
376
375
unsigned getNodeIndexForInsert (const NodeT *BB) {
377
- if constexpr (is_detected< has_number_t , NodeT>::value ) {
376
+ if constexpr (GraphHasNodeNumbers< NodeT *> ) {
378
377
// getNodeIndex will never fail if nodes have getNumber().
379
378
unsigned Idx = *getNodeIndex (BB);
380
379
if (Idx >= DomTreeNodes.size ()) {
@@ -736,7 +735,8 @@ class DominatorTreeBase {
736
735
}
737
736
738
737
DomTreeNodes[*IdxOpt] = nullptr ;
739
- NodeNumberMap.erase (BB);
738
+ if constexpr (!GraphHasNodeNumbers<NodeT *>)
739
+ NodeNumberMap.erase (BB);
740
740
741
741
if (!IsPostDom) return ;
742
742
@@ -830,7 +830,7 @@ class DominatorTreeBase {
830
830
private:
831
831
void updateBlockNumberEpoch () {
832
832
// Nothing to do for graphs that don't number their blocks.
833
- if constexpr (is_detected< has_number_t , NodeT>::value )
833
+ if constexpr (GraphHasNodeNumbers< NodeT *> )
834
834
BlockNumberEpoch = GraphTraits<ParentPtr>::getNumberEpoch (Parent);
835
835
}
836
836
@@ -849,9 +849,8 @@ class DominatorTreeBase {
849
849
}
850
850
851
851
// / Update dominator tree after renumbering blocks.
852
- template <class T_ = NodeT>
853
- std::enable_if_t <is_detected<has_number_t , T_>::value, void >
854
- updateBlockNumbers () {
852
+ template <typename T = NodeT>
853
+ std::enable_if_t <GraphHasNodeNumbers<T *>, void > updateBlockNumbers () {
855
854
updateBlockNumberEpoch ();
856
855
857
856
unsigned MaxNumber = GraphTraits<ParentPtr>::getMaxNumber (Parent);
@@ -889,7 +888,8 @@ class DominatorTreeBase {
889
888
890
889
void reset () {
891
890
DomTreeNodes.clear ();
892
- NodeNumberMap.clear ();
891
+ if constexpr (!GraphHasNodeNumbers<NodeT *>)
892
+ NodeNumberMap.clear ();
893
893
Roots.clear ();
894
894
RootNode = nullptr ;
895
895
Parent = nullptr ;
@@ -989,7 +989,8 @@ class DominatorTreeBase {
989
989
// / assignable and destroyable state, but otherwise invalid.
990
990
void wipe () {
991
991
DomTreeNodes.clear ();
992
- NodeNumberMap.clear ();
992
+ if constexpr (!GraphHasNodeNumbers<NodeT *>)
993
+ NodeNumberMap.clear ();
993
994
RootNode = nullptr ;
994
995
Parent = nullptr ;
995
996
}
0 commit comments