mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-09 01:38:03 +00:00
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:
parent
b93c57c0a9
commit
2158dec965
@ -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;
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user