blob: d4cdad20ccc67a8e5a35407052e0a5a0d2a62a1a [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 Courbet4860b982018-06-26 08:49:30 +000057 explicit BenchmarkRunner(const LLVMState &State, InstructionBenchmark::ModeE Mode);
Clement Courbetac74acd2018-04-04 11:37:06 +000058
59 virtual ~BenchmarkRunner();
60
Guillaume Chateletb4f15822018-06-07 14:00:29 +000061 llvm::Expected<std::vector<InstructionBenchmark>>
Clement Courbet4860b982018-06-26 08:49:30 +000062 run(unsigned Opcode, unsigned NumRepetitions);
Clement Courbet0e69e2d2018-05-17 10:52:18 +000063
Clement Courbeta51efc22018-06-25 13:12:02 +000064 // Given a snippet, computes which registers the setup code needs to define.
65 std::vector<unsigned>
66 computeRegsToDef(const std::vector<InstructionInstance> &Snippet) const;
67
Clement Courbet0e69e2d2018-05-17 10:52:18 +000068protected:
69 const LLVMState &State;
Guillaume Chateletc9f727b2018-06-13 13:24:41 +000070 const RegisterAliasingTrackerCache RATC;
Clement Courbetac74acd2018-04-04 11:37:06 +000071
72private:
Clement Courbet4860b982018-06-26 08:49:30 +000073 // API to be implemented by subclasses.
74 virtual llvm::Expected<SnippetPrototype>
75 generatePrototype(unsigned Opcode) const = 0;
76
77 virtual std::vector<BenchmarkMeasure>
78 runMeasurements(const ExecutableFunction &EF,
79 const unsigned NumRepetitions) const = 0;
80
81 // Internal helpers.
Guillaume Chateletb4f15822018-06-07 14:00:29 +000082 InstructionBenchmark runOne(const BenchmarkConfiguration &Configuration,
83 unsigned Opcode, unsigned NumRepetitions) const;
84
Guillaume Chateletef6cef52018-06-20 08:52:30 +000085 // Calls generatePrototype and expands the SnippetPrototype into one or more
86 // BenchmarkConfiguration.
87 llvm::Expected<std::vector<BenchmarkConfiguration>>
88 generateConfigurations(unsigned Opcode) const;
89
Clement Courbet0e69e2d2018-05-17 10:52:18 +000090
91 llvm::Expected<std::string>
Clement Courbeta51efc22018-06-25 13:12:02 +000092 writeObjectFile(const BenchmarkConfiguration::Setup &Setup,
93 llvm::ArrayRef<llvm::MCInst> Code) const;
Clement Courbet4860b982018-06-26 08:49:30 +000094
95 const InstructionBenchmark::ModeE Mode;
Clement Courbetac74acd2018-04-04 11:37:06 +000096};
97
98} // namespace exegesis
99
100#endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRUNNER_H