From: Arnold Schwaighofer Date: Thu, 7 Aug 2014 22:47:27 +0000 (+0000) Subject: SLPVectorizer: Use the type of the value loaded/stored to get the ABI alignment X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=2158dec9653eb651610bd9383f38b38bf2960d7e;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index d73e746d1ea..9fea4450a10 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -1990,6 +1990,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) { setInsertPointAfterBundle(E->Scalars); LoadInst *LI = cast(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; diff --git a/test/Transforms/SLPVectorizer/X86/align.ll b/test/Transforms/SLPVectorizer/X86/align.ll index f5865733ccb..ce806202506 100644 --- a/test/Transforms/SLPVectorizer/X86/align.ll +++ b/test/Transforms/SLPVectorizer/X86/align.ll @@ -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 +}