blob: 5dfd05e602808e3b77893dbab9267ba9dc1240c4 [file] [log] [blame]
Clement Courbetac74acd2018-04-04 11:37:06 +00001//===-- BenchmarkRunner.h ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
11/// Defines the abstract BenchmarkRunner class for measuring a certain execution
12/// property of instructions (e.g. latency).
13///
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRUNNER_H
17#define LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRUNNER_H
18
Clement Courbet0e69e2d2018-05-17 10:52:18 +000019#include "Assembler.h"
Clement Courbetac74acd2018-04-04 11:37:06 +000020#include "BenchmarkResult.h"
Clement Courbetac74acd2018-04-04 11:37:06 +000021#include "LlvmState.h"
Clement Courbet0e69e2d2018-05-17 10:52:18 +000022#include "RegisterAliasing.h"
Clement Courbetac74acd2018-04-04 11:37:06 +000023#include "llvm/MC/MCInst.h"
24#include "llvm/Support/Error.h"
25#include <vector>
26
27namespace exegesis {
28
29// Common code for all benchmark modes.
30class BenchmarkRunner {
31public:
Clement Courbet0e69e2d2018-05-17 10:52:18 +000032 explicit BenchmarkRunner(const LLVMState &State);
33
Clement Courbetac74acd2018-04-04 11:37:06 +000034 // Subtargets can disable running benchmarks for some instructions by
35 // returning an error here.
36 class InstructionFilter {
37 public:
38 virtual ~InstructionFilter();
39
40 virtual llvm::Error shouldRun(const LLVMState &State,
41 unsigned Opcode) const {
42 return llvm::ErrorSuccess();
43 }
44 };
45
46 virtual ~BenchmarkRunner();
47
Clement Courbet0e69e2d2018-05-17 10:52:18 +000048 InstructionBenchmark run(unsigned Opcode, const InstructionFilter &Filter,
49 unsigned NumRepetitions);
50
51protected:
52 const LLVMState &State;
53 const llvm::MCInstrInfo &MCInstrInfo;
54 const llvm::MCRegisterInfo &MCRegisterInfo;
Clement Courbetac74acd2018-04-04 11:37:06 +000055
56private:
Clement Courbet62b34fa2018-06-06 09:42:36 +000057 virtual InstructionBenchmark::ModeE getMode() const = 0;
Clement Courbetac74acd2018-04-04 11:37:06 +000058
59 virtual llvm::Expected<std::vector<llvm::MCInst>>
Clement Courbet0e69e2d2018-05-17 10:52:18 +000060 createSnippet(RegisterAliasingTrackerCache &RATC, unsigned Opcode,
61 llvm::raw_ostream &Debug) const = 0;
Clement Courbetac74acd2018-04-04 11:37:06 +000062
63 virtual std::vector<BenchmarkMeasure>
Clement Courbet0e69e2d2018-05-17 10:52:18 +000064 runMeasurements(const ExecutableFunction &EF,
65 const unsigned NumRepetitions) const = 0;
66
67 llvm::Expected<std::string>
68 writeObjectFile(llvm::ArrayRef<llvm::MCInst> Code) const;
69
70 RegisterAliasingTrackerCache RATC;
Clement Courbetac74acd2018-04-04 11:37:06 +000071};
72
73} // namespace exegesis
74
75#endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRUNNER_H