From aae2eaae2cefd3132059925c4592276defdb1faa Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Wed, 19 Jul 2023 11:20:39 -0700 Subject: [PATCH] [SLP]Fix a crash when trying to cast scalable vector type to fixed. Need to check for FixedVectorType, not a vector type, since later compiler performs unconditional cast to FixedVectorType and gets the number of elements in this type. --- llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp | 5 +++-- .../SLPVectorizer/RISCV/scalable-type-to-vect.ll | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 llvm/test/Transforms/SLPVectorizer/RISCV/scalable-type-to-vect.ll diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp index 32279ed..dc306f3 100644 --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -6156,7 +6156,7 @@ unsigned BoUpSLP::canMapToVector(Type *T, const DataLayout &DL) const { unsigned N = 1; Type *EltTy = T; - while (isa(EltTy)) { + while (isa(EltTy)) { if (auto *ST = dyn_cast(EltTy)) { // Check that struct is homogeneous. for (const auto *Ty : ST->elements()) @@ -6177,7 +6177,8 @@ unsigned BoUpSLP::canMapToVector(Type *T, const DataLayout &DL) const { if (!isValidElementType(EltTy)) return 0; uint64_t VTSize = DL.getTypeStoreSizeInBits(FixedVectorType::get(EltTy, N)); - if (VTSize < MinVecRegSize || VTSize > MaxVecRegSize || VTSize != DL.getTypeStoreSizeInBits(T)) + if (VTSize < MinVecRegSize || VTSize > MaxVecRegSize || + VTSize != DL.getTypeStoreSizeInBits(T)) return 0; return N; } diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/scalable-type-to-vect.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/scalable-type-to-vect.ll new file mode 100644 index 0000000..2efe92f --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/RISCV/scalable-type-to-vect.ll @@ -0,0 +1,14 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -S -passes=slp-vectorizer -mtriple=riscv64-unknown-unknown -mattr=+v < %s | FileCheck %s + +define { , } @foo() { +; CHECK-LABEL: define { , } @foo +; CHECK-SAME: () #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TMP0:%.*]] = insertvalue { , } zeroinitializer, zeroinitializer, 0 +; CHECK-NEXT: ret { , } zeroinitializer +; +entry: + %0 = insertvalue { , } zeroinitializer, zeroinitializer, 0 + ret { , } zeroinitializer +} -- 2.7.4