From 01b6f1cc9a9fbfc5c8f1d6038c1f371589b606fe Mon Sep 17 00:00:00 2001 From: Arnold Schwaighofer Date: Fri, 15 Nov 2013 23:09:33 +0000 Subject: [PATCH] LoopVectorizer: Use abi alignment for accesses with no alignment When we vectorize a scalar access with no alignment specified, we have to set the target's abi alignment of the scalar access on the vectorized access. Using the same alignment of zero would be wrong because most targets will have a bigger abi alignment for vector types. This probably fixes PR17878. llvm-svn: 194876 --- lib/Transforms/Vectorize/LoopVectorize.cpp | 4 +++ test/Transforms/LoopVectorize/align.ll | 33 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 test/Transforms/LoopVectorize/align.ll diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index bc649b3dbbc..e624bb49f2a 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -1205,6 +1205,10 @@ void InnerLoopVectorizer::vectorizeMemoryInstruction(Instruction *Instr, Type *DataTy = VectorType::get(ScalarDataTy, VF); Value *Ptr = LI ? LI->getPointerOperand() : SI->getPointerOperand(); unsigned Alignment = LI ? LI->getAlignment() : SI->getAlignment(); + // An alignment of 0 means target abi alignment. We need to use the scalar's + // target abi alignment in such a case. + if (!Alignment) + Alignment = DL->getABITypeAlignment(ScalarDataTy); unsigned AddressSpace = Ptr->getType()->getPointerAddressSpace(); unsigned ScalarAllocatedSize = DL->getTypeAllocSize(ScalarDataTy); unsigned VectorElementSize = DL->getTypeStoreSize(DataTy)/VF; diff --git a/test/Transforms/LoopVectorize/align.ll b/test/Transforms/LoopVectorize/align.ll new file mode 100644 index 00000000000..84b03615d37 --- /dev/null +++ b/test/Transforms/LoopVectorize/align.ll @@ -0,0 +1,33 @@ +; RUN: opt < %s -loop-vectorize -force-vector-unroll=1 -force-vector-width=4 -S | FileCheck %s + +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.8.0" + +; Make sure we output the abi alignment if no alignment is specified. + +;CHECK-LABEL: @align +;CHECK: load <4 x i32>* {{.*}} align 4 +;CHECK: load <4 x i32>* {{.*}} align 4 +;CHECK: store <4 x i32> {{.*}} align 4 + +define void @align(i32* %a, i32* %b, i32* %c) nounwind uwtable ssp { + br label %1 + +;