From 0bee630814d0031fa17997c3c21c8499ac42db60 Mon Sep 17 00:00:00 2001 From: Stanislav Mekhanoshin Date: Tue, 17 Apr 2018 21:40:04 +0000 Subject: [PATCH] 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 --- .../Transforms/Vectorize/LoadStoreVectorizer.cpp | 6 ++++-- llvm/test/CodeGen/X86/loadStore_vectorizer.ll | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/X86/loadStore_vectorizer.ll diff --git a/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp b/llvm/lib/Transforms/Vectorize/LoadStoreVectorizer.cpp index 984d972a6fd7..2e4707f916d7 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 000000000000..03f6ccce6c46 --- /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 +}