Skip to content

Commit

Permalink
Teach DataLayout to infer a plausible alignment for things even when …
Browse files Browse the repository at this point in the history
…nothing is specified by the user.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231613 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
resistor committed Mar 8, 2015
1 parent 692f738 commit c03496d
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 3 deletions.
17 changes: 14 additions & 3 deletions lib/IR/DataLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand All @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions test/Transforms/InstCombine/default-alignment.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit c03496d

Please sign in to comment.