Use DL preferred alignment for alloca in Value::getPointerAlignment

Teach Value::getPointerAlignment that allocas with no explicit alignment are aligned to preferred alignment of the allocated type.

Reviewed By: hfinkel

Differential Revision: http://reviews.llvm.org/D17569

llvm-svn: 267689
This commit is contained in:
Artur Pilipenko 2016-04-27 10:42:29 +00:00
parent 2f13da3ea4
commit c97eac6555
2 changed files with 14 additions and 3 deletions

View File

@ -554,9 +554,14 @@ unsigned Value::getPointerAlignment(const DataLayout &DL) const {
if (EltTy->isSized())
Align = DL.getABITypeAlignment(EltTy);
}
} else if (const AllocaInst *AI = dyn_cast<AllocaInst>(this))
} else if (const AllocaInst *AI = dyn_cast<AllocaInst>(this)) {
Align = AI->getAlignment();
else if (auto CS = ImmutableCallSite(this))
if (Align == 0) {
Type *AllocatedType = AI->getAllocatedType();
if (AllocatedType->isSized())
Align = DL.getPrefTypeAlignment(AllocatedType);
}
} else if (auto CS = ImmutableCallSite(this))
Align = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex);
else if (const LoadInst *LI = dyn_cast<LoadInst>(this))
if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) {

View File

@ -3,7 +3,7 @@
; Uses the print-deref (+ analyze to print) pass to run
; isDereferenceablePointer() on many load instruction operands
target datalayout = "e"
target datalayout = "e-i32:32:64"
%TypeOpaque = type opaque
@ -133,6 +133,12 @@ entry:
%load26 = load i32, i32* %d4_unaligned_load, align 16
%load27 = load i32, i32* %d4_aligned_load, align 16
; Alloca with no explicit alignment is aligned to preferred alignment of
; the type (specified by datalayout string).
; CHECK: %alloca.noalign{{.*}}(aligned)
%alloca.noalign = alloca i32
%load28 = load i32, i32* %alloca.noalign, align 8
ret void
}