Teach DataLayout to infer a plausible alignment for things even when nothing is specified by the user.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231613 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2015-03-08 21:53:59 +00:00
parent 692f7382b5
commit c03496d4d0
2 changed files with 24 additions and 3 deletions

View File

@ -479,9 +479,7 @@ unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
// If we didn't find an integer alignment, fall back on most conservative.
if (AlignType == INTEGER_ALIGN) {
BestMatchIdx = LargestInt;
} else {
assert(AlignType == VECTOR_ALIGN && "Unknown alignment type!");
} else if (AlignType == VECTOR_ALIGN) {
// By default, use natural alignment for vector types. This is consistent
// with what clang and llvm-gcc do.
unsigned Align = getTypeAllocSize(cast<VectorType>(Ty)->getElementType());
@ -494,6 +492,19 @@ unsigned DataLayout::getAlignmentInfo(AlignTypeEnum AlignType,
}
}
// If we still couldn't find a reasonable default alignment, fall back
// to a simple heuristic that the alignment is the first power of two
// greater-or-equal to the store size of the type. This is a reasonable
// approximation of reality, and if the user wanted something less
// less conservative, they should have specified it explicitly in the data
// layout.
if (BestMatchIdx == -1) {
unsigned Align = getTypeStoreSize(Ty);
if (Align & (Align-1))
Align = NextPowerOf2(Align);
return Align;
}
// Since we got a "best match" index, just return it.
return ABIInfo ? Alignments[BestMatchIdx].ABIAlign
: Alignments[BestMatchIdx].PrefAlign;

View File

@ -0,0 +1,10 @@
; RUN: opt -verify -instcombine < %s
%Foo = type <{ i8, x86_fp80 }>
define i8 @t(%Foo* %arg) {
entry:
%0 = getelementptr %Foo, %Foo* %arg, i32 0, i32 0
%1 = load i8, i8* %0, align 1
ret i8 %1
}