blob: 6d1da9e4ba786dc1388431ec6f3718024613691e [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"
Guillaume Chateletef6cef52018-06-20 08:52:30 +000022#include "MCInstrDescView.h"
Clement Courbet0e69e2d2018-05-17 10:52:18 +000023#include "RegisterAliasing.h"
Clement Courbetac74acd2018-04-04 11:37:06 +000024#include "llvm/MC/MCInst.h"
25#include "llvm/Support/Error.h"
26#include <vector>
27
28namespace exegesis {
29
Guillaume Chateletc9f727b2018-06-13 13:24:41 +000030// A class representing failures that happened during Benchmark, they are used
31// to report informations to the user.
32class BenchmarkFailure : public llvm::StringError {
33public:
34 BenchmarkFailure(const llvm::Twine &S);
35};
36
Guillaume Chatelet7b852cd2018-06-07 08:11:54 +000037// A collection of instructions that are to be assembled, executed and measured.
38struct BenchmarkConfiguration {
39 // This code is run before the Snippet is iterated. Since it is part of the
40 // measurement it should be as short as possible. It is usually used to setup
41 // the content of the Registers.
Clement Courbeta51efc22018-06-25 13:12:02 +000042 struct Setup {
43 std::vector<unsigned> RegsToDef;
44 };
45 Setup SnippetSetup;
Guillaume Chatelet7b852cd2018-06-07 08:11:54 +000046
47 // The sequence of instructions that are to be repeated.
48 std::vector<llvm::MCInst> Snippet;
Guillaume Chateletb4f15822018-06-07 14:00:29 +000049
50 // Informations about how this configuration was built.
51 std::string Info;
Guillaume Chatelet7b852cd2018-06-07 08:11:54 +000052};
53
Clement Courbetac74acd2018-04-04 11:37:06 +000054// Common code for all benchmark modes.
55class BenchmarkRunner {
56public:
Clement Courbet0e69e2d2018-05-17 10:52:18 +000057 explicit BenchmarkRunner(const LLVMState &State);
58
Clement Courbetac74acd2018-04-04 11:37:06 +000059 // Subtargets can disable running benchmarks for some instructions by
60 // returning an error here.
61 class InstructionFilter {
62 public:
63 virtual ~InstructionFilter();
64
65 virtual llvm::Error shouldRun(const LLVMState &State,
66 unsigned Opcode) const {
67 return llvm::ErrorSuccess();
68 }
69 };
70
71 virtual ~BenchmarkRunner();
72
Guillaume Chateletb4f15822018-06-07 14:00:29 +000073 llvm::Expected<std::vector<InstructionBenchmark>>
74 run(unsigned Opcode, const InstructionFilter &Filter,
75 unsigned NumRepetitions);
Clement Courbet0e69e2d2018-05-17 10:52:18 +000076
Clement Courbeta51efc22018-06-25 13:12:02 +000077 // Given a snippet, computes which registers the setup code needs to define.
78 std::vector<unsigned>
79 computeRegsToDef(const std::vector<InstructionInstance> &Snippet) const;
80
Clement Courbet0e69e2d2018-05-17 10:52:18 +000081protected:
82 const LLVMState &State;
Guillaume Chateletc9f727b2018-06-13 13:24:41 +000083 const RegisterAliasingTrackerCache RATC;
Clement Courbetac74acd2018-04-04 11:37:06 +000084
85private:
Guillaume Chateletb4f15822018-06-07 14:00:29 +000086 InstructionBenchmark runOne(const BenchmarkConfiguration &Configuration,
87 unsigned Opcode, unsigned NumRepetitions) const;
88
Guillaume Chateletef6cef52018-06-20 08:52:30 +000089 // Calls generatePrototype and expands the SnippetPrototype into one or more
90 // BenchmarkConfiguration.
91 llvm::Expected<std::vector<BenchmarkConfiguration>>
92 generateConfigurations(unsigned Opcode) const;
93
Clement Courbet62b34fa2018-06-06 09:42:36 +000094 virtual InstructionBenchmark::ModeE getMode() const = 0;
Clement Courbetac74acd2018-04-04 11:37:06 +000095
Guillaume Chateletef6cef52018-06-20 08:52:30 +000096 virtual llvm::Expected<SnippetPrototype>
97 generatePrototype(unsigned Opcode) const = 0;
Clement Courbetac74acd2018-04-04 11:37:06 +000098
99 virtual std::vector<BenchmarkMeasure>
Clement Courbet0e69e2d2018-05-17 10:52:18 +0000100 runMeasurements(const ExecutableFunction &EF,
101 const unsigned NumRepetitions) const = 0;
102
103 llvm::Expected<std::string>
Clement Courbeta51efc22018-06-25 13:12:02 +0000104 writeObjectFile(const BenchmarkConfiguration::Setup &Setup,
105 llvm::ArrayRef<llvm::MCInst> Code) const;
Clement Courbetac74acd2018-04-04 11:37:06 +0000106};
107
108} // namespace exegesis
109
110#endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRUNNER_H