diff --git a/llvm/include/llvm/IR/DataLayout.h b/llvm/include/llvm/IR/DataLayout.h --- a/llvm/include/llvm/IR/DataLayout.h +++ b/llvm/include/llvm/IR/DataLayout.h @@ -504,6 +504,13 @@ /// 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; diff --git a/llvm/unittests/IR/DataLayoutTest.cpp b/llvm/unittests/IR/DataLayoutTest.cpp --- a/llvm/unittests/IR/DataLayoutTest.cpp +++ b/llvm/unittests/IR/DataLayoutTest.cpp @@ -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 @@ 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