[llvm] dc4f9f0 - [ADT] Just use a union in IntervalMap
Benjamin Kramer via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 19 11:40:07 PST 2022
Author: Benjamin Kramer
Date: 2022-02-19T20:39:56+01:00
New Revision: dc4f9f0368cd56484d5e33364c06739be5ae1f1d
URL: https://github.com/llvm/llvm-project/commit/dc4f9f0368cd56484d5e33364c06739be5ae1f1d
DIFF: https://github.com/llvm/llvm-project/commit/dc4f9f0368cd56484d5e33364c06739be5ae1f1d.diff
LOG: [ADT] Just use a union in IntervalMap
IntervalMap has seen type-punned arrays, AlignedCharArrayUnion and
std::aligned_union_t, with varying degrees of buggyness. Plain unions
have become quite powerful, so just try that instead.
Added:
Modified:
llvm/include/llvm/ADT/IntervalMap.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/ADT/IntervalMap.h b/llvm/include/llvm/ADT/IntervalMap.h
index 368ed46f98d23..2da72aec77d5d 100644
--- a/llvm/include/llvm/ADT/IntervalMap.h
+++ b/llvm/include/llvm/ADT/IntervalMap.h
@@ -106,8 +106,6 @@
#include "llvm/ADT/PointerIntPair.h"
#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/bit.h"
-#include "llvm/Support/AlignOf.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/RecyclingAllocator.h"
#include <algorithm>
@@ -969,7 +967,10 @@ class IntervalMap {
private:
// The root data is either a RootLeaf or a RootBranchData instance.
- AlignedCharArrayUnion<RootLeaf, RootBranchData> data;
+ union {
+ RootLeaf leaf;
+ RootBranchData branchData;
+ };
// Tree height.
// 0: Leaves in root.
@@ -983,25 +984,22 @@ class IntervalMap {
// Allocator used for creating external nodes.
Allocator &allocator;
- /// Represent data as a node type without breaking aliasing rules.
- template <typename T> T &dataAs() const { return *bit_cast<T *>(&data); }
-
const RootLeaf &rootLeaf() const {
assert(!branched() && "Cannot acces leaf data in branched root");
- return dataAs<RootLeaf>();
+ return leaf;
}
RootLeaf &rootLeaf() {
assert(!branched() && "Cannot acces leaf data in branched root");
- return dataAs<RootLeaf>();
+ return leaf;
}
- RootBranchData &rootBranchData() const {
+ const RootBranchData &rootBranchData() const {
assert(branched() && "Cannot access branch data in non-branched root");
- return dataAs<RootBranchData>();
+ return branchData;
}
RootBranchData &rootBranchData() {
assert(branched() && "Cannot access branch data in non-branched root");
- return dataAs<RootBranchData>();
+ return branchData;
}
const RootBranch &rootBranch() const { return rootBranchData().node; }
@@ -1042,8 +1040,6 @@ class IntervalMap {
public:
explicit IntervalMap(Allocator &a) : height(0), rootSize(0), allocator(a) {
- assert((uintptr_t(&data) & (alignof(RootLeaf) - 1)) == 0 &&
- "Insufficient alignment");
new(&rootLeaf()) RootLeaf();
}
More information about the llvm-commits
mailing list