Skip to content

Commit

Permalink
SLPVectorizer: Use the type of the value loaded/stored to get the ABI…
Browse files Browse the repository at this point in the history
… 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
  • Loading branch information
aschwaighofer committed Aug 7, 2014
1 parent b93c57c commit 2158dec
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 3 deletions.
5 changes: 3 additions & 2 deletions lib/Transforms/Vectorize/SLPVectorizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1990,14 +1990,15 @@ 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(),
VecTy->getPointerTo(AS));
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;
Expand All @@ -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;
Expand Down
30 changes: 29 additions & 1 deletion test/Transforms/SLPVectorizer/X86/align.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}

0 comments on commit 2158dec

Please sign in to comment.