diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h @@ -83,6 +83,9 @@ VectorType *SubTp, ArrayRef Args = None); + InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, + TTI::TargetCostKind CostKind); + InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask, Align Alignment, diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp @@ -219,6 +219,23 @@ return NumLoads * MemOpCost; } +InstructionCost +RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, + TTI::TargetCostKind CostKind) { + auto *RetTy = ICA.getReturnType(); + switch (ICA.getID()) { + // TODO: add more intrinsic + case Intrinsic::experimental_stepvector: { + unsigned Cost = 1; // vid + auto LT = TLI->getTypeLegalizationCost(DL, RetTy); + return Cost + (LT.first - 1); + } + default: + break; + } + return BaseT::getIntrinsicInstrCost(ICA, CostKind); +} + InstructionCost RISCVTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, TTI::CastContextHint CCH, diff --git a/llvm/test/Analysis/CostModel/RISCV/stepvector.ll b/llvm/test/Analysis/CostModel/RISCV/stepvector.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/CostModel/RISCV/stepvector.ll @@ -0,0 +1,125 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py +; Check stepvector for scalable vector +; RUN: opt < %s -passes='print' 2>&1 -disable-output -S -mtriple=riscv64 -mattr=+v | FileCheck %s + +define void @stepvector() { +; CHECK-LABEL: 'stepvector' +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %zero = call @llvm.experimental.stepvector.nxv1i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %1 = call @llvm.experimental.stepvector.nxv2i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %2 = call @llvm.experimental.stepvector.nxv4i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %3 = call @llvm.experimental.stepvector.nxv8i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %4 = call @llvm.experimental.stepvector.nxv8i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %5 = call @llvm.experimental.stepvector.nxv8i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %6 = call @llvm.experimental.stepvector.nxv8i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %7 = call @llvm.experimental.stepvector.nxv8i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %8 = call @llvm.experimental.stepvector.nxv16i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %9 = call @llvm.experimental.stepvector.nxv32i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %10 = call @llvm.experimental.stepvector.nxv64i8() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %11 = call @llvm.experimental.stepvector.nxv1i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %12 = call @llvm.experimental.stepvector.nxv2i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %13 = call @llvm.experimental.stepvector.nxv4i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %14 = call @llvm.experimental.stepvector.nxv8i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %15 = call @llvm.experimental.stepvector.nxv16i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %16 = call @llvm.experimental.stepvector.nxv16i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %17 = call @llvm.experimental.stepvector.nxv16i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %18 = call @llvm.experimental.stepvector.nxv16i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %19 = call @llvm.experimental.stepvector.nxv16i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %20 = call @llvm.experimental.stepvector.nxv32i16() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %21 = call @llvm.experimental.stepvector.nxv1i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %22 = call @llvm.experimental.stepvector.nxv2i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %23 = call @llvm.experimental.stepvector.nxv4i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %24 = call @llvm.experimental.stepvector.nxv8i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %25 = call @llvm.experimental.stepvector.nxv16i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %26 = call @llvm.experimental.stepvector.nxv16i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %27 = call @llvm.experimental.stepvector.nxv16i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %28 = call @llvm.experimental.stepvector.nxv16i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %29 = call @llvm.experimental.stepvector.nxv16i32() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %30 = call @llvm.experimental.stepvector.nxv1i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %31 = call @llvm.experimental.stepvector.nxv2i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %32 = call @llvm.experimental.stepvector.nxv4i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %33 = call @llvm.experimental.stepvector.nxv8i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %34 = call @llvm.experimental.stepvector.nxv8i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %35 = call @llvm.experimental.stepvector.nxv8i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %36 = call @llvm.experimental.stepvector.nxv8i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %37 = call @llvm.experimental.stepvector.nxv8i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %38 = call @llvm.experimental.stepvector.nxv8i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %39 = call @llvm.experimental.stepvector.nxv16i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %40 = call @llvm.experimental.stepvector.nxv16i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %41 = call @llvm.experimental.stepvector.nxv16i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %42 = call @llvm.experimental.stepvector.nxv16i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %43 = call @llvm.experimental.stepvector.nxv16i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %44 = call @llvm.experimental.stepvector.nxv16i64() +; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void +; + %zero = call @llvm.experimental.stepvector.nxv1i8() + %1 = call @llvm.experimental.stepvector.nxv2i8() + %2 = call @llvm.experimental.stepvector.nxv4i8() + %3 = call @llvm.experimental.stepvector.nxv8i8() + %4 = call @llvm.experimental.stepvector.nxv8i8() + %5 = call @llvm.experimental.stepvector.nxv8i8() + %6 = call @llvm.experimental.stepvector.nxv8i8() + %7 = call @llvm.experimental.stepvector.nxv8i8() + %8 = call @llvm.experimental.stepvector.nxv16i8() + %9 = call @llvm.experimental.stepvector.nxv32i8() + %10 = call @llvm.experimental.stepvector.nxv64i8() + %11 = call @llvm.experimental.stepvector.nxv1i16() + %12 = call @llvm.experimental.stepvector.nxv2i16() + %13 = call @llvm.experimental.stepvector.nxv4i16() + %14 = call @llvm.experimental.stepvector.nxv8i16() + %15 = call @llvm.experimental.stepvector.nxv16i16() + %16 = call @llvm.experimental.stepvector.nxv16i16() + %17 = call @llvm.experimental.stepvector.nxv16i16() + %18 = call @llvm.experimental.stepvector.nxv16i16() + %19 = call @llvm.experimental.stepvector.nxv16i16() + %20 = call @llvm.experimental.stepvector.nxv32i16() + %21 = call @llvm.experimental.stepvector.nxv1i32() + %22 = call @llvm.experimental.stepvector.nxv2i32() + %23 = call @llvm.experimental.stepvector.nxv4i32() + %24 = call @llvm.experimental.stepvector.nxv8i32() + %25 = call @llvm.experimental.stepvector.nxv16i32() + %26 = call @llvm.experimental.stepvector.nxv16i32() + %27 = call @llvm.experimental.stepvector.nxv16i32() + %28 = call @llvm.experimental.stepvector.nxv16i32() + %29 = call @llvm.experimental.stepvector.nxv16i32() + %30 = call @llvm.experimental.stepvector.nxv1i64() + %31 = call @llvm.experimental.stepvector.nxv2i64() + %32 = call @llvm.experimental.stepvector.nxv4i64() + %33 = call @llvm.experimental.stepvector.nxv8i64() + %34 = call @llvm.experimental.stepvector.nxv8i64() + %35 = call @llvm.experimental.stepvector.nxv8i64() + %36 = call @llvm.experimental.stepvector.nxv8i64() + %37 = call @llvm.experimental.stepvector.nxv8i64() + %38 = call @llvm.experimental.stepvector.nxv8i64() + %39 = call @llvm.experimental.stepvector.nxv16i64() + %40 = call @llvm.experimental.stepvector.nxv16i64() + %41 = call @llvm.experimental.stepvector.nxv16i64() + %42 = call @llvm.experimental.stepvector.nxv16i64() + %43 = call @llvm.experimental.stepvector.nxv16i64() + %44 = call @llvm.experimental.stepvector.nxv16i64() + ret void +} + + +declare @llvm.experimental.stepvector.nxv1i8() +declare @llvm.experimental.stepvector.nxv2i8() +declare @llvm.experimental.stepvector.nxv4i8() +declare @llvm.experimental.stepvector.nxv8i8() +declare @llvm.experimental.stepvector.nxv16i8() +declare @llvm.experimental.stepvector.nxv32i8() +declare @llvm.experimental.stepvector.nxv64i8() +declare @llvm.experimental.stepvector.nxv1i16() +declare @llvm.experimental.stepvector.nxv2i16() +declare @llvm.experimental.stepvector.nxv4i16() +declare @llvm.experimental.stepvector.nxv8i16() +declare @llvm.experimental.stepvector.nxv16i16() +declare @llvm.experimental.stepvector.nxv32i16() +declare @llvm.experimental.stepvector.nxv1i32() +declare @llvm.experimental.stepvector.nxv2i32() +declare @llvm.experimental.stepvector.nxv4i32() +declare @llvm.experimental.stepvector.nxv8i32() +declare @llvm.experimental.stepvector.nxv16i32() +declare @llvm.experimental.stepvector.nxv1i64() +declare @llvm.experimental.stepvector.nxv2i64() +declare @llvm.experimental.stepvector.nxv4i64() +declare @llvm.experimental.stepvector.nxv8i64() +declare @llvm.experimental.stepvector.nxv16i64()