<div dir="ltr">FWIW, I think there's some value in using a utility here - saves writing the same type T twice, possibly having them get out of sync, Bit more readable by using a named construct for what's being done, etc.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Oct 14, 2020 at 4:16 PM Reid Kleckner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Reid Kleckner<br>
Date: 2020-10-14T16:16:02-07:00<br>
New Revision: 8b6d1c0467b2dfa14cb2d2dec7637bf95c78364b<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/8b6d1c0467b2dfa14cb2d2dec7637bf95c78364b" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/8b6d1c0467b2dfa14cb2d2dec7637bf95c78364b</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/8b6d1c0467b2dfa14cb2d2dec7637bf95c78364b.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/8b6d1c0467b2dfa14cb2d2dec7637bf95c78364b.diff</a><br>
<br>
LOG: [ADT] Use alignas + sizeof for inline storage, NFC<br>
<br>
AlignedCharArrayUnion is really only needed to handle the "union" case<br>
when we need memory of suitable size and alignment for multiple types.<br>
SmallVector only needs storage for one type, so use that directly.<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    clang/include/clang/AST/APValue.h<br>
    llvm/include/llvm/ADT/SmallVector.h<br>
    llvm/include/llvm/ADT/iterator_range.h<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang/include/clang/AST/APValue.h b/clang/include/clang/AST/APValue.h<br>
index ac8ed0818af0..5eb1f68f7690 100644<br>
--- a/clang/include/clang/AST/APValue.h<br>
+++ b/clang/include/clang/AST/APValue.h<br>
@@ -17,9 +17,10 @@<br>
 #include "llvm/ADT/APFixedPoint.h"<br>
 #include "llvm/ADT/APFloat.h"<br>
 #include "llvm/ADT/APSInt.h"<br>
+#include "llvm/ADT/FoldingSet.h"<br>
 #include "llvm/ADT/PointerIntPair.h"<br>
 #include "llvm/ADT/PointerUnion.h"<br>
-#include "llvm/ADT/FoldingSet.h"<br>
+#include "llvm/Support/AlignOf.h"<br>
<br>
 namespace clang {<br>
   class AddrLabelExpr;<br>
<br>
diff  --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h<br>
index c3c6a366dab2..dd5cd9531ded 100644<br>
--- a/llvm/include/llvm/ADT/SmallVector.h<br>
+++ b/llvm/include/llvm/ADT/SmallVector.h<br>
@@ -14,7 +14,6 @@<br>
 #define LLVM_ADT_SMALLVECTOR_H<br>
<br>
 #include "llvm/ADT/iterator_range.h"<br>
-#include "llvm/Support/AlignOf.h"<br>
 #include "llvm/Support/Compiler.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
 #include "llvm/Support/MathExtras.h"<br>
@@ -97,8 +96,9 @@ using SmallVectorSizeType =<br>
<br>
 /// Figure out the offset of the first element.<br>
 template <class T, typename = void> struct SmallVectorAlignmentAndSize {<br>
-  AlignedCharArrayUnion<SmallVectorBase<SmallVectorSizeType<T>>> Base;<br>
-  AlignedCharArrayUnion<T> FirstEl;<br>
+  alignas(SmallVectorBase<SmallVectorSizeType<T>>) char Base[sizeof(<br>
+      SmallVectorBase<SmallVectorSizeType<T>>)];<br>
+  alignas(T) char FirstEl[sizeof(T)];<br>
 };<br>
<br>
 /// This is the part of SmallVectorTemplateBase which does not depend on whether<br>
@@ -870,13 +870,13 @@ SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {<br>
 /// to avoid allocating unnecessary storage.<br>
 template <typename T, unsigned N><br>
 struct SmallVectorStorage {<br>
-  AlignedCharArrayUnion<T> InlineElts[N];<br>
+  alignas(T) char InlineElts[N * sizeof(T)];<br>
 };<br>
<br>
 /// We need the storage to be properly aligned even for small-size of 0 so that<br>
 /// the pointer math in \a SmallVectorTemplateCommon::getFirstEl() is<br>
 /// well-defined.<br>
-template <typename T> struct alignas(alignof(T)) SmallVectorStorage<T, 0> {};<br>
+template <typename T> struct alignas(T) SmallVectorStorage<T, 0> {};<br>
<br>
 /// This is a 'vector' (really, a variable-sized array), optimized<br>
 /// for the case when the array is small.  It contains some number of elements<br>
<br>
diff  --git a/llvm/include/llvm/ADT/iterator_range.h b/llvm/include/llvm/ADT/iterator_range.h<br>
index f038f6bf2128..a9b46a3aa45b 100644<br>
--- a/llvm/include/llvm/ADT/iterator_range.h<br>
+++ b/llvm/include/llvm/ADT/iterator_range.h<br>
@@ -18,7 +18,6 @@<br>
 #ifndef LLVM_ADT_ITERATOR_RANGE_H<br>
 #define LLVM_ADT_ITERATOR_RANGE_H<br>
<br>
-#include <iterator><br>
 #include <utility><br>
<br>
 namespace llvm {<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>