From: Stanislav Mekhanoshin Date: Tue, 17 Apr 2018 21:40:04 +0000 (+0000) Subject: LoadStoreVectorizer crashes due to unsized type X-Git-Tag: llvmorg-7.0.0-rc1~8020 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0bee630814d0031fa17997c3c21c8499ac42db60;p=platform%2Fupstream%2Fllvm.git LoadStoreVectorizer crashes due to unsized type When we skip bitcasts while looking for GEP in LoadSoreVectorizer we should also verify that the type is sized otherwise we assert Differential Revision: https://reviews.llvm.org/D45709 llvm-svn: 330221 --- diff --git a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp index 984d972..2e4707f 100644 --- a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp @@ -284,8 +284,10 @@ GetElementPtrInst *Vectorizer::getSourceGEP(Value *Src) const { // in pointee type size here. Currently it will not be vectorized. Value *SrcPtr = getLoadStorePointerOperand(Src); Value *SrcBase = SrcPtr->stripPointerCasts(); - if (DL.getTypeStoreSize(SrcPtr->getType()->getPointerElementType()) == - DL.getTypeStoreSize(SrcBase->getType()->getPointerElementType())) + Type *SrcPtrType = SrcPtr->getType()->getPointerElementType(); + Type *SrcBaseType = SrcBase->getType()->getPointerElementType(); + if (SrcPtrType->isSized() && SrcBaseType->isSized() && + DL.getTypeStoreSize(SrcPtrType) == DL.getTypeStoreSize(SrcBaseType)) SrcPtr = SrcBase; return dyn_cast(SrcPtr); } diff --git a/llvm/test/CodeGen/X86/loadStore_vectorizer.ll b/llvm/test/CodeGen/X86/loadStore_vectorizer.ll new file mode 100644 index 0000000..03f6ccc --- /dev/null +++ b/llvm/test/CodeGen/X86/loadStore_vectorizer.ll @@ -0,0 +1,16 @@ +; RUN: opt -load-store-vectorizer < %s -S | FileCheck %s + +%struct_render_pipeline_state = type opaque + +define fastcc void @main(%struct_render_pipeline_state addrspace(1)* %pso) unnamed_addr { +; CHECK: load i16 +; CHECK: load i16 +entry: + %tmp = bitcast %struct_render_pipeline_state addrspace(1)* %pso to i16 addrspace(1)* + %tmp1 = load i16, i16 addrspace(1)* %tmp, align 2 + %tmp2 = bitcast %struct_render_pipeline_state addrspace(1)* %pso to i8 addrspace(1)* + %sunkaddr51 = getelementptr i8, i8 addrspace(1)* %tmp2, i64 6 + %tmp3 = bitcast i8 addrspace(1)* %sunkaddr51 to i16 addrspace(1)* + %tmp4 = load i16, i16 addrspace(1)* %tmp3, align 2 + ret void +}