[LangRef] Remove incorrect vector alignment rules

The LangRef incorrectly says that if no exact match is found when
seeking alignment for a vector type, the largest vector type smaller
than the sought-after vector type. This is incorrect as vector types
require an exact match, else they fall back to reporting the natural
alignment.

The corrected rule was not added in its place, as rules for other types
(e.g., floating-point types) aren't documented.

A unit test was added to demonstrate this.

Reviewed By: aeubanks

Differential Revision: https://reviews.llvm.org/D112463
This commit is contained in:
Fraser Cormack 2021-10-25 15:47:50 +01:00
parent 10a356c47a
commit 8002fa6760
2 changed files with 15 additions and 4 deletions

View File

@ -2680,10 +2680,6 @@ following rules:
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

View File

@ -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 @@ TEST(DataLayoutTest, GlobalsAddressSpace) {
EXPECT_EQ(ExplicitGlobal2->getAddressSpace(), 123u);
}
TEST(DataLayoutTest, VectorAlign) {
Expected<DataLayout> 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