LLVM 23.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 WriteProcResIdx; // First index into WriteProcResTable.
142 uint16_t WriteLatencyIdx; // First index into WriteLatencyTable.
144 uint16_t ReadAdvanceIdx; // First index into ReadAdvanceTable.
146
147 bool isValid() const {
149 }
150 bool isVariant() const {
152 }
153};
154
155/// Specify the cost of a register definition in terms of number of physical
156/// register allocated at register renaming stage. For example, AMD Jaguar.
157/// natively supports 128-bit data types, and operations on 256-bit registers
158/// (i.e. YMM registers) are internally split into two COPs (complex operations)
159/// and each COP updates a physical register. Basically, on Jaguar, a YMM
160/// register write effectively consumes two physical registers. That means,
161/// the cost of a YMM write in the BtVer2 model is 2.
167
168/// A register file descriptor.
169///
170/// This struct allows to describe processor register files. In particular, it
171/// helps describing the size of the register file, as well as the cost of
172/// allocating a register file at register renaming stage.
173/// FIXME: this struct can be extended to provide information about the number
174/// of read/write ports to the register file. A value of zero for field
175/// 'NumPhysRegs' means: this register file has an unbounded number of physical
176/// registers.
178 const char *Name;
181 // Index of the first cost entry in MCExtraProcessorInfo::RegisterCostTable.
183 // A value of zero means: there is no limit in the number of moves that can be
184 // eliminated every cycle.
186 // Ture if this register file only knows how to optimize register moves from
187 // known zero registers.
189};
190
191/// Provide extra details about the machine processor.
192///
193/// This is a collection of "optional" processor information that is not
194/// normally used by the LLVM machine schedulers, but that can be consumed by
195/// external tools like llvm-mca to improve the quality of the peformance
196/// analysis.
198 // Actual size of the reorder buffer in hardware.
200 // Number of instructions retired per cycle.
206 unsigned LoadQueueID;
207 unsigned StoreQueueID;
208};
209
210/// Machine model for scheduling, bundling, and heuristics.
211///
212/// The machine model directly provides basic information about the
213/// microarchitecture to the scheduler in the form of properties. It also
214/// optionally refers to scheduler resource tables and itinerary
215/// tables. Scheduler resource tables model the latency and cost for each
216/// instruction type. Itinerary tables are an independent mechanism that
217/// provides a detailed reservation table describing each cycle of instruction
218/// execution. Subtargets may define any or all of the above categories of data
219/// depending on the type of CPU and selected scheduler.
220///
221/// The machine independent properties defined here are used by the scheduler as
222/// an abstract machine model. A real micro-architecture has a number of
223/// buffers, queues, and stages. Declaring that a given machine-independent
224/// abstract property corresponds to a specific physical property across all
225/// subtargets can't be done. Nonetheless, the abstract model is
226/// useful. Futhermore, subtargets typically extend this model with processor
227/// specific resources to model any hardware features that can be exploited by
228/// scheduling heuristics and aren't sufficiently represented in the abstract.
229///
230/// The abstract pipeline is built around the notion of an "issue point". This
231/// is merely a reference point for counting machine cycles. The physical
232/// machine will have pipeline stages that delay execution. The scheduler does
233/// not model those delays because they are irrelevant as long as they are
234/// consistent. Inaccuracies arise when instructions have different execution
235/// delays relative to each other, in addition to their intrinsic latency. Those
236/// special cases can be handled by TableGen constructs such as, ReadAdvance,
237/// which reduces latency when reading data, and ReleaseAtCycles, which consumes
238/// a processor resource when writing data for a number of abstract
239/// cycles.
240///
241/// TODO: One tool currently missing is the ability to add a delay to
242/// ReleaseAtCycles. That would be easy to add and would likely cover all cases
243/// currently handled by the legacy itinerary tables.
244///
245/// A note on out-of-order execution and, more generally, instruction
246/// buffers. Part of the CPU pipeline is always in-order. The issue point, which
247/// is the point of reference for counting cycles, only makes sense as an
248/// in-order part of the pipeline. Other parts of the pipeline are sometimes
249/// falling behind and sometimes catching up. It's only interesting to model
250/// those other, decoupled parts of the pipeline if they may be predictably
251/// resource constrained in a way that the scheduler can exploit.
252///
253/// The LLVM machine model distinguishes between in-order constraints and
254/// out-of-order constraints so that the target's scheduling strategy can apply
255/// appropriate heuristics. For a well-balanced CPU pipeline, out-of-order
256/// resources would not typically be treated as a hard scheduling
257/// constraint. For example, in the GenericScheduler, a delay caused by limited
258/// out-of-order resources is not directly reflected in the number of cycles
259/// that the scheduler sees between issuing an instruction and its dependent
260/// instructions. In other words, out-of-order resources don't directly increase
261/// the latency between pairs of instructions. However, they can still be used
262/// to detect potential bottlenecks across a sequence of instructions and bias
263/// the scheduling heuristics appropriately.
265 // IssueWidth is the maximum number of instructions that may be scheduled in
266 // the same per-cycle group. This is meant to be a hard in-order constraint
267 // (a.k.a. "hazard"). In the GenericScheduler strategy, no more than
268 // IssueWidth micro-ops can ever be scheduled in a particular cycle.
269 //
270 // In practice, IssueWidth is useful to model any bottleneck between the
271 // decoder (after micro-op expansion) and the out-of-order reservation
272 // stations or the decoder bandwidth itself. If the total number of
273 // reservation stations is also a bottleneck, or if any other pipeline stage
274 // has a bandwidth limitation, then that can be naturally modeled by adding an
275 // out-of-order processor resource.
276 unsigned IssueWidth;
277 static const unsigned DefaultIssueWidth = 1;
278
279 // MicroOpBufferSize is the number of micro-ops that the processor may buffer
280 // for out-of-order execution.
281 //
282 // "0" means operations that are not ready in this cycle are not considered
283 // for scheduling (they go in the pending queue). Latency is paramount. This
284 // may be more efficient if many instructions are pending in a schedule.
285 //
286 // "1" means all instructions are considered for scheduling regardless of
287 // whether they are ready in this cycle. Latency still causes issue stalls,
288 // but we balance those stalls against other heuristics.
289 //
290 // "> 1" means the processor is out-of-order. This is a machine independent
291 // estimate of highly machine specific characteristics such as the register
292 // renaming pool and reorder buffer.
294 static const unsigned DefaultMicroOpBufferSize = 0;
295
296 // LoopMicroOpBufferSize is the number of micro-ops that the processor may
297 // buffer for optimized loop execution. More generally, this represents the
298 // optimal number of micro-ops in a loop body. A loop may be partially
299 // unrolled to bring the count of micro-ops in the loop body closer to this
300 // number.
302 static const unsigned DefaultLoopMicroOpBufferSize = 0;
303
304 // LoadLatency is the expected latency of load instructions.
305 unsigned LoadLatency;
306 static const unsigned DefaultLoadLatency = 4;
307
308 // HighLatency is the expected latency of "very high latency" operations.
309 // See TargetInstrInfo::isHighLatencyDef().
310 // By default, this is set to an arbitrarily high number of cycles
311 // likely to have some impact on scheduling heuristics.
312 unsigned HighLatency;
313 static const unsigned DefaultHighLatency = 10;
314
315 // MispredictPenalty is the typical number of extra cycles the processor
316 // takes to recover from a branch misprediction.
318 static const unsigned DefaultMispredictPenalty = 10;
319
320 bool PostRAScheduler; // default value is false
321
323
324 // Tells the MachineScheduler whether or not to track resource usage
325 // using intervals via ResourceSegments (see
326 // llvm/include/llvm/CodeGen/MachineScheduler.h).
328
329 unsigned ProcID;
335 // Instruction itinerary tables used by InstrItineraryData.
336 friend class InstrItineraryData;
338
340
342
343 unsigned getProcessorID() const { return ProcID; }
344
345 /// Does this machine model include instruction-level scheduling.
346 bool hasInstrSchedModel() const { return SchedClassTable; }
347
350 "No extra information available for this model");
351 return *ExtraProcessorInfo;
352 }
353
354 /// Return true if this machine model data for all instructions with a
355 /// scheduling class (itinerary class or SchedRW list).
356 bool isComplete() const { return CompleteModel; }
357
358 /// Return true if machine supports out of order execution.
359 bool isOutOfOrder() const { return MicroOpBufferSize > 1; }
360
361 unsigned getNumProcResourceKinds() const {
363 }
364
365 const MCProcResourceDesc *getProcResource(unsigned ProcResourceIdx) const {
366 assert(hasInstrSchedModel() && "No scheduling machine model");
367
368 assert(ProcResourceIdx < NumProcResourceKinds && "bad proc resource idx");
369 return &ProcResourceTable[ProcResourceIdx];
370 }
371
372 const MCSchedClassDesc *getSchedClassDesc(unsigned SchedClassIdx) const {
373 assert(hasInstrSchedModel() && "No scheduling machine model");
374
375 assert(SchedClassIdx < NumSchedClasses && "bad scheduling class idx");
376 return &SchedClassTable[SchedClassIdx];
377 }
378
379 StringRef getSchedClassName(unsigned SchedClassIdx) const {
380#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
381 return (*SchedClassNames)[SchedClassTable[SchedClassIdx].NameOff];
382#else
383 return "<unknown>";
384#endif
385 }
386
387 /// Returns the latency value for the scheduling class.
388 LLVM_ABI static int computeInstrLatency(const MCSubtargetInfo &STI,
389 const MCSchedClassDesc &SCDesc);
390
392 unsigned SClass) const;
393
395 const MCInstrInfo &MCII,
396 const MCInst &Inst) const;
397
398 template <typename MCSubtargetInfo, typename MCInstrInfo,
399 typename InstrItineraryData, typename MCInstOrMachineInstr>
401 const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
402 const MCInstOrMachineInstr &Inst,
404 ResolveVariantSchedClass =
405 [](const MCSchedClassDesc *SCDesc) { return SCDesc; }) const;
406
407 // Returns the reciprocal throughput information from a MCSchedClassDesc.
408 LLVM_ABI static double
409 getReciprocalThroughput(const MCSubtargetInfo &STI,
410 const MCSchedClassDesc &SCDesc);
411
412 LLVM_ABI static double getReciprocalThroughput(unsigned SchedClass,
413 const InstrItineraryData &IID);
414
415 LLVM_ABI double getReciprocalThroughput(const MCSubtargetInfo &STI,
416 const MCInstrInfo &MCII,
417 const MCInst &Inst) const;
418
419 /// Returns the maximum forwarding delay for register reads dependent on
420 /// writes of scheduling class WriteResourceIdx.
421 LLVM_ABI static unsigned
423 unsigned WriteResourceIdx = 0);
424
425 /// Returns the bypass delay cycle for the maximum latency write cycle
426 LLVM_ABI static unsigned getBypassDelayCycles(const MCSubtargetInfo &STI,
427 const MCSchedClassDesc &SCDesc);
428
429 /// Return the buffer size of the resource. If a positive scale factor
430 /// is provided and the original buffer size is > 1, the size is scaled
431 /// accordingly.
432 LLVM_ABI int getResourceBufferSize(unsigned ProcResourceIdx) const;
433
434 /// Returns the default initialized model.
436};
437
438// The first three are only template'd arguments so we can get away with leaving
439// them as incomplete types below. The third is a template over
440// MCInst/MachineInstr so as to avoid a layering violation here that would make
441// the MC layer depend on CodeGen.
442template <typename MCSubtargetInfo, typename MCInstrInfo,
443 typename InstrItineraryData, typename MCInstOrMachineInstr>
445 const MCSubtargetInfo &STI, const MCInstrInfo &MCII,
446 const MCInstOrMachineInstr &Inst,
448 ResolveVariantSchedClass) const {
449 static const int NoInformationAvailable = -1;
450 // Check if we have a scheduling model for instructions.
451 if (!hasInstrSchedModel()) {
452 // Try to fall back to the itinerary model if the scheduling model doesn't
453 // have a scheduling table. Note the default does not have a table.
454
455 llvm::StringRef CPU = STI.getCPU();
456
457 // Check if we have a CPU to get the itinerary information.
458 if (CPU.empty())
459 return NoInformationAvailable;
460
461 // Get itinerary information.
463 // Get the scheduling class of the requested instruction.
464 const MCInstrDesc &Desc = MCII.get(Inst.getOpcode());
465 unsigned SCClass = Desc.getSchedClass();
466
467 unsigned Latency = 0;
468
469 for (unsigned Idx = 0, IdxEnd = Inst.getNumOperands(); Idx != IdxEnd; ++Idx)
470 if (std::optional<unsigned> OperCycle = IID.getOperandCycle(SCClass, Idx))
471 Latency = std::max(Latency, *OperCycle);
472
473 return int(Latency);
474 }
475
476 unsigned SchedClass = MCII.get(Inst.getOpcode()).getSchedClass();
477 const MCSchedClassDesc *SCDesc = getSchedClassDesc(SchedClass);
478 SCDesc = ResolveVariantSchedClass(SCDesc);
479
480 if (!SCDesc || !SCDesc->isValid())
481 return NoInformationAvailable;
482
483 return MCSchedModel::computeInstrLatency(STI, *SCDesc);
484}
485
486} // namespace llvm
487
488#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition Compiler.h:213
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:90
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
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:197
const MCRegisterFileDesc * RegisterFiles
Definition MCSchedule.h:202
const MCRegisterCostEntry * RegisterCostTable
Definition MCSchedule.h:204
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:162
A register file descriptor.
Definition MCSchedule.h:177
uint16_t MaxMovesEliminatedPerCycle
Definition MCSchedule.h:185
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 NumWriteLatencyEntries
Definition MCSchedule.h:143
uint16_t NumReadAdvanceEntries
Definition MCSchedule.h:145
uint16_t NumWriteProcResEntries
Definition MCSchedule.h:141
static const unsigned short VariantNumMicroOps
Definition MCSchedule.h:131
Machine model for scheduling, bundling, and heuristics.
Definition MCSchedule.h:264
static LLVM_ABI const MCSchedModel Default
Returns the default initialized model.
Definition MCSchedule.h:435
bool isOutOfOrder() const
Return true if machine supports out of order execution.
Definition MCSchedule.h:359
bool hasExtraProcessorInfo() const
Definition MCSchedule.h:341
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...
static const unsigned DefaultLoopMicroOpBufferSize
Definition MCSchedule.h:302
const InstrItinerary * InstrItineraries
Definition MCSchedule.h:337
static const unsigned DefaultHighLatency
Definition MCSchedule.h:313
const MCSchedClassDesc * getSchedClassDesc(unsigned SchedClassIdx) const
Definition MCSchedule.h:372
unsigned getProcessorID() const
Definition MCSchedule.h:343
const MCExtraProcessorInfo & getExtraProcessorInfo() const
Definition MCSchedule.h:348
unsigned getNumProcResourceKinds() const
Definition MCSchedule.h:361
bool hasInstrSchedModel() const
Does this machine model include instruction-level scheduling.
Definition MCSchedule.h:346
static const unsigned DefaultLoadLatency
Definition MCSchedule.h:306
unsigned LoopMicroOpBufferSize
Definition MCSchedule.h:301
static LLVM_ABI int computeInstrLatency(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the latency value for the scheduling class.
static const unsigned DefaultMicroOpBufferSize
Definition MCSchedule.h:294
friend class InstrItineraryData
Definition MCSchedule.h:336
const StringTable * SchedClassNames
Definition MCSchedule.h:334
const MCSchedClassDesc * SchedClassTable
Definition MCSchedule.h:331
const MCProcResourceDesc * ProcResourceTable
Definition MCSchedule.h:330
static const unsigned DefaultMispredictPenalty
Definition MCSchedule.h:318
unsigned MicroOpBufferSize
Definition MCSchedule.h:293
unsigned NumSchedClasses
Definition MCSchedule.h:333
const MCExtraProcessorInfo * ExtraProcessorInfo
Definition MCSchedule.h:339
const MCProcResourceDesc * getProcResource(unsigned ProcResourceIdx) const
Definition MCSchedule.h:365
static LLVM_ABI unsigned getBypassDelayCycles(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the bypass delay cycle for the maximum latency write cycle.
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:379
static const unsigned DefaultIssueWidth
Definition MCSchedule.h:277
unsigned NumProcResourceKinds
Definition MCSchedule.h:332
bool isComplete() const
Return true if this machine model data for all instructions with a scheduling class (itinerary class ...
Definition MCSchedule.h:356
unsigned MispredictPenalty
Definition MCSchedule.h:317
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