[Alignment][NFC] Add a helper function to DataLayout
authorGuillaume Chatelet <gchatelet@google.com>
Mon, 21 Oct 2019 13:58:33 +0000 (13:58 +0000)
committerGuillaume Chatelet <gchatelet@google.com>
Mon, 21 Oct 2019 13:58:33 +0000 (13:58 +0000)
Summary:
This is patch is part of a series to introduce an Alignment type.
See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html
See this patch for the introduction of the type: https://reviews.llvm.org/D64790

Reviewers: courbet

Subscribers: llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69258

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@375413 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/DataLayout.h
unittests/IR/DataLayoutTest.cpp

index 08fd269807a850cc79c2d0c1a4c7a1ea566c6754..8988f7d3c30aa06d3cb4e8fbbe3ac7bcdbb5a72b 100644 (file)
@@ -504,6 +504,13 @@ public:
   /// Returns the minimum ABI-required alignment for the specified type.
   unsigned getABITypeAlignment(Type *Ty) const;
 
+  /// Helper function to return `Alignment` if it's set or the result of
+  /// `getABITypeAlignment(Ty)`, in any case the result is a valid alignment.
+  inline Align getValueOrABITypeAlignment(MaybeAlign Alignment,
+                                          Type *Ty) const {
+    return Alignment ? *Alignment : Align(getABITypeAlignment(Ty));
+  }
+
   /// Returns the minimum ABI-required alignment for an integer type of
   /// the specified bitwidth.
   Align getABIIntegerTypeAlignment(unsigned BitWidth) const;
index e24e8e045dbd7c6ea85bb053485799fc1620262e..de8ac253c45cf7d06b59d7b51c53e939611883e2 100644 (file)
@@ -7,6 +7,8 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/IR/DataLayout.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Type.h"
 #include "gtest/gtest.h"
 
 using namespace llvm;
@@ -44,4 +46,14 @@ TEST(DataLayoutTest, FunctionPtrAlign) {
   EXPECT_EQ(a, c);
 }
 
+TEST(DataLayoutTest, ValueOrABITypeAlignment) {
+  const DataLayout DL("Fi8");
+  LLVMContext Context;
+  Type *const FourByteAlignType = Type::getInt32Ty(Context);
+  EXPECT_EQ(Align(16),
+            DL.getValueOrABITypeAlignment(MaybeAlign(16), FourByteAlignType));
+  EXPECT_EQ(Align(4),
+            DL.getValueOrABITypeAlignment(MaybeAlign(), FourByteAlignType));
+}
+
 }  // anonymous namespace