From 46ff2e05c57969b9cc36e3e982f9b1148252dff9 Mon Sep 17 00:00:00 2001 From: Suyog Sarda Date: Sat, 21 Sep 2019 18:16:37 +0000 Subject: [PATCH] SROA: Check Total Bits of vector type While Promoting alloca instruction of Vector Type, Check total size in bits of its slices too. If they don't match, don't promote the alloca instruction. Bug : https://bugs.llvm.org/show_bug.cgi?id=42585 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372480 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SROA.cpp | 8 +++++++ .../SROA/vector-promotion-different-size.ll | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 test/Transforms/SROA/vector-promotion-different-size.ll diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index 789cdeef173..b55f35831f9 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -1888,6 +1888,14 @@ static VectorType *isVectorPromotionViable(Partition &P, const DataLayout &DL) { bool HaveCommonEltTy = true; auto CheckCandidateType = [&](Type *Ty) { if (auto *VTy = dyn_cast(Ty)) { + // Return if bitcast to vectors is different for total size in bits. + if (!CandidateTys.empty()) { + VectorType *V = CandidateTys[0]; + if (DL.getTypeSizeInBits(VTy) != DL.getTypeSizeInBits(V)) { + CandidateTys.clear(); + return; + } + } CandidateTys.push_back(VTy); if (!CommonEltTy) CommonEltTy = VTy->getElementType(); diff --git a/test/Transforms/SROA/vector-promotion-different-size.ll b/test/Transforms/SROA/vector-promotion-different-size.ll new file mode 100644 index 00000000000..56e1f1f2160 --- /dev/null +++ b/test/Transforms/SROA/vector-promotion-different-size.ll @@ -0,0 +1,24 @@ +; RUN: opt < %s -sroa -S | FileCheck %s +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64" + +define <4 x i1> @vector_bitcast() { + ; CHECK-LABEL: @vector_bitcast + ; CHECK: alloca i1 + + %a = alloca <3 x i1> + store <3 x i1> , <3 x i1>* %a + %cast = bitcast <3 x i1>* %a to <4 x i1>* + %vec = load <4 x i1>, <4 x i1>* %cast + ret <4 x i1> %vec +} + +define void @vector_bitcast_2() { + ; CHECK-LABEL: @vector_bitcast_2 + ; CHECK: alloca <32 x i16> + + %"sum$1.host2" = alloca <32 x i16> + store <32 x i16> undef, <32 x i16>* %"sum$1.host2" + %bc = bitcast <32 x i16>* %"sum$1.host2" to <64 x i16>* + %bcl = load <64 x i16>, <64 x i16>* %bc + ret void +} -- 2.50.1