[llvm] [DataLayout] Use member initialization (NFC) (PR #103712)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 14 00:54:32 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Sergei Barannikov (s-barannikov)

<details>
<summary>Changes</summary>

This also adds a default constructor and a few uses of it.

---
Full diff: https://github.com/llvm/llvm-project/pull/103712.diff


6 Files Affected:

- (modified) llvm/include/llvm/IR/DataLayout.h (+27-24) 
- (modified) llvm/lib/IR/DataLayout.cpp (+30-29) 
- (modified) llvm/lib/IR/Module.cpp (+1-1) 
- (modified) llvm/unittests/Analysis/ValueLatticeTest.cpp (+1-1) 
- (modified) llvm/unittests/CodeGen/LowLevelTypeTest.cpp (+2-3) 
- (modified) llvm/unittests/IR/VectorTypesTest.cpp (+2-2) 


``````````diff
diff --git a/llvm/include/llvm/IR/DataLayout.h b/llvm/include/llvm/IR/DataLayout.h
index 2b79facf1d8988..d73fe7ac300843 100644
--- a/llvm/include/llvm/IR/DataLayout.h
+++ b/llvm/include/llvm/IR/DataLayout.h
@@ -65,9 +65,6 @@ enum AlignTypeEnum {
 /// Layout alignment element.
 ///
 /// Stores the alignment data associated with a given type bit width.
-///
-/// \note The unusual order of elements in the structure attempts to reduce
-/// padding and make the structure slightly more cache friendly.
 struct LayoutAlignElem {
   uint32_t TypeBitWidth;
   Align ABIAlign;
@@ -82,14 +79,11 @@ struct LayoutAlignElem {
 /// Layout pointer alignment element.
 ///
 /// Stores the alignment data associated with a given pointer and address space.
-///
-/// \note The unusual order of elements in the structure attempts to reduce
-/// padding and make the structure slightly more cache friendly.
 struct PointerAlignElem {
+  uint32_t AddressSpace;
+  uint32_t TypeBitWidth;
   Align ABIAlign;
   Align PrefAlign;
-  uint32_t TypeBitWidth;
-  uint32_t AddressSpace;
   uint32_t IndexBitWidth;
 
   /// Initializer
@@ -115,16 +109,16 @@ class DataLayout {
     MultipleOfFunctionAlign,
   };
 private:
-  /// Defaults to false.
-  bool BigEndian;
+  bool BigEndian = false;
 
-  unsigned AllocaAddrSpace;
-  unsigned ProgramAddrSpace;
-  unsigned DefaultGlobalsAddrSpace;
+  unsigned AllocaAddrSpace = 0;
+  unsigned ProgramAddrSpace = 0;
+  unsigned DefaultGlobalsAddrSpace = 0;
 
   MaybeAlign StackNaturalAlign;
   MaybeAlign FunctionPtrAlign;
-  FunctionPtrAlignType TheFunctionPtrAlignType;
+  FunctionPtrAlignType TheFunctionPtrAlignType =
+      FunctionPtrAlignType::Independent;
 
   enum ManglingModeT {
     MM_None,
@@ -136,24 +130,30 @@ class DataLayout {
     MM_Mips,
     MM_XCOFF
   };
-  ManglingModeT ManglingMode;
+  ManglingModeT ManglingMode = MM_None;
 
   // FIXME: `unsigned char` truncates the value parsed by `parseSpecifier`.
   SmallVector<unsigned char, 8> LegalIntWidths;
 
-  /// Primitive type alignment data. This is sorted by type and bit
-  /// width during construction.
-  using AlignmentsTy = SmallVector<LayoutAlignElem, 4>;
-  AlignmentsTy IntAlignments;
-  AlignmentsTy FloatAlignments;
-  AlignmentsTy VectorAlignments;
+  // Default primitive type specifications.
+  static const LayoutAlignElem DefaultIntSpecs[];
+  static const LayoutAlignElem DefaultFloatSpecs[];
+  static const LayoutAlignElem DefaultVectorSpecs[];
+
+  // Default pointer type specifications.
+  static const PointerAlignElem DefaultPointerSpecs[];
+
+  // Primitive type specifications. Sorted and uniqued by type bit width.
+  SmallVector<LayoutAlignElem, 6> IntAlignments;
+  SmallVector<LayoutAlignElem, 4> FloatAlignments;
+  SmallVector<LayoutAlignElem, 10> VectorAlignments;
+
+  // Pointer type specifications. Sorted and uniqued by address space number.
+  SmallVector<PointerAlignElem, 8> Pointers;
 
   /// The string representation used to create this DataLayout
   std::string StringRepresentation;
 
-  using PointersTy = SmallVector<PointerAlignElem, 8>;
-  PointersTy Pointers;
-
   const PointerAlignElem &getPointerAlignElem(uint32_t AddressSpace) const;
 
   // Struct type ABI and preferred alignments. The default spec is "a:8:64".
@@ -189,6 +189,9 @@ class DataLayout {
   Error parseSpecifier(StringRef Desc);
 
 public:
+  /// Constructs a DataLayout with default values.
+  DataLayout();
+
   /// Constructs a DataLayout from a specification string.
   /// WARNING: Aborts execution if the string is malformed. Use parse() instead.
   explicit DataLayout(StringRef LayoutString);
diff --git a/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp
index c10b302870edbe..7ac91810255b2b 100644
--- a/llvm/lib/IR/DataLayout.cpp
+++ b/llvm/lib/IR/DataLayout.cpp
@@ -198,37 +198,38 @@ const char *DataLayout::getManglingComponent(const Triple &T) {
   return "-m:e";
 }
 
-static const std::pair<AlignTypeEnum, LayoutAlignElem> DefaultAlignments[] = {
-    {INTEGER_ALIGN, {1, Align(1), Align(1)}},    // i1
-    {INTEGER_ALIGN, {8, Align(1), Align(1)}},    // i8
-    {INTEGER_ALIGN, {16, Align(2), Align(2)}},   // i16
-    {INTEGER_ALIGN, {32, Align(4), Align(4)}},   // i32
-    {INTEGER_ALIGN, {64, Align(4), Align(8)}},   // i64
-    {FLOAT_ALIGN, {16, Align(2), Align(2)}},     // half, bfloat
-    {FLOAT_ALIGN, {32, Align(4), Align(4)}},     // float
-    {FLOAT_ALIGN, {64, Align(8), Align(8)}},     // double
-    {FLOAT_ALIGN, {128, Align(16), Align(16)}},  // ppcf128, quad, ...
-    {VECTOR_ALIGN, {64, Align(8), Align(8)}},    // v2i32, v1i64, ...
-    {VECTOR_ALIGN, {128, Align(16), Align(16)}}, // v16i8, v8i16, v4i32, ...
+// Default primitive type specifications.
+// NOTE: These arrays must be sorted by type bit width.
+constexpr LayoutAlignElem DataLayout::DefaultIntSpecs[] = {
+    {1, Align::Constant<1>(), Align::Constant<1>()},  // i1:8:8
+    {8, Align::Constant<1>(), Align::Constant<1>()},  // i8:8:8
+    {16, Align::Constant<2>(), Align::Constant<2>()}, // i16:16:16
+    {32, Align::Constant<4>(), Align::Constant<4>()}, // i32:32:32
+    {64, Align::Constant<4>(), Align::Constant<8>()}, // i64:32:64
+};
+constexpr LayoutAlignElem DataLayout::DefaultFloatSpecs[] = {
+    {16, Align::Constant<2>(), Align::Constant<2>()},    // f16:16:16
+    {32, Align::Constant<4>(), Align::Constant<4>()},    // f32:32:32
+    {64, Align::Constant<8>(), Align::Constant<8>()},    // f64:64:64
+    {128, Align::Constant<16>(), Align::Constant<16>()}, // f128:128:128
+};
+constexpr LayoutAlignElem DataLayout::DefaultVectorSpecs[] = {
+    {64, Align::Constant<8>(), Align::Constant<8>()},    // v64:64:64
+    {128, Align::Constant<16>(), Align::Constant<16>()}, // v128:128:128
 };
 
-DataLayout::DataLayout(StringRef LayoutString) {
-  BigEndian = false;
-  AllocaAddrSpace = 0;
-  ProgramAddrSpace = 0;
-  DefaultGlobalsAddrSpace = 0;
-  TheFunctionPtrAlignType = FunctionPtrAlignType::Independent;
-  ManglingMode = MM_None;
-
-  // Default alignments
-  for (const auto &[Kind, Layout] : DefaultAlignments) {
-    if (Error Err = setAlignment(Kind, Layout.ABIAlign, Layout.PrefAlign,
-                                 Layout.TypeBitWidth))
-      report_fatal_error(std::move(Err));
-  }
-  if (Error Err = setPointerAlignmentInBits(0, Align(8), Align(8), 64, 64))
-    report_fatal_error(std::move(Err));
+// Default pointer type specifications.
+constexpr PointerAlignElem DataLayout::DefaultPointerSpecs[] = {
+    {0, 64, Align::Constant<8>(), Align::Constant<8>(), 64} // p0:64:64:64:64
+};
+
+DataLayout::DataLayout()
+    : IntAlignments(ArrayRef(DefaultIntSpecs)),
+      FloatAlignments(ArrayRef(DefaultFloatSpecs)),
+      VectorAlignments(ArrayRef(DefaultVectorSpecs)),
+      Pointers(ArrayRef(DefaultPointerSpecs)) {}
 
+DataLayout::DataLayout(StringRef LayoutString) : DataLayout() {
   if (Error Err = parseSpecifier(LayoutString))
     report_fatal_error(std::move(Err));
 }
@@ -277,7 +278,7 @@ bool DataLayout::operator==(const DataLayout &Other) const {
 }
 
 Expected<DataLayout> DataLayout::parse(StringRef LayoutDescription) {
-  DataLayout Layout("");
+  DataLayout Layout;
   if (Error Err = Layout.parseSpecifier(LayoutDescription))
     return std::move(Err);
   return Layout;
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp
index 7ba5b2784f5460..704bc8d339bc57 100644
--- a/llvm/lib/IR/Module.cpp
+++ b/llvm/lib/IR/Module.cpp
@@ -73,7 +73,7 @@ template class llvm::SymbolTableListTraits<GlobalIFunc>;
 
 Module::Module(StringRef MID, LLVMContext &C)
     : Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)),
-      ModuleID(std::string(MID)), SourceFileName(std::string(MID)), DL(""),
+      ModuleID(std::string(MID)), SourceFileName(std::string(MID)),
       IsNewDbgInfoFormat(UseNewDbgInfoFormat) {
   Context.addModule(this);
 }
diff --git a/llvm/unittests/Analysis/ValueLatticeTest.cpp b/llvm/unittests/Analysis/ValueLatticeTest.cpp
index b456f286e0d965..1567bce2092986 100644
--- a/llvm/unittests/Analysis/ValueLatticeTest.cpp
+++ b/llvm/unittests/Analysis/ValueLatticeTest.cpp
@@ -22,7 +22,7 @@ namespace {
 class ValueLatticeTest : public testing::Test {
 protected:
   LLVMContext Context;
-  DataLayout DL = DataLayout("");
+  DataLayout DL;
 };
 
 TEST_F(ValueLatticeTest, ValueLatticeGetters) {
diff --git a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp
index b60d82b529fa3f..43aa4009897eeb 100644
--- a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp
+++ b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp
@@ -20,7 +20,6 @@ namespace {
 
 TEST(LowLevelTypeTest, Token) {
   LLVMContext C;
-  DataLayout DL("");
 
   const LLT TTy = LLT::token();
 
@@ -38,7 +37,7 @@ TEST(LowLevelTypeTest, Token) {
 
 TEST(LowLevelTypeTest, Scalar) {
   LLVMContext C;
-  DataLayout DL("");
+  DataLayout DL;
 
   for (unsigned S : {0U, 1U, 17U, 32U, 64U, 0xfffffU}) {
     const LLT Ty = LLT::scalar(S);
@@ -70,7 +69,7 @@ TEST(LowLevelTypeTest, Scalar) {
 
 TEST(LowLevelTypeTest, Vector) {
   LLVMContext C;
-  DataLayout DL("");
+  DataLayout DL;
 
   for (unsigned S : {0U, 1U, 17U, 32U, 64U, 0xfffU}) {
     for (auto EC :
diff --git a/llvm/unittests/IR/VectorTypesTest.cpp b/llvm/unittests/IR/VectorTypesTest.cpp
index 7ba143eeeeb81d..c592f809f7bf3e 100644
--- a/llvm/unittests/IR/VectorTypesTest.cpp
+++ b/llvm/unittests/IR/VectorTypesTest.cpp
@@ -276,7 +276,7 @@ TEST(VectorTypesTest, BaseVectorType) {
 
 TEST(VectorTypesTest, FixedLenComparisons) {
   LLVMContext Ctx;
-  DataLayout DL("");
+  DataLayout DL;
 
   Type *Int32Ty = Type::getInt32Ty(Ctx);
   Type *Int64Ty = Type::getInt64Ty(Ctx);
@@ -322,7 +322,7 @@ TEST(VectorTypesTest, FixedLenComparisons) {
 
 TEST(VectorTypesTest, ScalableComparisons) {
   LLVMContext Ctx;
-  DataLayout DL("");
+  DataLayout DL;
 
   Type *Int32Ty = Type::getInt32Ty(Ctx);
   Type *Int64Ty = Type::getInt64Ty(Ctx);

``````````

</details>


https://github.com/llvm/llvm-project/pull/103712


More information about the llvm-commits mailing list