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