[llvm] r215162 - SLPVectorizer: Use the type of the value loaded/stored to get the ABI alignment
Arnold Schwaighofer
aschwaighofer at apple.com
Thu Aug 7 15:47:28 PDT 2014
Author: arnolds
Date: Thu Aug 7 17:47:27 2014
New Revision: 215162
URL: http://llvm.org/viewvc/llvm-project?rev=215162&view=rev
Log:
SLPVectorizer: Use the type of the value loaded/stored to get the ABI alignment
We were using the pointer type which is incorrect.
Modified:
llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
llvm/trunk/test/Transforms/SLPVectorizer/X86/align.ll
Modified: llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp?rev=215162&r1=215161&r2=215162&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp Thu Aug 7 17:47:27 2014
@@ -1990,6 +1990,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry
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
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
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;
Modified: llvm/trunk/test/Transforms/SLPVectorizer/X86/align.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SLPVectorizer/X86/align.ll?rev=215162&r1=215161&r2=215162&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/SLPVectorizer/X86/align.ll (original)
+++ llvm/trunk/test/Transforms/SLPVectorizer/X86/align.ll Thu Aug 7 17:47:27 2014
@@ -4,7 +4,7 @@ target datalayout = "e-p:64:64:64-i1:8:8
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
+}
More information about the llvm-commits
mailing list