Skip to content

Commit 3a8249b

Browse files
committed
Add standalone cost model tests
1 parent 348fb3a commit 3a8249b

File tree

4 files changed

+78
-8
lines changed

4 files changed

+78
-8
lines changed

llvm/include/llvm/Analysis/TargetTransformInfo.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class IntrinsicCostAttributes {
132132
IntrinsicCostAttributes(
133133
Intrinsic::ID Id, const CallBase &CI,
134134
InstructionCost ScalarCost = InstructionCost::getInvalid(),
135-
bool TypeBasedOnly = false);
135+
bool TypeBasedOnly = false, TargetLibraryInfo const *LibInfo = nullptr);
136136

137137
IntrinsicCostAttributes(
138138
Intrinsic::ID Id, Type *RTy, ArrayRef<Type *> Tys,

llvm/lib/Analysis/CostModel.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
//===----------------------------------------------------------------------===//
1818

1919
#include "llvm/Analysis/CostModel.h"
20+
#include "llvm/Analysis/TargetLibraryInfo.h"
2021
#include "llvm/Analysis/TargetTransformInfo.h"
2122
#include "llvm/IR/Function.h"
2223
#include "llvm/IR/IntrinsicInst.h"
2324
#include "llvm/IR/PassManager.h"
2425
#include "llvm/Pass.h"
2526
#include "llvm/Support/CommandLine.h"
2627
#include "llvm/Support/raw_ostream.h"
28+
2729
using namespace llvm;
2830

2931
static cl::opt<TargetTransformInfo::TargetCostKind> CostKind(
@@ -48,19 +50,20 @@ static cl::opt<bool> TypeBasedIntrinsicCost("type-based-intrinsic-cost",
4850
PreservedAnalyses CostModelPrinterPass::run(Function &F,
4951
FunctionAnalysisManager &AM) {
5052
auto &TTI = AM.getResult<TargetIRAnalysis>(F);
53+
auto &TLI = AM.getResult<TargetLibraryAnalysis>(F);
5154
OS << "Printing analysis 'Cost Model Analysis' for function '" << F.getName() << "':\n";
5255
for (BasicBlock &B : F) {
5356
for (Instruction &Inst : B) {
5457
// TODO: Use a pass parameter instead of cl::opt CostKind to determine
5558
// which cost kind to print.
5659
InstructionCost Cost;
5760
auto *II = dyn_cast<IntrinsicInst>(&Inst);
58-
if (II && TypeBasedIntrinsicCost) {
59-
IntrinsicCostAttributes ICA(II->getIntrinsicID(), *II,
60-
InstructionCost::getInvalid(), true);
61+
if (II) {
62+
IntrinsicCostAttributes ICA(
63+
II->getIntrinsicID(), *II, InstructionCost::getInvalid(),
64+
/*TypeBasedOnly=*/TypeBasedIntrinsicCost, &TLI);
6165
Cost = TTI.getIntrinsicInstrCost(ICA, CostKind);
62-
}
63-
else {
66+
} else {
6467
Cost = TTI.getInstructionCost(&Inst, CostKind);
6568
}
6669

llvm/lib/Analysis/TargetTransformInfo.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ bool HardwareLoopInfo::canAnalyze(LoopInfo &LI) {
6969

7070
IntrinsicCostAttributes::IntrinsicCostAttributes(
7171
Intrinsic::ID Id, const CallBase &CI, InstructionCost ScalarizationCost,
72-
bool TypeBasedOnly)
72+
bool TypeBasedOnly, TargetLibraryInfo const *LibInfo)
7373
: II(dyn_cast<IntrinsicInst>(&CI)), RetTy(CI.getType()), IID(Id),
74-
ScalarizationCost(ScalarizationCost) {
74+
ScalarizationCost(ScalarizationCost), LibInfo(LibInfo) {
7575

7676
if (const auto *FPMO = dyn_cast<FPMathOperator>(&CI))
7777
FMF = FPMO->getFastMathFlags();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter "sincos"
2+
; RUN: opt < %s -mtriple=aarch64-gnu-linux -mattr=+neon,+sve -passes="print<cost-model>" -cost-kind=throughput 2>&1 -disable-output | FileCheck %s
3+
; RUN: opt < %s -mtriple=aarch64-gnu-linux -mattr=+neon,+sve -vector-library=ArmPL -passes="print<cost-model>" -cost-kind=throughput 2>&1 -disable-output | FileCheck %s -check-prefix=CHECK-VECLIB
4+
5+
define void @sincos(
6+
; CHECK-LABEL: 'sincos'
7+
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %f16 = call { half, half } @llvm.sincos.f16(half %x_f16)
8+
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %f32 = call { float, float } @llvm.sincos.f32(float %x_f32)
9+
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %f64 = call { double, double } @llvm.sincos.f64(double %x_f64)
10+
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %f128 = call { fp128, fp128 } @llvm.sincos.f128(fp128 %x_f128)
11+
;
12+
; CHECK: Cost Model: Found an estimated cost of 50 for instruction: %v8f16 = call { <8 x half>, <8 x half> } @llvm.sincos.v8f16(<8 x half> %x_v8xf16)
13+
; CHECK: Cost Model: Found an estimated cost of 58 for instruction: %v4f32 = call { <4 x float>, <4 x float> } @llvm.sincos.v4f32(<4 x float> %x_v4xf32)
14+
; CHECK: Cost Model: Found an estimated cost of 26 for instruction: %v2f64 = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %x_v2xf64)
15+
; CHECK: Cost Model: Found an estimated cost of 10 for instruction: %v1f128 = call { <1 x fp128>, <1 x fp128> } @llvm.sincos.v1f128(<1 x fp128> %x_v1xf128)
16+
;
17+
; CHECK: Cost Model: Invalid cost for instruction: %nxv8f16 = call { <vscale x 8 x half>, <vscale x 8 x half> } @llvm.sincos.nxv8f16(<vscale x 8 x half> %x_nxv8xf16)
18+
; CHECK: Cost Model: Invalid cost for instruction: %nxv4f32 = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincos.nxv4f32(<vscale x 4 x float> %x_nxv4xf32)
19+
; CHECK: Cost Model: Invalid cost for instruction: %nxv2f64 = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincos.nxv2f64(<vscale x 2 x double> %x_nxv2xf64)
20+
; CHECK: Cost Model: Invalid cost for instruction: %nxv1f128 = call { <vscale x 1 x fp128>, <vscale x 1 x fp128> } @llvm.sincos.nxv1f128(<vscale x 1 x fp128> %x_nxv1xf128)
21+
22+
; CHECK-VECLIB-LABEL: 'sincos'
23+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 1 for instruction: %f16 = call { half, half } @llvm.sincos.f16(half %x_f16)
24+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 10 for instruction: %f32 = call { float, float } @llvm.sincos.f32(float %x_f32)
25+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 10 for instruction: %f64 = call { double, double } @llvm.sincos.f64(double %x_f64)
26+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 10 for instruction: %f128 = call { fp128, fp128 } @llvm.sincos.f128(fp128 %x_f128)
27+
;
28+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 50 for instruction: %v8f16 = call { <8 x half>, <8 x half> } @llvm.sincos.v8f16(<8 x half> %x_v8xf16)
29+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 12 for instruction: %v4f32 = call { <4 x float>, <4 x float> } @llvm.sincos.v4f32(<4 x float> %x_v4xf32)
30+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 12 for instruction: %v2f64 = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %x_v2xf64)
31+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 10 for instruction: %v1f128 = call { <1 x fp128>, <1 x fp128> } @llvm.sincos.v1f128(<1 x fp128> %x_v1xf128)
32+
;
33+
; CHECK-VECLIB: Cost Model: Invalid cost for instruction: %nxv8f16 = call { <vscale x 8 x half>, <vscale x 8 x half> } @llvm.sincos.nxv8f16(<vscale x 8 x half> %x_nxv8xf16)
34+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 13 for instruction: %nxv4f32 = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincos.nxv4f32(<vscale x 4 x float> %x_nxv4xf32)
35+
; CHECK-VECLIB: Cost Model: Found an estimated cost of 13 for instruction: %nxv2f64 = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincos.nxv2f64(<vscale x 2 x double> %x_nxv2xf64)
36+
; CHECK-VECLIB: Cost Model: Invalid cost for instruction: %nxv1f128 = call { <vscale x 1 x fp128>, <vscale x 1 x fp128> } @llvm.sincos.nxv1f128(<vscale x 1 x fp128> %x_nxv1xf128)
37+
38+
half %x_f16,
39+
float %x_f32,
40+
double %x_f64,
41+
fp128 %x_f128,
42+
<8 x half> %x_v8xf16,
43+
<4 x float> %x_v4xf32,
44+
<2 x double> %x_v2xf64,
45+
<1 x fp128> %x_v1xf128,
46+
<vscale x 8 x half> %x_nxv8xf16,
47+
<vscale x 4 x float> %x_nxv4xf32,
48+
<vscale x 2 x double> %x_nxv2xf64,
49+
<vscale x 1 x fp128> %x_nxv1xf128
50+
) {
51+
%f16 = call { half, half } @llvm.sincos.f16(half %x_f16)
52+
%f32 = call { float, float } @llvm.sincos.f32(float %x_f32)
53+
%f64 = call { double, double } @llvm.sincos.f64(double %x_f64)
54+
%f128 = call { fp128, fp128 } @llvm.sincos.f128(fp128 %x_f128)
55+
56+
%v8f16 = call { <8 x half>, <8 x half> } @llvm.sincos.v8f16(<8 x half> %x_v8xf16)
57+
%v4f32 = call { <4 x float>, <4 x float> } @llvm.sincos.v4f32(<4 x float> %x_v4xf32)
58+
%v2f64 = call { <2 x double>, <2 x double> } @llvm.sincos.v2f64(<2 x double> %x_v2xf64)
59+
%v1f128 = call { <1 x fp128>, <1 x fp128> } @llvm.sincos.v1f128(<1 x fp128> %x_v1xf128)
60+
61+
%nxv8f16 = call { <vscale x 8 x half>, <vscale x 8 x half> } @llvm.sincos.v8f16(<vscale x 8 x half> %x_nxv8xf16)
62+
%nxv4f32 = call { <vscale x 4 x float>, <vscale x 4 x float> } @llvm.sincos.v4f32(<vscale x 4 x float> %x_nxv4xf32)
63+
%nxv2f64 = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.sincos.v2f64(<vscale x 2 x double> %x_nxv2xf64)
64+
%nxv1f128 = call { <vscale x 1 x fp128>, <vscale x 1 x fp128> } @llvm.sincos.v1f128(<vscale x 1 x fp128> %x_nxv1xf128)
65+
66+
ret void
67+
}

0 commit comments

Comments
 (0)