diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -1233,6 +1233,14 @@ { TTI::SK_PermuteSingleSrc, MVT::v2f32, 1 }, // mov. { TTI::SK_PermuteSingleSrc, MVT::v4f32, 3 }, // perfectshuffle worst case. { TTI::SK_PermuteSingleSrc, MVT::v2f64, 1 }, // mov. + // Broadcast shuffle kinds for scalable vectors + { TTI::SK_Broadcast, MVT::nxv16i8, 1 }, + { TTI::SK_Broadcast, MVT::nxv8i16, 1 }, + { TTI::SK_Broadcast, MVT::nxv4i32, 1 }, + { TTI::SK_Broadcast, MVT::nxv2i64, 1 }, + { TTI::SK_Broadcast, MVT::nxv8f16, 1 }, + { TTI::SK_Broadcast, MVT::nxv4f32, 1 }, + { TTI::SK_Broadcast, MVT::nxv2f64, 1 }, }; std::pair LT = TLI->getTypeLegalizationCost(DL, Tp); if (const auto *Entry = CostTableLookup(ShuffleTbl, Kind, LT.second)) diff --git a/llvm/test/Analysis/CostModel/AArch64/sve-shuffle-broadcast.ll b/llvm/test/Analysis/CostModel/AArch64/sve-shuffle-broadcast.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/CostModel/AArch64/sve-shuffle-broadcast.ll @@ -0,0 +1,43 @@ +; Check getShuffleCost for SK_BroadCast with scalable vector + +; RUN: opt -cost-model -analyze -mtriple=aarch64--linux-gnu -mattr=sve < %s 2>%t | FileCheck %s + +; RUN: FileCheck --check-prefix=WARN --allow-empty %s <%t + +; If this check fails please read test/CodeGen/AArch64/README for instructions on how to resolve it. +; WARN-NOT: warning + + +define void @broadcast( %v) { +; CHECK-LABEL: 'broadcast': +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %zero = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %1 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %2 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %3 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %4 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %5 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %6 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %7 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %8 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %9 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %10 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %11 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %12 = shufflevector undef, poison, zeroinitializer +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %13 = shufflevector undef, poison, zeroinitializer +; CHECK-NETX: Cost Model: Found an estimated cost of 0 for instruction: ret void + %zero = shufflevector undef, poison, zeroinitializer + %1 = shufflevector undef, poison, zeroinitializer + %2 = shufflevector undef, poison, zeroinitializer + %3 = shufflevector undef, poison, zeroinitializer + %4 = shufflevector undef, poison, zeroinitializer + %5 = shufflevector undef, poison, zeroinitializer + %6 = shufflevector undef, poison, zeroinitializer + %7 = shufflevector undef, poison, zeroinitializer + %8 = shufflevector undef, poison, zeroinitializer + %9 = shufflevector undef, poison, zeroinitializer + %10 = shufflevector undef, poison, zeroinitializer + %11 = shufflevector undef, poison, zeroinitializer + %12 = shufflevector undef, poison, zeroinitializer + %13 = shufflevector undef, poison, zeroinitializer + ret void +}