LLVM 24.0.0git
MCSchedule.h
Go to the documentation of this file.
1//===-- llvm/MC/MCSchedule.h - Scheduling -----------------------*- 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// This file defines the classes used to describe a subtarget's machine model
10// for scheduling and other instruction cost heuristics.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_MC_MCSCHEDULE_H
15#define LLVM_MC_MCSCHEDULE_H
16
17#include "llvm/ADT/StringRef.h"
19#include "llvm/MC/MCInstrDesc.h"
22#include <cassert>
23#include <optional>
24
25namespace llvm {
26
27template <typename T> class ArrayRef;
28struct InstrItinerary;
29class MCSubtargetInfo;
30class MCInstrInfo;
31class MCInst;
32class MCInstrDesc;
34
35namespace cl {
36class OptionCategory;
37}
38
40
41/// Define a kind of processor resource that will be modeled by the scheduler.
43 const char *Name;
44 unsigned NumUnits; // Number of resource of this kind
45 unsigned SuperIdx; // Index of the resources kind that contains this kind.
46
47 // Number of resources that may be buffered.
48 //
49 // Buffered resources (BufferSize != 0) may be consumed at some indeterminate
50 // cycle after dispatch. This should be used for out-of-order cpus when
51 // instructions that use this resource can be buffered in a reservaton
52 // station.
53 //
54 // Unbuffered resources (BufferSize == 0) always consume their resource some
55 // fixed number of cycles after dispatch. If a resource is unbuffered, then
56 // the scheduler will avoid scheduling instructions with conflicting resources
57 // in the same cycle. This is for in-order cpus, or the in-order portion of
58 // an out-of-order cpus.
60
61 // If the resource has sub-units, a pointer to the first element of an array
62 // of `NumUnits` elements containing the ProcResourceIdx of the sub units.
63 // nullptr if the resource does not have sub-units.
64 const unsigned *SubUnitsIdxBegin;
65
66 bool operator==(const MCProcResourceDesc &Other) const {
67 return NumUnits == Other.NumUnits && SuperIdx == Other.SuperIdx
68 && BufferSize == Other.BufferSize;
69 }
70};
71
72/// Identify one of the processor resource kinds consumed by a
73/// particular scheduling class for the specified number of cycles.
76 /// Cycle at which the resource will be released by an instruction,
77 /// relatively to the cycle in which the instruction is issued
78 /// (assuming no stalls inbetween).
80 /// Cycle at which the resource will be aquired by an instruction,
81 /// relatively to the cycle in which the instruction is issued
82 /// (assuming no stalls inbetween).
84
86 return ProcResourceIdx == Other.ProcResourceIdx &&
87 ReleaseAtCycle == Other.ReleaseAtCycle &&
88 AcquireAtCycle == Other.AcquireAtCycle;
89 }
90};
91
92/// Specify the latency in cpu cycles for a particular scheduling class and def
93/// index. -1 indicates an invalid latency. Heuristics would typically consider
94/// an instruction with invalid latency to have infinite latency. Also identify
95/// the WriteResources of this def. When the operand expands to a sequence of
96/// writes, this ID is the last write in the sequence.
98 int16_t Cycles;
100
102 return Cycles == Other.Cycles && WriteResourceID == Other.WriteResourceID;
103 }
104};
105
106/// Specify the number of cycles allowed after instruction issue before a
107/// particular use operand reads its registers. This effectively reduces the
108/// write's latency. Here we allow negative cycles for corner cases where
109/// latency increases. This rule only applies when the entry's WriteResource
110/// matches the write's WriteResource.
111///
112/// MCReadAdvanceEntries are sorted first by operand index (UseIdx), then by
113/// WriteResourceIdx.
115 unsigned UseIdx;
118
120 return UseIdx == Other.UseIdx && WriteResourceID == Other.WriteResourceID
121 && Cycles == Other.Cycles;
122 }
123};
124
125/// Summarize the scheduling resources required for an instruction of a
126/// particular scheduling class.
127///
128/// Defined as an aggregate struct for creating tables with initializer lists.
130 static const unsigned short InvalidNumMicroOps = (1U << 13) - 1;
131 static const unsigned short VariantNumMicroOps = InvalidNumMicroOps - 1;
132
133#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
135#endif
140 uint16_t ReadAdvanceIdx; // First index into ReadAdvanceTable.
141 uint16_t WriteProcResIdx; // First index into WriteProcResTable.
142 uint16_t WriteLatencyIdx; // First index into WriteLatencyTable.
146
147 bool isValid() const {
149 }
150 bool isVariant() const {
152 }
153};
154
155// Guard against accidental growth. If either assertion fails, try to repack
156// MCSchedClassDesc to preserve the compact layout; remove the assertion if the
157// layout can no longer be kept.
158#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
159static_assert(sizeof(MCSchedClassDesc) == 16);
160#else
161static_assert(sizeof(MCSchedClassDesc) == 12);
162#endif
163
164/// Specify the cost of a register definition in terms of number of physical
165/// register allocated at register renaming stage. For example, AMD Jaguar.
166/// natively supports 128-bit data types, and operations on 256-bit registers
167/// (i.e. YMM registers) are internally split into two COPs (complex operations)
168/// and each COP updates a physical register. Basically, on Jaguar, a YMM
169/// register write effectively consumes two physical registers. That means,
170/// the cost of a YMM write in the BtVer2 model is 2.
176
177/// A register file descriptor.
178///
179/// This struct allows to describe processor register files. In particular, it
180/// helps describing the size of the register file, as well as the cost of
181/// allocating a register file at register renaming stage.
182/// FIXME: this struct can be extended to provide information about the number
183/// of read/write ports to the register file. A value of zero for field
184/// 'NumPhysRegs' means: this register file has an unbounded number of physical
185/// registers.
187 const char *Name;
190 // Index of the first cost entry in MCExtraProcessorInfo::RegisterCostTable.
192 // A value of zero means: there is no limit in the number of moves that can be
193 // eliminated every cycle.
195 // Ture if this register file only knows how to optimize register moves from
196 // known zero registers.
198};
199
200/// Provide extra details about the machine processor.
201///
202/// This is a collection of "optional" processor information that is not
203/// normally used by the LLVM machine schedulers, but that can be consumed by
204/// external tools like llvm-mca to improve the quality of the peformance
205/// analysis.
207 // Actual size of the reorder buffer in hardware.
209 // Number of instructions retired per cycle.
215 unsigned LoadQueueID;
216 unsigned StoreQueueID;
217};
218
219/// Machine model for scheduling, bundling, and heuristics.
220///
221/// The machine model directly provides basic information about the
222/// microarchitecture to the scheduler in the form of properties. It also
223/// optionally refers to scheduler resource tables and itinerary
224/// tables. Scheduler resource tables model the latency and cost for each
225/// instruction type. Itinerary tables are an independent mechanism that
226/// provides a detailed reservation table describing each cycle of instruction
227/// execution. Subtargets may define any or all of the above categories of data
228/// depending on the type of CPU and selected scheduler.
229///
230/// The machine independent properties defined here are used by the scheduler as
231/// an abstract machine model. A real micro-architecture has a number of
232/// buffers, queues, and stages. Declaring that a given machine-independent
233/// abstract property corresponds to a specific physical property across all
234/// subtargets can't be done. Nonetheless, the abstract model is
235/// useful. Futhermore, subtargets typically extend this model with processor
236/// specific resources to model any hardware features that can be exploited by
237/// scheduling heuristics and aren't sufficiently represented in the abstract.
238///
239/// The abstract pipeline is built around the notion of an "issue point". This
240/// is merely a reference point for counting machine cycles. The physical
241/// machine will have pipeline stages that delay execution. The scheduler does
242/// not model those delays because they are irrelevant as long as they are
243/// consistent. Inaccuracies arise when instructions have different execution
244/// delays relative to each other, in addition to their intrinsic latency. Those
245/// special cases can be handled by TableGen constructs such as, ReadAdvance,
246/// which reduces latency when reading data, and ReleaseAtCycles, which consumes
247/// a processor resource when writing data for a number of abstract
248/// cycles.
249///
250/// TODO: One tool currently missing is the ability to add a delay to
251/// ReleaseAtCycles. That would be easy to add and would likely cover all cases
252/// currently handled by the legacy itinerary tables.
253///
254/// A note on out-of-order execution and, more generally, instruction
255/// buffers. Part of the CPU pipeline is always in-order. The issue point, which
256/// is the point of reference for counting cycles, only makes sense as an
257/// in-order part of the pipeline. Other parts of the pipeline are sometimes
258/// falling behind and sometimes catching up. It's only interesting to model
259/// those other, decoupled parts of the pipeline if they may be predictably
260/// resource constrained in a way that the scheduler can exploit.
261///
262/// The LLVM machine model distinguishes between in-order constraints and
263/// out-of-order constraints so that the target's scheduling strategy can apply
264/// appropriate heuristics. For a well-balanced CPU pipeline, out-of-order
265/// resources would not typically be treated as a hard scheduling
266/// constraint. For example, in the GenericScheduler, a delay caused by limited
267/// out-of-order resources is not directly reflected in the number of cycles
268/// that the scheduler sees between issuing an instruction and its dependent
269/// instructions. In other words, out-of-order resources don't directly increase
270/// the latency between pairs of instructions. However, they can still be used
271/// to detect potential bottlenecks across a sequence of instructions and bias
272/// the scheduling heuristics appropriately.
274 // IssueWidth is the maximum number of instructions that may be scheduled in
275 // the same per-cycle group. This is meant to be a hard in-order constraint
276 // (a.k.a. "hazard"). In the GenericScheduler strategy, no more than
277 // IssueWidth micro-ops can ever be scheduled in a particular cycle.
278 //
279 // In practice, IssueWidth is useful to model any bottleneck between the
280 // decoder (after micro-op expansion) and the out-of-order reservation
281 // stations or the decoder bandwidth itself. If the total number of
282 // reservation stations is also a bottleneck, or if any other pipeline stage
283 // has a bandwidth limitation, then that can be naturally modeled by adding an
284 // out-of-order processor resource.
285 unsigned IssueWidth;
286 static constexpr unsigned DefaultIssueWidth = 1;
287
288 // MicroOpBufferSize is the number of micro-ops that the processor may buffer
289 // for out-of-order execution.
290 //
291 // "0" means operations that are not ready in this cycle are not considered
292 // for scheduling (they go in the pending queue). Latency is paramount. This
293 // may be more efficient if many instructions are pending in a schedule.
294 //
295 // "1" means all instructions are considered for scheduling regardless of
296 // whether they are ready in this cycle. Latency still causes issue stalls,
297 // but we balance those stalls against other heuristics.
298 //
299 // "> 1" means the processor is out-of-order. This is a machine independent
300 // estimate of highly machine specific characteristics such as the register
301 // renaming pool and reorder buffer.
303 static constexpr unsigned DefaultMicroOpBufferSize = 0;
304
305 // LoopMicroOpBufferSize is the number of micro-ops that the processor may
306 // buffer for optimized loop execution. More generally, this represents the
307 // optimal number of micro-ops in a loop body. A loop may be partially
308 // unrolled to bring the count of micro-ops in the loop body closer to this
309 // number.
311 static constexpr unsigned DefaultLoopMicroOpBufferSize = 0;
312
313 // LoadLatency is the expected latency of load instructions.
314 unsigned LoadLatency;
315 static constexpr unsigned DefaultLoadLatency = 4;
316
317 // HighLatency is the expected latency of "very high latency" operations.
318 // See TargetInstrInfo::isHighLatencyDef().
319 // By default, this is set to an arbitrarily high number of cycles
320 // likely to have some impact on scheduling heuristics.
321 unsigned HighLatency;
322 static constexpr unsigned DefaultHighLatency = 10;
323
324 // MispredictPenalty is the typical number of extra cycles the processor
325 // takes to recover from a branch misprediction.
327 static constexpr unsigned DefaultMispredictPenalty = 10;
328
329 bool PostRAScheduler; // default value is false
330
332
333 // Tells the MachineScheduler whether or not to track resource usage
334 // using intervals via ResourceSegments (see
335 // llvm/include/llvm/CodeGen/MachineScheduler.h).
337
338 unsigned ProcID;
344 // Instruction itinerary tables used by InstrItineraryData.
345 friend class InstrItineraryData;
347
349
351
352 unsigned getProcessorID() const { return ProcID; }
353
354 /// Does this machine model include instruction-level scheduling.
355 bool hasInstrSchedModel() const { return SchedClassTable; }
356
359 "No extra information available for this model");
360 return *ExtraProcessorInfo;
361 }
362
363 /// Return true if this machine model data for all instructions with a
364 /// scheduling class (itinerary class or SchedRW list).
365 bool isComplete() const { return CompleteModel; }
366
367 /// Return true if machine supports out of order execution.
368 bool isOutOfOrder() const { return MicroOpBufferSize > 1; }
369
370 unsigned getNumProcResourceKinds() const {
372 }
373
374 const MCProcResourceDesc *getProcResource(unsigned ProcResourceIdx) const {
375 assert(hasInstrSchedModel() && "No scheduling machine model");
376
377 assert(ProcResourceIdx < NumProcResourceKinds && "bad proc resource idx");
378 return &ProcResourceTable[ProcResourceIdx];
379 }
380
381 const MCSchedClassDesc *getSchedClassDesc(unsigned SchedClassIdx) const {
382 assert(hasInstrSchedModel() && "No scheduling machine model");
383
384 assert(SchedClassIdx < NumSchedClasses && "bad scheduling class idx");
385 return &SchedClassTable[SchedClassIdx];
386 }
387
388 StringRef getSchedClassName(unsigned SchedClassIdx) const {
389#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
390 return (*SchedClassNames)[SchedClassTable[SchedClassIdx].NameOff];
391#else
392 return "<unknown>";
393#endif
394 }
395
396 /// Returns the latency value for the scheduling class.
397 LLVM_ABI static int computeInstrLatency(const MCSubtargetInfo &STI,
398 const MCSchedClassDesc &SCDesc);
399
401 unsigned SClass) const;
402
404 const MCInstrInfo &MCII,
405 const MCInst &Inst) const;
406
407 template <typename MCSubtargetInfo, typename MCInstrInfo,
408 typename InstrItineraryData, typename MCInstOrMachineInstr>
410 const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
411 const MCInstOrMachineInstr &Inst,
413 ResolveVariantSchedClass =
414 [](const MCSchedClassDesc *SCDesc) { return SCDesc; }) const;
415
416 // Returns the reciprocal throughput information from a MCSchedClassDesc.
417 LLVM_ABI static double
418 getReciprocalThroughput(const MCSubtargetInfo &STI,
419 const MCSchedClassDesc &SCDesc);
420
421 LLVM_ABI static double getReciprocalThroughput(unsigned SchedClass,
422 const InstrItineraryData &IID);
423
424 LLVM_ABI double getReciprocalThroughput(const MCSubtargetInfo &STI,
425 const MCInstrInfo &MCII,
426 const MCInst &Inst) const;
427
428 /// Returns the maximum forwarding delay for register reads dependent on
429 /// writes of scheduling class WriteResourceIdx.
430 LLVM_ABI static unsigned
432 unsigned WriteResourceIdx = 0);
433
434 /// Returns the bypass delay cycle for the maximum latency write cycle
435 LLVM_ABI static unsigned getBypassDelayCycles(const MCSubtargetInfo &STI,
436 const MCSchedClassDesc &SCDesc);
437
438 /// Return the buffer size of the resource. If a positive scale factor
439 /// is provided and the original buffer size is > 1, the size is scaled
440 /// accordingly.
441 LLVM_ABI int getResourceBufferSize(unsigned ProcResourceIdx) const;
442
443 /// Returns the default initialized model.
445};
446
447// The first three are only template'd arguments so we can get away with leaving
448// them as incomplete types below. The third is a template over
449// MCInst/MachineInstr so as to avoid a layering violation here that would make
450// the MC layer depend on CodeGen.
451template <typename MCSubtargetInfo, typename MCInstrInfo,
452 typename InstrItineraryData, typename MCInstOrMachineInstr>
454 const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
455 const MCInstOrMachineInstr &Inst,
457 ResolveVariantSchedClass) const {
458 static const int NoInformationAvailable = -1;
459 // Check if we have a scheduling model for instructions.
460 if (!hasInstrSchedModel()) {
461 // Try to fall back to the itinerary model if the scheduling model doesn't
462 // have a scheduling table. Note the default does not have a table.
463
464 llvm::StringRef CPU = STI.getCPU();
465
466 // Check if we have a CPU to get the itinerary information.
467 if (CPU.empty())
468 return NoInformationAvailable;
469
470 // Get itinerary information.
472 // Get the scheduling class of the requested instruction.
473 const MCInstrDesc &Desc = MCII.get(Inst.getOpcode());
474 unsigned SCClass = Desc.getSchedClass();
475
476 unsigned Latency = 0;
477
478 for (unsigned Idx = 0, IdxEnd = Inst.getNumOperands(); Idx != IdxEnd; ++Idx)
479 if (std::optional<unsigned> OperCycle = IID.getOperandCycle(SCClass, Idx))
480 Latency = std::max(Latency, *OperCycle);
481
482 return int(Latency);
483 }
484
485 unsigned SchedClass = MCII.get(Inst.getOpcode()).getSchedClass();
486 const MCSchedClassDesc *SCDesc = getSchedClassDesc(SchedClass);
487 SCDesc = ResolveVariantSchedClass(SCDesc);
488
489 if (!SCDesc || !SCDesc->isValid())
490 return NoInformationAvailable;
491
492 return MCSchedModel::computeInstrLatency(STI, *SCDesc);
493}
494
495} // namespace llvm
496
497#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition Compiler.h:215
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Itinerary data supplied by a subtarget to be used by a target.
std::optional< unsigned > getOperandCycle(unsigned ItinClassIndx, unsigned OperandIdx) const
Return the cycle for the given class and operand.
Instances of this class represent a single low-level machine instruction.
Definition MCInst.h:188
Describe properties that are true of each instruction in the target description file.
unsigned getSchedClass() const
Return the scheduling class for this instruction.
Interface to description of machine instruction set.
Definition MCInstrInfo.h:27
const MCInstrDesc & get(unsigned Opcode) const
Return the machine instruction descriptor that corresponds to the specified instruction opcode.
Definition MCInstrInfo.h:89
Generic base class for all target subtargets.
StringRef getCPU() const
InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const
Get scheduling itinerary of a CPU.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
A table of densely packed, null-terminated strings indexed by offset.
Definition StringTable.h:34
An efficient, type-erasing, non-owning reference to a callable.
This namespace contains all of the command line option processing machinery.
Definition MCSchedule.h:35
This is an optimization pass for GlobalISel generic memory operations.
Op::Description Desc
LLVM_ABI cl::OptionCategory MCScheduleOptions
@ Other
Any other memory.
Definition ModRef.h:68
ArrayRef(const T &OneElt) -> ArrayRef< T >
An itinerary represents the scheduling information for an instruction.
Provide extra details about the machine processor.
Definition MCSchedule.h:206
const MCRegisterFileDesc * RegisterFiles
Definition MCSchedule.h:211
const MCRegisterCostEntry * RegisterCostTable
Definition MCSchedule.h:213
Define a kind of processor resource that will be modeled by the scheduler.
Definition MCSchedule.h:42
bool operator==(const MCProcResourceDesc &Other) const
Definition MCSchedule.h:66
const unsigned * SubUnitsIdxBegin
Definition MCSchedule.h:64
Specify the number of cycles allowed after instruction issue before a particular use operand reads it...
Definition MCSchedule.h:114
bool operator==(const MCReadAdvanceEntry &Other) const
Definition MCSchedule.h:119
Specify the cost of a register definition in terms of number of physical register allocated at regist...
Definition MCSchedule.h:171
A register file descriptor.
Definition MCSchedule.h:186
uint16_t MaxMovesEliminatedPerCycle
Definition MCSchedule.h:194
Summarize the scheduling resources required for an instruction of a particular scheduling class.
Definition MCSchedule.h:129
bool isVariant() const
Definition MCSchedule.h:150
static const unsigned short InvalidNumMicroOps
Definition MCSchedule.h:130
uint16_t NumReadAdvanceEntries
Definition MCSchedule.h:143
static const unsigned short VariantNumMicroOps
Definition MCSchedule.h:131
Machine model for scheduling, bundling, and heuristics.
Definition MCSchedule.h:273
static LLVM_ABI const MCSchedModel Default
Returns the default initialized model.
Definition MCSchedule.h:444
static constexpr unsigned DefaultMicroOpBufferSize
Definition MCSchedule.h:303
bool isOutOfOrder() const
Return true if machine supports out of order execution.
Definition MCSchedule.h:368
bool hasExtraProcessorInfo() const
Definition MCSchedule.h:350
static LLVM_ABI unsigned getForwardingDelayCycles(ArrayRef< MCReadAdvanceEntry > Entries, unsigned WriteResourceIdx=0)
Returns the maximum forwarding delay for register reads dependent on writes of scheduling class Write...
const InstrItinerary * InstrItineraries
Definition MCSchedule.h:346
const MCSchedClassDesc * getSchedClassDesc(unsigned SchedClassIdx) const
Definition MCSchedule.h:381
unsigned getProcessorID() const
Definition MCSchedule.h:352
const MCExtraProcessorInfo & getExtraProcessorInfo() const
Definition MCSchedule.h:357
unsigned getNumProcResourceKinds() const
Definition MCSchedule.h:370
static constexpr unsigned DefaultIssueWidth
Definition MCSchedule.h:286
bool hasInstrSchedModel() const
Does this machine model include instruction-level scheduling.
Definition MCSchedule.h:355
unsigned LoopMicroOpBufferSize
Definition MCSchedule.h:310
static constexpr unsigned DefaultHighLatency
Definition MCSchedule.h:322
static LLVM_ABI int computeInstrLatency(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the latency value for the scheduling class.
static constexpr unsigned DefaultLoadLatency
Definition MCSchedule.h:315
friend class InstrItineraryData
Definition MCSchedule.h:345
const StringTable * SchedClassNames
Definition MCSchedule.h:343
const MCSchedClassDesc * SchedClassTable
Definition MCSchedule.h:340
const MCProcResourceDesc * ProcResourceTable
Definition MCSchedule.h:339
unsigned MicroOpBufferSize
Definition MCSchedule.h:302
unsigned NumSchedClasses
Definition MCSchedule.h:342
const MCExtraProcessorInfo * ExtraProcessorInfo
Definition MCSchedule.h:348
const MCProcResourceDesc * getProcResource(unsigned ProcResourceIdx) const
Definition MCSchedule.h:374
static LLVM_ABI unsigned getBypassDelayCycles(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the bypass delay cycle for the maximum latency write cycle.
static constexpr unsigned DefaultLoopMicroOpBufferSize
Definition MCSchedule.h:311
static LLVM_ABI double getReciprocalThroughput(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
LLVM_ABI int getResourceBufferSize(unsigned ProcResourceIdx) const
Return the buffer size of the resource.
StringRef getSchedClassName(unsigned SchedClassIdx) const
Definition MCSchedule.h:388
unsigned NumProcResourceKinds
Definition MCSchedule.h:341
static constexpr unsigned DefaultMispredictPenalty
Definition MCSchedule.h:327
bool isComplete() const
Return true if this machine model data for all instructions with a scheduling class (itinerary class ...
Definition MCSchedule.h:365
unsigned MispredictPenalty
Definition MCSchedule.h:326
Specify the latency in cpu cycles for a particular scheduling class and def index.
Definition MCSchedule.h:97
bool operator==(const MCWriteLatencyEntry &Other) const
Definition MCSchedule.h:101
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
Definition MCSchedule.h:74
bool operator==(const MCWriteProcResEntry &Other) const
Definition MCSchedule.h:85
uint16_t AcquireAtCycle
Cycle at which the resource will be aquired by an instruction, relatively to the cycle in which the i...
Definition MCSchedule.h:83
uint16_t ReleaseAtCycle
Cycle at which the resource will be released by an instruction, relatively to the cycle in which the ...
Definition MCSchedule.h:79