diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -399,6 +399,10 @@ if (llvm::any_of(VL, [](Value *V) { return !isa(V); })) return InstructionsState(VL[BaseIndex], nullptr, nullptr); + // Make sure Instructions are not already vectorized. + if (llvm::any_of(VL, [](Value *V) { return V->getType()->isVectorTy(); })) + return InstructionsState(VL[BaseIndex], nullptr, nullptr); + bool IsCastOp = isa(VL[BaseIndex]); bool IsBinOp = isa(VL[BaseIndex]); unsigned Opcode = cast(VL[BaseIndex])->getOpcode(); diff --git a/llvm/test/Transforms/SLPVectorizer/AArch64/scalable-vector.ll b/llvm/test/Transforms/SLPVectorizer/AArch64/scalable-vector.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/AArch64/scalable-vector.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -slp-vectorizer -S | FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-unknown-linux-gnu" + +; This test check that we are not crashing or changing the code. + +define void @test() { +; CHECK-LABEL: @test( +; CHECK-NEXT: [[LOAD0:%.*]] = tail call @llvm.masked.load.nxv16i8.p0nxv16i8(* undef, i32 1, undef, undef) +; CHECK-NEXT: [[LOAD1:%.*]] = tail call @llvm.masked.load.nxv16i8.p0nxv16i8(* undef, i32 1, undef, undef) +; CHECK-NEXT: [[ADD:%.*]] = add [[LOAD1]], [[LOAD0]] +; CHECK-NEXT: tail call void @llvm.masked.store.nxv16i8.p0nxv16i8( [[ADD]], * undef, i32 1, undef) +; CHECK-NEXT: ret void +; + %load0 = tail call @llvm.masked.load.nxv16i8.p0nxv16i8( *undef, i32 1, undef, undef) + %load1 = tail call @llvm.masked.load.nxv16i8.p0nxv16i8( *undef, i32 1, undef, undef) + %add = add %load1, %load0 + tail call void @llvm.masked.store.nxv16i8.p0nxv16i8( %add, * undef, i32 1, undef) + ret void +} + +declare @llvm.masked.load.nxv16i8.p0nxv16i8(*, i32 immarg, , ) +declare void @llvm.masked.store.nxv16i8.p0nxv16i8(, *, i32 immarg, )