SLPVectorizer: Use the type of the value loaded/stored to get the ABI alignment

We were using the pointer type which is incorrect.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215162 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Arnold Schwaighofer 2014-08-07 22:47:27 +00:00
parent b93c57c0a9
commit 2158dec965
2 changed files with 32 additions and 3 deletions

View File

@ -1990,6 +1990,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
setInsertPointAfterBundle(E->Scalars);
LoadInst *LI = cast<LoadInst>(VL0);
Type *ScalarLoadTy = LI->getType();
unsigned AS = LI->getPointerAddressSpace();
Value *VecPtr = Builder.CreateBitCast(LI->getPointerOperand(),
@ -1997,7 +1998,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
unsigned Alignment = LI->getAlignment();
LI = Builder.CreateLoad(VecPtr);
if (!Alignment)
Alignment = DL->getABITypeAlignment(LI->getPointerOperand()->getType());
Alignment = DL->getABITypeAlignment(ScalarLoadTy);
LI->setAlignment(Alignment);
E->VectorizedValue = LI;
++NumVectorInstructions;
@ -2019,7 +2020,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
VecTy->getPointerTo(AS));
StoreInst *S = Builder.CreateStore(VecValue, VecPtr);
if (!Alignment)
Alignment = DL->getABITypeAlignment(SI->getPointerOperand()->getType());
Alignment = DL->getABITypeAlignment(SI->getValueOperand()->getType());
S->setAlignment(Alignment);
E->VectorizedValue = S;
++NumVectorInstructions;

View File

@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
target triple = "x86_64-apple-macosx10.8.0"
; Simple 3-pair chain with loads and stores
; CHECK: test1
; CHECK-LABEL: @test1
define void @test1(double* %a, double* %b, double* %c) {
entry:
%agg.tmp.i.i.sroa.0 = alloca [3 x double], align 16
@ -25,3 +25,31 @@ entry:
; CHECK: ret
ret void
}
; Float has 4 byte abi alignment on x86_64. We must use the alignmnet of the
; value being loaded/stored not the alignment of the pointer type.
; CHECK-LABEL: @test2
; CHECK-NOT: align 8
; CHECK: load <4 x float>{{.*}}, align 4
; CHECK: store <4 x float>{{.*}}, align 4
; CHECK: ret
define void @test2(float * %a, float * %b) {
entry:
%l0 = load float* %a
%a1 = getelementptr inbounds float* %a, i64 1
%l1 = load float* %a1
%a2 = getelementptr inbounds float* %a, i64 2
%l2 = load float* %a2
%a3 = getelementptr inbounds float* %a, i64 3
%l3 = load float* %a3
store float %l0, float* %b
%b1 = getelementptr inbounds float* %b, i64 1
store float %l1, float* %b1
%b2 = getelementptr inbounds float* %b, i64 2
store float %l2, float* %b2
%b3 = getelementptr inbounds float* %b, i64 3
store float %l3, float* %b3
ret void
}