-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[CostModel] Add -cost-kind=all costmodel output #130490
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-llvm-analysis Author: David Green (davemgreen) ChangesIn order to make the different cost model kinds easier to test, and to manage the complexity of all the different variants, this patch introduces a -cost-kind=all option that will print the output of all cost model kinds. It feel especially helpful for tests that already have multiple run lines (with / without +fullfp16 for example). It currently produces the output:
The output is collapsed into a single value if all costs are the same. Invalid costs print "Invalid" via the normal InstructionCost printing. Two test files are updated to show some examples with -intrinsic-cost-strategy=type-based-intrinsic-cost and Invalid costs. Once we have something we are happy with I will try to use this to update more tests, as in b021bdb but for more variants. Patch is 344.70 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/130490.diff 3 Files Affected:
diff --git a/llvm/lib/Analysis/CostModel.cpp b/llvm/lib/Analysis/CostModel.cpp
index 27a946c846e67..f41ede3a35198 100644
--- a/llvm/lib/Analysis/CostModel.cpp
+++ b/llvm/lib/Analysis/CostModel.cpp
@@ -28,17 +28,25 @@
using namespace llvm;
-static cl::opt<TargetTransformInfo::TargetCostKind> CostKind(
+enum OutputCostKind {
+ RecipThroughput,
+ Latency,
+ CodeSize,
+ SizeAndLatency,
+ All,
+};
+
+static cl::opt<OutputCostKind> CostKind(
"cost-kind", cl::desc("Target cost kind"),
- cl::init(TargetTransformInfo::TCK_RecipThroughput),
- cl::values(clEnumValN(TargetTransformInfo::TCK_RecipThroughput,
- "throughput", "Reciprocal throughput"),
- clEnumValN(TargetTransformInfo::TCK_Latency,
- "latency", "Instruction latency"),
- clEnumValN(TargetTransformInfo::TCK_CodeSize,
- "code-size", "Code size"),
- clEnumValN(TargetTransformInfo::TCK_SizeAndLatency,
- "size-latency", "Code size and latency")));
+ cl::init(OutputCostKind::RecipThroughput),
+ cl::values(clEnumValN(OutputCostKind::RecipThroughput, "throughput",
+ "Reciprocal throughput"),
+ clEnumValN(OutputCostKind::Latency, "latency",
+ "Instruction latency"),
+ clEnumValN(OutputCostKind::CodeSize, "code-size", "Code size"),
+ clEnumValN(OutputCostKind::SizeAndLatency, "size-latency",
+ "Code size and latency"),
+ clEnumValN(OutputCostKind::All, "all", "Print all cost kinds")));
enum class IntrinsicCostStrategy {
InstructionCost,
@@ -63,6 +71,22 @@ static cl::opt<IntrinsicCostStrategy> IntrinsicCost(
#define CM_NAME "cost-model"
#define DEBUG_TYPE CM_NAME
+static InstructionCost getCost(Instruction &Inst, TTI::TargetCostKind CostKind,
+ TargetTransformInfo &TTI,
+ TargetLibraryInfo &TLI) {
+ auto *II = dyn_cast<IntrinsicInst>(&Inst);
+ if (II && IntrinsicCost != IntrinsicCostStrategy::InstructionCost) {
+ IntrinsicCostAttributes ICA(
+ II->getIntrinsicID(), *II, InstructionCost::getInvalid(),
+ /*TypeBasedOnly=*/IntrinsicCost ==
+ IntrinsicCostStrategy::TypeBasedIntrinsicCost,
+ &TLI);
+ return TTI.getIntrinsicInstrCost(ICA, CostKind);
+ }
+
+ return TTI.getInstructionCost(&Inst, CostKind);
+}
+
PreservedAnalyses CostModelPrinterPass::run(Function &F,
FunctionAnalysisManager &AM) {
auto &TTI = AM.getResult<TargetIRAnalysis>(F);
@@ -70,27 +94,28 @@ PreservedAnalyses CostModelPrinterPass::run(Function &F,
OS << "Printing analysis 'Cost Model Analysis' for function '" << F.getName() << "':\n";
for (BasicBlock &B : F) {
for (Instruction &Inst : B) {
- // TODO: Use a pass parameter instead of cl::opt CostKind to determine
- // which cost kind to print.
- InstructionCost Cost;
- auto *II = dyn_cast<IntrinsicInst>(&Inst);
- if (II && IntrinsicCost != IntrinsicCostStrategy::InstructionCost) {
- IntrinsicCostAttributes ICA(
- II->getIntrinsicID(), *II, InstructionCost::getInvalid(),
- /*TypeBasedOnly=*/IntrinsicCost ==
- IntrinsicCostStrategy::TypeBasedIntrinsicCost,
- &TLI);
- Cost = TTI.getIntrinsicInstrCost(ICA, CostKind);
+ OS << "Cost Model: ";
+ if (CostKind == OutputCostKind::All) {
+ OS << "Found costs of ";
+ InstructionCost RThru = getCost(Inst, TTI::TCK_RecipThroughput, TTI, TLI);
+ InstructionCost CodeSize = getCost(Inst, TTI::TCK_CodeSize, TTI, TLI);
+ InstructionCost Lat = getCost(Inst, TTI::TCK_Latency, TTI, TLI);
+ InstructionCost SizeLat = getCost(Inst, TTI::TCK_SizeAndLatency, TTI, TLI);
+ if (RThru == CodeSize && RThru == Lat && RThru == SizeLat)
+ OS << RThru;
+ else
+ OS << "RThru:" << RThru << " CodeSize:" << CodeSize << " Lat:" << Lat
+ << " SizeLat:" << SizeLat;
+ OS << " for: " << Inst << "\n";
} else {
- Cost = TTI.getInstructionCost(&Inst, CostKind);
+ InstructionCost Cost =
+ getCost(Inst, (TTI::TargetCostKind)(unsigned)CostKind, TTI, TLI);
+ if (auto CostVal = Cost.getValue())
+ OS << "Found an estimated cost of " << *CostVal;
+ else
+ OS << "Invalid cost";
+ OS << " for instruction: " << Inst << "\n";
}
-
- if (auto CostVal = Cost.getValue())
- OS << "Cost Model: Found an estimated cost of " << *CostVal;
- else
- OS << "Cost Model: Invalid cost";
-
- OS << " for instruction: " << Inst << "\n";
}
}
return PreservedAnalyses::all();
diff --git a/llvm/test/Analysis/CostModel/AArch64/arith-fp.ll b/llvm/test/Analysis/CostModel/AArch64/arith-fp.ll
index 3e9d2259cf5f4..de6b918afe943 100644
--- a/llvm/test/Analysis/CostModel/AArch64/arith-fp.ll
+++ b/llvm/test/Analysis/CostModel/AArch64/arith-fp.ll
@@ -1,37 +1,22 @@
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
-; RUN: opt < %s -enable-no-nans-fp-math -passes="print<cost-model>" -cost-kind=throughput 2>&1 -disable-output -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s --check-prefix=RECIP
-; RUN: opt < %s -enable-no-nans-fp-math -passes="print<cost-model>" -cost-kind=code-size 2>&1 -disable-output -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s --check-prefix=SIZE
+; RUN: opt < %s -passes="print<cost-model>" -cost-kind=all 2>&1 -disable-output -mtriple=aarch64 -mattr=+fullfp16 | FileCheck %s
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
define i32 @fadd(i32 %arg) {
-; RECIP-LABEL: 'fadd'
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fadd half undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fadd <4 x half> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fadd <8 x half> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V16F16 = fadd <16 x half> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fadd float undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fadd <2 x float> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fadd <4 x float> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V8F32 = fadd <8 x float> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fadd double undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fadd <2 x double> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V4F64 = fadd <4 x double> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
-;
-; SIZE-LABEL: 'fadd'
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fadd half undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fadd <4 x half> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fadd <8 x half> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V16F16 = fadd <16 x half> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fadd float undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fadd <2 x float> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fadd <4 x float> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F32 = fadd <8 x float> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fadd double undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fadd <2 x double> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F64 = fadd <4 x double> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
+; CHECK-LABEL: 'fadd'
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F16 = fadd half undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F16 = fadd <4 x half> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V8F16 = fadd <8 x half> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V16F16 = fadd <16 x half> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F32 = fadd float undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fadd <2 x float> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fadd <4 x float> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V8F32 = fadd <8 x float> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F64 = fadd double undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fadd <2 x double> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fadd <4 x double> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret i32 undef
;
%F16 = fadd half undef, undef
%V4F16 = fadd <4 x half> undef, undef
@@ -51,33 +36,19 @@ define i32 @fadd(i32 %arg) {
}
define i32 @fsub(i32 %arg) {
-; RECIP-LABEL: 'fsub'
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fsub half undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fsub <4 x half> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fsub <8 x half> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V16F16 = fsub <16 x half> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fsub float undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fsub <2 x float> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fsub <4 x float> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V8F32 = fsub <8 x float> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fsub double undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fsub <2 x double> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V4F64 = fsub <4 x double> undef, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
-;
-; SIZE-LABEL: 'fsub'
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fsub half undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fsub <4 x half> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fsub <8 x half> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V16F16 = fsub <16 x half> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fsub float undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fsub <2 x float> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fsub <4 x float> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F32 = fsub <8 x float> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fsub double undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fsub <2 x double> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F64 = fsub <4 x double> undef, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
+; CHECK-LABEL: 'fsub'
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F16 = fsub half undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F16 = fsub <4 x half> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V8F16 = fsub <8 x half> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V16F16 = fsub <16 x half> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F32 = fsub float undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fsub <2 x float> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fsub <4 x float> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V8F32 = fsub <8 x float> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F64 = fsub double undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fsub <2 x double> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fsub <4 x double> undef, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret i32 undef
;
%F16 = fsub half undef, undef
%V4F16 = fsub <4 x half> undef, undef
@@ -97,31 +68,18 @@ define i32 @fsub(i32 %arg) {
}
define i32 @fneg_idiom(i32 %arg) {
-; RECIP-LABEL: 'fneg_idiom'
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fsub half 0xH8000, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fsub <4 x half> splat (half 0xH8000), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fsub <8 x half> splat (half 0xH8000), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fsub float -0.000000e+00, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fsub <2 x float> splat (float -0.000000e+00), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fsub <4 x float> splat (float -0.000000e+00), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V8F32 = fsub <8 x float> splat (float -0.000000e+00), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fsub double -0.000000e+00, undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fsub <2 x double> splat (double -0.000000e+00), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V4F64 = fsub <4 x double> splat (double -0.000000e+00), undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
-;
-; SIZE-LABEL: 'fneg_idiom'
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fsub half 0xH8000, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fsub <4 x half> splat (half 0xH8000), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fsub <8 x half> splat (half 0xH8000), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fsub float -0.000000e+00, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fsub <2 x float> splat (float -0.000000e+00), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fsub <4 x float> splat (float -0.000000e+00), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F32 = fsub <8 x float> splat (float -0.000000e+00), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fsub double -0.000000e+00, undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fsub <2 x double> splat (double -0.000000e+00), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F64 = fsub <4 x double> splat (double -0.000000e+00), undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
+; CHECK-LABEL: 'fneg_idiom'
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F16 = fsub half 0xH8000, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F16 = fsub <4 x half> splat (half 0xH8000), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V8F16 = fsub <8 x half> splat (half 0xH8000), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F32 = fsub float -0.000000e+00, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fsub <2 x float> splat (float -0.000000e+00), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fsub <4 x float> splat (float -0.000000e+00), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V8F32 = fsub <8 x float> splat (float -0.000000e+00), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F64 = fsub double -0.000000e+00, undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fsub <2 x double> splat (double -0.000000e+00), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fsub <4 x double> splat (double -0.000000e+00), undef
+; CHECK-NEXT: Cost Model: Found costs of RThru:0 CodeSize:1 Lat:1 SizeLat:1 for: ret i32 undef
;
%F16 = fsub half -0.0, undef
%V4F16 = fsub <4 x half> <half -0.0, half -0.0, half -0.0, half -0.0>, undef
@@ -140,35 +98,20 @@ define i32 @fneg_idiom(i32 %arg) {
}
define i32 @fneg(i32 %arg) {
-; RECIP-LABEL: 'fneg'
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fneg half undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F16 = fneg <2 x half> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fneg <4 x half> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V8F16 = fneg <8 x half> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V16F16 = fneg <16 x half> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F32 = fneg float undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F32 = fneg <2 x float> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F32 = fneg <4 x float> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V8F32 = fneg <8 x float> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F64 = fneg double undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F64 = fneg <2 x double> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 2 for instruction: %V4F64 = fneg <4 x double> undef
-; RECIP-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
-;
-; SIZE-LABEL: 'fneg'
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %F16 = fneg half undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V2F16 = fneg <2 x half> undef
-; SIZE-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %V4F16 = fneg <4 x half> undef
-; SIZE-NEXT: Cost Mo...
[truncated]
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
This comment was marked as off-topic.
This comment was marked as off-topic.
4982363
to
fa9dfd9
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A couple of minors but I like the idea of less RUN / test files!
llvm/lib/Analysis/CostModel.cpp
Outdated
} else { | ||
Cost = TTI.getInstructionCost(&Inst, CostKind); | ||
InstructionCost Cost = | ||
getCost(Inst, (TTI::TargetCostKind)(unsigned)CostKind, TTI, TLI); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why the move to getCost? I feel like this should be a separate change?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was just to pull it out so that the "all" version above could call it multiple times and still get the intrinsic handling for each case. I have separated it out into the first commit, which I can push if it looks sensible to you.
fa9dfd9
to
f166a41
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks
llvm/lib/Analysis/CostModel.cpp
Outdated
} else { | ||
Cost = TTI.getInstructionCost(&Inst, CostKind); | ||
InstructionCost Cost = | ||
getCost(Inst, (TTI::TargetCostKind)(unsigned)CostKind, TTI, TLI); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was just to pull it out so that the "all" version above could call it multiple times and still get the intrinsic handling for each case. I have separated it out into the first commit, which I can push if it looks sensible to you.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM - cheers
In order to make the different cost model kinds easier to test, and to manage the complexity of all the different variants, this patch introduces a -cost-kind=all option that will print the output of all cost model kinds. It currently produces the output: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %F16 = fadd half undef, undef The output is collapsed into a single value if all costs are the same. Invalid costs print "Invalid" via the normal InstructionCost printing. Two test files are updated to show some examples with -intrinsic-cost-strategy=type-based-intrinsic-cost and Invalid costs. Once we have something we are happy with I will try to use this to update more tests.
f166a41
to
38ae968
Compare
Now that we have #130490 - merge the cost test files to avoid bitrot Lots more set of files to do - but this is give an example
In order to make the different cost model kinds easier to test, and to manage the complexity of all the different variants, this patch introduces a -cost-kind=all option that will print the output of all cost model kinds. It feel especially helpful for tests that already have multiple run lines (with / without +fullfp16 for example).
It currently produces the output:
The output is collapsed into a single value if all costs are the same. Invalid costs print "Invalid" via the normal InstructionCost printing.
Two test files are updated to show some examples with -intrinsic-cost-strategy=type-based-intrinsic-cost and Invalid costs. Once we have something we are happy with I will try to use this to update more tests, as in b021bdb but for more variants.