diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -2679,10 +2679,6 @@ given the default specifications above, the i7 type will use the alignment of i8 (next largest) while both i65 and i256 will use the alignment of i64 (largest specified). -#. If no match is found, and the type sought is a vector type, then the - largest vector type that is smaller than the sought vector type will - be used as a fall back. This happens because <128 x double> can be - implemented in terms of 64 <2 x double>, for example. The function of the data layout string may not be what you expect. Notably, this is not a specification from the frontend of what alignment 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 @@ -11,6 +11,7 @@ #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Type.h" +#include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" using namespace llvm; @@ -89,4 +90,18 @@ EXPECT_EQ(ExplicitGlobal2->getAddressSpace(), 123u); } +TEST(DataLayoutTest, VectorAlign) { + Expected DL = DataLayout::parse("v64:64"); + EXPECT_THAT_EXPECTED(DL, Succeeded()); + + LLVMContext Context; + Type *const FloatTy = Type::getFloatTy(Context); + Type *const V8F32Ty = FixedVectorType::get(FloatTy, 8); + + // The alignment for a vector type larger than any specified vector type uses + // the natural alignment as a fallback. + EXPECT_EQ(Align(4 * 8), DL->getABITypeAlign(V8F32Ty)); + EXPECT_EQ(Align(4 * 8), DL->getPrefTypeAlign(V8F32Ty)); +} + } // anonymous namespace