1 //===-- SchedClassResolution.h ----------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 ///
9 /// \file
10 /// Resolution of MCInst sched class into expanded form for further analysis.
11 ///
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_TOOLS_LLVM_EXEGESIS_SCHEDCLASSRESOLUTION_H
15 #define LLVM_TOOLS_LLVM_EXEGESIS_SCHEDCLASSRESOLUTION_H
16 
17 #include "BenchmarkResult.h"
18 #include "llvm/MC/MCContext.h"
19 #include "llvm/MC/MCDisassembler/MCDisassembler.h"
20 #include "llvm/MC/MCInstPrinter.h"
21 #include "llvm/MC/MCInstrInfo.h"
22 #include "llvm/MC/MCObjectFileInfo.h"
23 #include "llvm/MC/MCSubtargetInfo.h"
24 #include "llvm/Support/Error.h"
25 #include "llvm/Support/TargetRegistry.h"
26 #include "llvm/Support/raw_ostream.h"
27 
28 namespace llvm {
29 namespace exegesis {
30 
31 // Computes the idealized ProcRes Unit pressure. This is the expected
32 // distribution if the CPU scheduler can distribute the load as evenly as
33 // possible.
34 std::vector<std::pair<uint16_t, float>>
35 computeIdealizedProcResPressure(const MCSchedModel &SM,
36                                 SmallVector<MCWriteProcResEntry, 8> WPRS);
37 
38 // An MCSchedClassDesc augmented with some additional data.
39 struct ResolvedSchedClass {
40   ResolvedSchedClass(const MCSubtargetInfo &STI, unsigned ResolvedSchedClassId,
41                      bool WasVariant);
42 
43   static std::pair<unsigned /*SchedClassId*/, bool /*WasVariant*/>
44   resolveSchedClassId(const MCSubtargetInfo &SubtargetInfo,
45                       const MCInstrInfo &InstrInfo, const MCInst &MCI);
46 
47   std::vector<BenchmarkMeasure>
48   getAsPoint(InstructionBenchmark::ModeE Mode, const MCSubtargetInfo &STI,
49              ArrayRef<PerInstructionStats> Representative) const;
50 
51   const unsigned SchedClassId;
52   const MCSchedClassDesc *const SCDesc;
53   const bool WasVariant; // Whether the original class was variant.
54   const SmallVector<MCWriteProcResEntry, 8> NonRedundantWriteProcRes;
55   const std::vector<std::pair<uint16_t, float>> IdealizedProcResPressure;
56 };
57 
58 } // namespace exegesis
59 } // namespace llvm
60 
61 #endif // LLVM_TOOLS_LLVM_EXEGESIS_SCHEDCLASSRESOLUTION_H
62