LLVM 19.0.0git
MCSubtargetInfo.h
Go to the documentation of this file.
1//===- llvm/MC/MCSubtargetInfo.h - Subtarget Information --------*- 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 describes the subtarget options of a Target machine.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_MC_MCSUBTARGETINFO_H
14#define LLVM_MC_MCSUBTARGETINFO_H
15
16#include "llvm/ADT/ArrayRef.h"
17#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/StringRef.h"
20#include "llvm/MC/MCSchedule.h"
23#include <cassert>
24#include <cstdint>
25#include <optional>
26#include <string>
27
28namespace llvm {
29
30class MCInst;
31
32//===----------------------------------------------------------------------===//
33
34/// Used to provide key value pairs for feature and CPU bit flags.
36 const char *Key; ///< K-V key string
37 const char *Desc; ///< Help descriptor
38 unsigned Value; ///< K-V integer value
39 FeatureBitArray Implies; ///< K-V bit mask
40
41 /// Compare routine for std::lower_bound
42 bool operator<(StringRef S) const {
43 return StringRef(Key) < S;
44 }
45
46 /// Compare routine for std::is_sorted.
47 bool operator<(const SubtargetFeatureKV &Other) const {
48 return StringRef(Key) < StringRef(Other.Key);
49 }
50};
51
52//===----------------------------------------------------------------------===//
53
54/// Used to provide key value pairs for feature and CPU bit flags.
56 const char *Key; ///< K-V key string
57 FeatureBitArray Implies; ///< K-V bit mask
58 FeatureBitArray TuneImplies; ///< K-V bit mask
60
61 /// Compare routine for std::lower_bound
62 bool operator<(StringRef S) const {
63 return StringRef(Key) < S;
64 }
65
66 /// Compare routine for std::is_sorted.
67 bool operator<(const SubtargetSubTypeKV &Other) const {
68 return StringRef(Key) < StringRef(Other.Key);
69 }
70};
71
72//===----------------------------------------------------------------------===//
73///
74/// Generic base class for all target subtargets.
75///
77 Triple TargetTriple;
78 std::string CPU; // CPU being targeted.
79 std::string TuneCPU; // CPU being tuned for.
80 ArrayRef<SubtargetFeatureKV> ProcFeatures; // Processor feature list
81 ArrayRef<SubtargetSubTypeKV> ProcDesc; // Processor descriptions
82
83 // Scheduler machine model
84 const MCWriteProcResEntry *WriteProcResTable;
85 const MCWriteLatencyEntry *WriteLatencyTable;
86 const MCReadAdvanceEntry *ReadAdvanceTable;
87 const MCSchedModel *CPUSchedModel;
88
89 const InstrStage *Stages; // Instruction itinerary stages
90 const unsigned *OperandCycles; // Itinerary operand cycles
91 const unsigned *ForwardingPaths;
92 FeatureBitset FeatureBits; // Feature bits for current CPU + FS
93 std::string FeatureString; // Feature string
94
95public:
96 MCSubtargetInfo(const MCSubtargetInfo &) = default;
97 MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef TuneCPU,
100 const MCWriteProcResEntry *WPR, const MCWriteLatencyEntry *WL,
101 const MCReadAdvanceEntry *RA, const InstrStage *IS,
102 const unsigned *OC, const unsigned *FP);
103 MCSubtargetInfo() = delete;
106 virtual ~MCSubtargetInfo() = default;
107
108 const Triple &getTargetTriple() const { return TargetTriple; }
109 StringRef getCPU() const { return CPU; }
110 StringRef getTuneCPU() const { return TuneCPU; }
111
112 const FeatureBitset& getFeatureBits() const { return FeatureBits; }
113 void setFeatureBits(const FeatureBitset &FeatureBits_) {
114 FeatureBits = FeatureBits_;
115 }
116
117 StringRef getFeatureString() const { return FeatureString; }
118
119 bool hasFeature(unsigned Feature) const {
120 return FeatureBits[Feature];
121 }
122
123protected:
124 /// Initialize the scheduling model and feature bits.
125 ///
126 /// FIXME: Find a way to stick this in the constructor, since it should only
127 /// be called during initialization.
128 void InitMCProcessorInfo(StringRef CPU, StringRef TuneCPU, StringRef FS);
129
130public:
131 /// Set the features to the default for the given CPU and TuneCPU, with ano
132 /// appended feature string.
133 void setDefaultFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
134
135 /// Toggle a feature and return the re-computed feature bits.
136 /// This version does not change the implied bits.
138
139 /// Toggle a feature and return the re-computed feature bits.
140 /// This version does not change the implied bits.
142
143 /// Toggle a set of features and return the re-computed feature bits.
144 /// This version will also change all implied bits.
146
147 /// Apply a feature flag and return the re-computed feature bits, including
148 /// all feature bits implied by the flag.
150
151 /// Set/clear additional feature bits, including all other bits they imply.
154
155 /// Check whether the subtarget features are enabled/disabled as per
156 /// the provided string, ignoring all other features.
157 bool checkFeatures(StringRef FS) const;
158
159 /// Get the machine model of a CPU.
161
162 /// Get the machine model for this subtarget's CPU.
163 const MCSchedModel &getSchedModel() const { return *CPUSchedModel; }
164
165 /// Return an iterator at the first process resource consumed by the given
166 /// scheduling class.
168 const MCSchedClassDesc *SC) const {
169 return &WriteProcResTable[SC->WriteProcResIdx];
170 }
172 const MCSchedClassDesc *SC) const {
173 return getWriteProcResBegin(SC) + SC->NumWriteProcResEntries;
174 }
175
177 unsigned DefIdx) const {
178 assert(DefIdx < SC->NumWriteLatencyEntries &&
179 "MachineModel does not specify a WriteResource for DefIdx");
180
181 return &WriteLatencyTable[SC->WriteLatencyIdx + DefIdx];
182 }
183
184 int getReadAdvanceCycles(const MCSchedClassDesc *SC, unsigned UseIdx,
185 unsigned WriteResID) const {
186 // TODO: The number of read advance entries in a class can be significant
187 // (~50). Consider compressing the WriteID into a dense ID of those that are
188 // used by ReadAdvance and representing them as a bitset.
189 for (const MCReadAdvanceEntry *I = &ReadAdvanceTable[SC->ReadAdvanceIdx],
190 *E = I + SC->NumReadAdvanceEntries; I != E; ++I) {
191 if (I->UseIdx < UseIdx)
192 continue;
193 if (I->UseIdx > UseIdx)
194 break;
195 // Find the first WriteResIdx match, which has the highest cycle count.
196 if (!I->WriteResourceID || I->WriteResourceID == WriteResID) {
197 return I->Cycles;
198 }
199 }
200 return 0;
201 }
202
203 /// Return the set of ReadAdvance entries declared by the scheduling class
204 /// descriptor in input.
207 if (!SC.NumReadAdvanceEntries)
209 return ArrayRef<MCReadAdvanceEntry>(&ReadAdvanceTable[SC.ReadAdvanceIdx],
210 SC.NumReadAdvanceEntries);
211 }
212
213 /// Get scheduling itinerary of a CPU.
215
216 /// Initialize an InstrItineraryData instance.
217 void initInstrItins(InstrItineraryData &InstrItins) const;
218
219 /// Resolve a variant scheduling class for the given MCInst and CPU.
220 virtual unsigned resolveVariantSchedClass(unsigned SchedClass,
221 const MCInst *MI,
222 const MCInstrInfo *MCII,
223 unsigned CPUID) const {
224 return 0;
225 }
226
227 /// Check whether the CPU string is valid.
228 bool isCPUStringValid(StringRef CPU) const {
229 auto Found = llvm::lower_bound(ProcDesc, CPU);
230 return Found != ProcDesc.end() && StringRef(Found->Key) == CPU;
231 }
232
233 /// Return processor descriptions.
235 return ProcDesc;
236 }
237
238 /// Return processor features.
240 return ProcFeatures;
241 }
242
243 /// HwMode IDs are stored and accessed in a bit set format, enabling
244 /// users to efficiently retrieve specific IDs, such as the RegInfo
245 /// HwMode ID, from the set as required. Using this approach, various
246 /// types of HwMode IDs can be added to a subtarget to manage different
247 /// attributes within that subtarget, significantly enhancing the
248 /// scalability and usability of HwMode. Moreover, to ensure compatibility,
249 /// this method also supports controlling multiple attributes with a single
250 /// HwMode ID, just as was done previously.
252 HwMode_Default, // Return the smallest HwMode ID of current subtarget.
253 HwMode_ValueType, // Return the HwMode ID that controls the ValueType.
254 HwMode_RegInfo, // Return the HwMode ID that controls the RegSizeInfo and
255 // SubRegRange.
256 HwMode_EncodingInfo // Return the HwMode ID that controls the EncodingInfo.
257 };
258
259 /// Return a bit set containing all HwMode IDs of the current subtarget.
260 virtual unsigned getHwModeSet() const { return 0; }
261
262 /// HwMode ID corresponding to the 'type' parameter is retrieved from the
263 /// HwMode bit set of the current subtarget. It’s important to note that if
264 /// the current subtarget possesses two HwMode IDs and both control a single
265 /// attribute (such as RegInfo), this interface will result in an error.
266 virtual unsigned getHwMode(enum HwModeType type = HwMode_Default) const {
267 return 0;
268 }
269
270 /// Return the cache size in bytes for the given level of cache.
271 /// Level is zero-based, so a value of zero means the first level of
272 /// cache.
273 ///
274 virtual std::optional<unsigned> getCacheSize(unsigned Level) const;
275
276 /// Return the cache associatvity for the given level of cache.
277 /// Level is zero-based, so a value of zero means the first level of
278 /// cache.
279 ///
280 virtual std::optional<unsigned> getCacheAssociativity(unsigned Level) const;
281
282 /// Return the target cache line size in bytes at a given level.
283 ///
284 virtual std::optional<unsigned> getCacheLineSize(unsigned Level) const;
285
286 /// Return the target cache line size in bytes. By default, return
287 /// the line size for the bottom-most level of cache. This provides
288 /// a more convenient interface for the common case where all cache
289 /// levels have the same line size. Return zero if there is no
290 /// cache model.
291 ///
292 virtual unsigned getCacheLineSize() const {
293 std::optional<unsigned> Size = getCacheLineSize(0);
294 if (Size)
295 return *Size;
296
297 return 0;
298 }
299
300 /// Return the preferred prefetch distance in terms of instructions.
301 ///
302 virtual unsigned getPrefetchDistance() const;
303
304 /// Return the maximum prefetch distance in terms of loop
305 /// iterations.
306 ///
307 virtual unsigned getMaxPrefetchIterationsAhead() const;
308
309 /// \return True if prefetching should also be done for writes.
310 ///
311 virtual bool enableWritePrefetching() const;
312
313 /// Return the minimum stride necessary to trigger software
314 /// prefetching.
315 ///
316 virtual unsigned getMinPrefetchStride(unsigned NumMemAccesses,
317 unsigned NumStridedMemAccesses,
318 unsigned NumPrefetches,
319 bool HasCall) const;
320
321 /// \return if target want to issue a prefetch in address space \p AS.
322 virtual bool shouldPrefetchAddressSpace(unsigned AS) const;
323};
324
325} // end namespace llvm
326
327#endif // LLVM_MC_MCSUBTARGETINFO_H
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
uint64_t Size
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition: MD5.cpp:58
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
SI optimize exec mask operations pre RA
This file contains some templates that are useful if you are working with the STL at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:154
Class used to store the subtarget bits in the tables created by tablegen.
Container class for subtarget features.
Itinerary data supplied by a subtarget to be used by a target.
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
Interface to description of machine instruction set.
Definition: MCInstrInfo.h:26
Generic base class for all target subtargets.
virtual unsigned getCacheLineSize() const
Return the target cache line size in bytes.
bool checkFeatures(StringRef FS) const
Check whether the subtarget features are enabled/disabled as per the provided string,...
const MCWriteProcResEntry * getWriteProcResEnd(const MCSchedClassDesc *SC) const
bool hasFeature(unsigned Feature) const
int getReadAdvanceCycles(const MCSchedClassDesc *SC, unsigned UseIdx, unsigned WriteResID) const
StringRef getFeatureString() const
void setFeatureBits(const FeatureBitset &FeatureBits_)
virtual unsigned resolveVariantSchedClass(unsigned SchedClass, const MCInst *MI, const MCInstrInfo *MCII, unsigned CPUID) const
Resolve a variant scheduling class for the given MCInst and CPU.
virtual std::optional< unsigned > getCacheSize(unsigned Level) const
Return the cache size in bytes for the given level of cache.
const Triple & getTargetTriple() const
bool isCPUStringValid(StringRef CPU) const
Check whether the CPU string is valid.
virtual bool shouldPrefetchAddressSpace(unsigned AS) const
ArrayRef< SubtargetSubTypeKV > getAllProcessorDescriptions() const
Return processor descriptions.
ArrayRef< MCReadAdvanceEntry > getReadAdvanceEntries(const MCSchedClassDesc &SC) const
Return the set of ReadAdvance entries declared by the scheduling class descriptor in input.
const MCSchedModel & getSchedModelForCPU(StringRef CPU) const
Get the machine model of a CPU.
const MCWriteLatencyEntry * getWriteLatencyEntry(const MCSchedClassDesc *SC, unsigned DefIdx) const
MCSubtargetInfo & operator=(const MCSubtargetInfo &)=delete
MCSubtargetInfo & operator=(MCSubtargetInfo &&)=delete
const FeatureBitset & getFeatureBits() const
HwModeType
HwMode IDs are stored and accessed in a bit set format, enabling users to efficiently retrieve specif...
StringRef getCPU() const
virtual unsigned getMinPrefetchStride(unsigned NumMemAccesses, unsigned NumStridedMemAccesses, unsigned NumPrefetches, bool HasCall) const
Return the minimum stride necessary to trigger software prefetching.
virtual bool enableWritePrefetching() const
virtual unsigned getMaxPrefetchIterationsAhead() const
Return the maximum prefetch distance in terms of loop iterations.
ArrayRef< SubtargetFeatureKV > getAllProcessorFeatures() const
Return processor features.
virtual ~MCSubtargetInfo()=default
virtual unsigned getPrefetchDistance() const
Return the preferred prefetch distance in terms of instructions.
FeatureBitset ApplyFeatureFlag(StringRef FS)
Apply a feature flag and return the re-computed feature bits, including all feature bits implied by t...
virtual std::optional< unsigned > getCacheAssociativity(unsigned Level) const
Return the cache associatvity for the given level of cache.
FeatureBitset SetFeatureBitsTransitively(const FeatureBitset &FB)
Set/clear additional feature bits, including all other bits they imply.
StringRef getTuneCPU() const
InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const
Get scheduling itinerary of a CPU.
void setDefaultFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
Set the features to the default for the given CPU and TuneCPU, with ano appended feature string.
FeatureBitset ToggleFeature(uint64_t FB)
Toggle a feature and return the re-computed feature bits.
MCSubtargetInfo(const MCSubtargetInfo &)=default
void InitMCProcessorInfo(StringRef CPU, StringRef TuneCPU, StringRef FS)
Initialize the scheduling model and feature bits.
virtual unsigned getHwModeSet() const
Return a bit set containing all HwMode IDs of the current subtarget.
void initInstrItins(InstrItineraryData &InstrItins) const
Initialize an InstrItineraryData instance.
const MCWriteProcResEntry * getWriteProcResBegin(const MCSchedClassDesc *SC) const
Return an iterator at the first process resource consumed by the given scheduling class.
virtual unsigned getHwMode(enum HwModeType type=HwMode_Default) const
HwMode ID corresponding to the 'type' parameter is retrieved from the HwMode bit set of the current s...
FeatureBitset ClearFeatureBitsTransitively(const FeatureBitset &FB)
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget's CPU.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Other
Any other memory.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:1954
These values represent a non-pipelined step in the execution of an instruction.
Specify the number of cycles allowed after instruction issue before a particular use operand reads it...
Definition: MCSchedule.h:103
Summarize the scheduling resources required for an instruction of a particular scheduling class.
Definition: MCSchedule.h:118
Machine model for scheduling, bundling, and heuristics.
Definition: MCSchedule.h:253
Specify the latency in cpu cycles for a particular scheduling class and def index.
Definition: MCSchedule.h:86
Identify one of the processor resource kinds consumed by a particular scheduling class for the specif...
Definition: MCSchedule.h:63
Used to provide key value pairs for feature and CPU bit flags.
bool operator<(StringRef S) const
Compare routine for std::lower_bound.
bool operator<(const SubtargetFeatureKV &Other) const
Compare routine for std::is_sorted.
unsigned Value
K-V integer value.
const char * Key
K-V key string.
const char * Desc
Help descriptor.
FeatureBitArray Implies
K-V bit mask.
Used to provide key value pairs for feature and CPU bit flags.
const MCSchedModel * SchedModel
FeatureBitArray Implies
K-V bit mask.
const char * Key
K-V key string.
FeatureBitArray TuneImplies
K-V bit mask.
bool operator<(const SubtargetSubTypeKV &Other) const
Compare routine for std::is_sorted.
bool operator<(StringRef S) const
Compare routine for std::lower_bound.