blob: bffb965fcce2f234db218b1012d39b2dd68b4171 [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
Clement Courbet717c9762018-06-28 07:41:16 +000072 llvm::Expected<SnippetPrototype> generateSelfAliasingPrototype(
73 const Instruction &Instr) const;
74
Clement Courbetac74acd2018-04-04 11:37:06 +000075private:
Clement Courbet4860b982018-06-26 08:49:30 +000076 // API to be implemented by subclasses.
77 virtual llvm::Expected<SnippetPrototype>
78 generatePrototype(unsigned Opcode) const = 0;
79
80 virtual std::vector<BenchmarkMeasure>
81 runMeasurements(const ExecutableFunction &EF,
82 const unsigned NumRepetitions) const = 0;
83
84 // Internal helpers.
Guillaume Chateletb4f15822018-06-07 14:00:29 +000085 InstructionBenchmark runOne(const BenchmarkConfiguration &Configuration,
86 unsigned Opcode, unsigned NumRepetitions) const;
87
Guillaume Chateletef6cef52018-06-20 08:52:30 +000088 // Calls generatePrototype and expands the SnippetPrototype into one or more
89 // BenchmarkConfiguration.
90 llvm::Expected<std::vector<BenchmarkConfiguration>>
91 generateConfigurations(unsigned Opcode) const;
92
Clement Courbet0e69e2d2018-05-17 10:52:18 +000093
94 llvm::Expected<std::string>
Clement Courbeta51efc22018-06-25 13:12:02 +000095 writeObjectFile(const BenchmarkConfiguration::Setup &Setup,
96 llvm::ArrayRef<llvm::MCInst> Code) const;
Clement Courbet4860b982018-06-26 08:49:30 +000097
98 const InstructionBenchmark::ModeE Mode;
Clement Courbetac74acd2018-04-04 11:37:06 +000099};
100
101} // namespace exegesis
102
103#endif // LLVM_TOOLS_LLVM_EXEGESIS_BENCHMARKRUNNER_H