xref: /llvm-project/llvm/tools/llvm-exegesis/lib/SchedClassResolution.h (revision 389bf5d870b3bc014b004a750c539786eba8c543)
11d1330c5SRoman Lebedev //===-- SchedClassResolution.h ----------------------------------*- C++ -*-===//
21d1330c5SRoman Lebedev //
31d1330c5SRoman Lebedev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41d1330c5SRoman Lebedev // See https://llvm.org/LICENSE.txt for license information.
51d1330c5SRoman Lebedev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61d1330c5SRoman Lebedev //
71d1330c5SRoman Lebedev //===----------------------------------------------------------------------===//
81d1330c5SRoman Lebedev ///
91d1330c5SRoman Lebedev /// \file
104d81e877SRoman Lebedev /// Resolution of MCInst sched class into expanded form for further analysis.
111d1330c5SRoman Lebedev ///
121d1330c5SRoman Lebedev //===----------------------------------------------------------------------===//
131d1330c5SRoman Lebedev 
141d1330c5SRoman Lebedev #ifndef LLVM_TOOLS_LLVM_EXEGESIS_SCHEDCLASSRESOLUTION_H
151d1330c5SRoman Lebedev #define LLVM_TOOLS_LLVM_EXEGESIS_SCHEDCLASSRESOLUTION_H
161d1330c5SRoman Lebedev 
174d81e877SRoman Lebedev #include "BenchmarkResult.h"
181d1330c5SRoman Lebedev #include "llvm/MC/MCContext.h"
191d1330c5SRoman Lebedev #include "llvm/MC/MCDisassembler/MCDisassembler.h"
201d1330c5SRoman Lebedev #include "llvm/MC/MCInstPrinter.h"
211d1330c5SRoman Lebedev #include "llvm/MC/MCInstrInfo.h"
221d1330c5SRoman Lebedev #include "llvm/MC/MCObjectFileInfo.h"
231d1330c5SRoman Lebedev #include "llvm/MC/MCSubtargetInfo.h"
2489b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
251d1330c5SRoman Lebedev #include "llvm/Support/Error.h"
261d1330c5SRoman Lebedev #include "llvm/Support/raw_ostream.h"
271d1330c5SRoman Lebedev 
281d1330c5SRoman Lebedev namespace llvm {
291d1330c5SRoman Lebedev namespace exegesis {
301d1330c5SRoman Lebedev 
311d1330c5SRoman Lebedev // Computes the idealized ProcRes Unit pressure. This is the expected
321d1330c5SRoman Lebedev // distribution if the CPU scheduler can distribute the load as evenly as
331d1330c5SRoman Lebedev // possible.
3450cdd56bSClement Courbet std::vector<std::pair<uint16_t, float>>
3550cdd56bSClement Courbet computeIdealizedProcResPressure(const MCSchedModel &SM,
3650cdd56bSClement Courbet                                 SmallVector<MCWriteProcResEntry, 8> WPRS);
371d1330c5SRoman Lebedev 
3850cdd56bSClement Courbet // An MCSchedClassDesc augmented with some additional data.
391d1330c5SRoman Lebedev struct ResolvedSchedClass {
4050cdd56bSClement Courbet   ResolvedSchedClass(const MCSubtargetInfo &STI, unsigned ResolvedSchedClassId,
4150cdd56bSClement Courbet                      bool WasVariant);
421d1330c5SRoman Lebedev 
431d1330c5SRoman Lebedev   static std::pair<unsigned /*SchedClassId*/, bool /*WasVariant*/>
4450cdd56bSClement Courbet   resolveSchedClassId(const MCSubtargetInfo &SubtargetInfo,
4550cdd56bSClement Courbet                       const MCInstrInfo &InstrInfo, const MCInst &MCI);
461d1330c5SRoman Lebedev 
474d81e877SRoman Lebedev   std::vector<BenchmarkMeasure>
48*389bf5d8SAiden Grossman   getAsPoint(Benchmark::ModeE Mode, const MCSubtargetInfo &STI,
494d81e877SRoman Lebedev              ArrayRef<PerInstructionStats> Representative) const;
504d81e877SRoman Lebedev 
511d1330c5SRoman Lebedev   const unsigned SchedClassId;
5250cdd56bSClement Courbet   const MCSchedClassDesc *const SCDesc;
531d1330c5SRoman Lebedev   const bool WasVariant; // Whether the original class was variant.
5450cdd56bSClement Courbet   const SmallVector<MCWriteProcResEntry, 8> NonRedundantWriteProcRes;
551d1330c5SRoman Lebedev   const std::vector<std::pair<uint16_t, float>> IdealizedProcResPressure;
561d1330c5SRoman Lebedev };
571d1330c5SRoman Lebedev 
581d1330c5SRoman Lebedev } // namespace exegesis
591d1330c5SRoman Lebedev } // namespace llvm
601d1330c5SRoman Lebedev 
611d1330c5SRoman Lebedev #endif // LLVM_TOOLS_LLVM_EXEGESIS_SCHEDCLASSRESOLUTION_H
62