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,20 @@ EXPECT_EQ(ExplicitGlobal2->getAddressSpace(), 123u); } +TEST(DataLayoutTest, VectorAlign) { + auto DL = DataLayout::parse("v128:128"); + EXPECT_THAT_ERROR(DL.takeError(), Succeeded()); + + LLVMContext Context; + Type *const DoubleTy = Type::getDoubleTy(Context); + Type *const V128F64Ty = FixedVectorType::get(DoubleTy, 128); + + // The alignment for a vector type larger than any specified vector type uses + // the natual alignment as a fallback. This is contrary to old LangRef + // documentation which claimed it would use the largest vector type smaller + // than the one sought after. In this case, it would have been Align(16). + EXPECT_EQ(Align(128 * 8), DL->getABITypeAlign(V128F64Ty)); + EXPECT_EQ(Align(128 * 8), DL->getPrefTypeAlign(V128F64Ty)); +} + } // anonymous namespace