diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp index add82dc80c429..d63680fa97d2e 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp @@ -1235,6 +1235,14 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, : RISCV::VMV_V_X, LT.second, CostKind); } + case Intrinsic::experimental_vp_splice: { + // To support type-based query from vectorizer, set the index to 0. + // Note that index only change the cost from vslide.vx to vslide.vi and in + // current implementations they have same costs. + return getShuffleCost(TTI::SK_Splice, + cast(ICA.getArgTypes()[0]), {}, CostKind, + 0, cast(ICA.getReturnType())); + } } if (ST->hasVInstructions() && RetTy->isVectorTy()) { diff --git a/llvm/test/Analysis/CostModel/RISCV/vp-intrinsics.ll b/llvm/test/Analysis/CostModel/RISCV/vp-intrinsics.ll index 5126a6a0a3cbc..f6c71eb8733f0 100644 --- a/llvm/test/Analysis/CostModel/RISCV/vp-intrinsics.ll +++ b/llvm/test/Analysis/CostModel/RISCV/vp-intrinsics.ll @@ -2351,6 +2351,58 @@ define void @splat() { ret void } +define void @splice() { +; CHECK-LABEL: 'splice' +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv16i8 = call @llvm.experimental.vp.splice.nxv16i8( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv32i8 = call @llvm.experimental.vp.splice.nxv32i8( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv2i16 = call @llvm.experimental.vp.splice.nxv2i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv4i16 = call @llvm.experimental.vp.splice.nxv4i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv8i16 = call @llvm.experimental.vp.splice.nxv8i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv16i16 = call @llvm.experimental.vp.splice.nxv16i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv4i32 = call @llvm.experimental.vp.splice.nxv4i32( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv8i32 = call @llvm.experimental.vp.splice.nxv8i32( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv2i64 = call @llvm.experimental.vp.splice.nxv2i64( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv4i64 = call @llvm.experimental.vp.splice.nxv4i64( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv16i1 = call @llvm.experimental.vp.splice.nxv16i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv8i1 = call @llvm.experimental.vp.splice.nxv8i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv4i1 = call @llvm.experimental.vp.splice.nxv4i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv2i1 = call @llvm.experimental.vp.splice.nxv2i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void +; +; TYPEBASED-LABEL: 'splice' +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv16i8 = call @llvm.experimental.vp.splice.nxv16i8( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv32i8 = call @llvm.experimental.vp.splice.nxv32i8( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv2i16 = call @llvm.experimental.vp.splice.nxv2i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv4i16 = call @llvm.experimental.vp.splice.nxv4i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv8i16 = call @llvm.experimental.vp.splice.nxv8i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv16i16 = call @llvm.experimental.vp.splice.nxv16i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv4i32 = call @llvm.experimental.vp.splice.nxv4i32( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv8i32 = call @llvm.experimental.vp.splice.nxv8i32( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv2i64 = call @llvm.experimental.vp.splice.nxv2i64( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 8 for instruction: %splice_nxv4i64 = call @llvm.experimental.vp.splice.nxv4i64( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 4 for instruction: %splice_nxv16i1 = call @llvm.experimental.vp.splice.nxv16i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv8i1 = call @llvm.experimental.vp.splice.nxv8i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv4i1 = call @llvm.experimental.vp.splice.nxv4i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %splice_nxv2i1 = call @llvm.experimental.vp.splice.nxv2i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) +; TYPEBASED-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void +; + %splice_nxv16i8 = call @llvm.experimental.vp.splice.nxv16i8( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv32i8 = call @llvm.experimental.vp.splice.nxv32i8( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv2i16 = call @llvm.experimental.vp.splice.nxv2i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv4i16 = call @llvm.experimental.vp.splice.nxv4i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv8i16 = call @llvm.experimental.vp.splice.nxv8i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv16i16 = call @llvm.experimental.vp.splice.nxv16i16( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv4i32 = call @llvm.experimental.vp.splice.nxv4i32( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv8i32 = call @llvm.experimental.vp.splice.nxv8i32( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv2i64 = call @llvm.experimental.vp.splice.nxv2i64( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv4i64 = call @llvm.experimental.vp.splice.nxv4i64( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv16i1 = call @llvm.experimental.vp.splice.nxv16i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv8i1 = call @llvm.experimental.vp.splice.nxv8i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv4i1 = call @llvm.experimental.vp.splice.nxv4i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + %splice_nxv2i1 = call @llvm.experimental.vp.splice.nxv2i1( zeroinitializer, zeroinitializer, i32 1, zeroinitializer, i32 poison, i32 poison) + ret void +} + declare <2 x i8> @llvm.vp.add.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32) declare <4 x i8> @llvm.vp.add.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32) declare <8 x i8> @llvm.vp.add.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32)