LLVM 23.0.0git
RISCVVSETVLIInfoAnalysis.h
Go to the documentation of this file.
1//===- RISCVVSETVLIInfoAnalysis.h - VSETVLI Info Analysis -----------------===//
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 implements an analysis of the vtype/vl information that is needed
10// by RISCVInsertVSETVLI pass and others.
11//
12//===----------------------------------------------------------------------===//
13
14#include "RISCV.h"
15#include "RISCVSubtarget.h"
16#include "llvm/ADT/Statistic.h"
20
21namespace llvm {
22namespace RISCV {
23/// Which subfields of VL or VTYPE have values we need to preserve?
25 // Some unknown property of VL is used. If demanded, must preserve entire
26 // value.
27 bool VLAny = false;
28 // Only zero vs non-zero is used. If demanded, can change non-zero values.
29 bool VLZeroness = false;
30 // What properties of SEW we need to preserve.
31 enum : uint8_t {
32 SEWEqual = 3, // The exact value of SEW needs to be preserved.
34 2, // SEW can be changed as long as it's greater
35 // than or equal to the original value, but must be less
36 // than 64.
37 SEWGreaterThanOrEqual = 1, // SEW can be changed as long as it's greater
38 // than or equal to the original value.
39 SEWNone = 0 // We don't need to preserve SEW at all.
41 enum : uint8_t {
42 LMULEqual = 2, // The exact value of LMUL needs to be preserved.
43 LMULLessThanOrEqualToM1 = 1, // We can use any LMUL <= M1.
44 LMULNone = 0 // We don't need to preserve LMUL at all.
46 bool SEWLMULRatio = false;
47 bool TailPolicy = false;
48 bool MaskPolicy = false;
49 // If this is true, we demand that VTYPE is set to some legal state, i.e. that
50 // vill is unset.
51 bool VILL = false;
52 bool TWiden = false;
53 bool AltFmt = false;
54
55 // Return true if any part of VTYPE was used
56 bool usedVTYPE() const {
57 return SEW || LMUL || SEWLMULRatio || TailPolicy || MaskPolicy || VILL ||
58 TWiden || AltFmt;
59 }
60
61 // Return true if any property of VL was used
62 bool usedVL() { return VLAny || VLZeroness; }
63
64 // Mark all VTYPE subfields and properties as demanded
65 void demandVTYPE() {
66 SEW = SEWEqual;
68 SEWLMULRatio = true;
69 TailPolicy = true;
70 MaskPolicy = true;
71 VILL = true;
72 TWiden = true;
73 AltFmt = true;
74 }
75
76 // Mark all VL properties as demanded
77 void demandVL() {
78 VLAny = true;
79 VLZeroness = true;
80 }
81
84 DF.demandVTYPE();
85 DF.demandVL();
86 return DF;
87 }
88
89 // Make this the result of demanding both the fields in this and B.
90 void doUnion(const DemandedFields &B) {
91 VLAny |= B.VLAny;
92 VLZeroness |= B.VLZeroness;
93 SEW = std::max(SEW, B.SEW);
94 LMUL = std::max(LMUL, B.LMUL);
95 SEWLMULRatio |= B.SEWLMULRatio;
96 TailPolicy |= B.TailPolicy;
97 MaskPolicy |= B.MaskPolicy;
98 VILL |= B.VILL;
99 AltFmt |= B.AltFmt;
100 TWiden |= B.TWiden;
101 }
102
103#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
104 /// Support for debugging, callable in GDB: V->dump()
105 LLVM_DUMP_METHOD void dump() const {
106 print(dbgs());
107 dbgs() << "\n";
108 }
109
110 /// Implement operator<<.
111 void print(raw_ostream &OS) const {
112 OS << "{";
113 OS << "VLAny=" << VLAny << ", ";
114 OS << "VLZeroness=" << VLZeroness << ", ";
115 OS << "SEW=";
116 switch (SEW) {
117 case SEWEqual:
118 OS << "SEWEqual";
119 break;
121 OS << "SEWGreaterThanOrEqual";
122 break;
124 OS << "SEWGreaterThanOrEqualAndLessThan64";
125 break;
126 case SEWNone:
127 OS << "SEWNone";
128 break;
129 };
130 OS << ", ";
131 OS << "LMUL=";
132 switch (LMUL) {
133 case LMULEqual:
134 OS << "LMULEqual";
135 break;
137 OS << "LMULLessThanOrEqualToM1";
138 break;
139 case LMULNone:
140 OS << "LMULNone";
141 break;
142 };
143 OS << ", ";
144 OS << "SEWLMULRatio=" << SEWLMULRatio << ", ";
145 OS << "TailPolicy=" << TailPolicy << ", ";
146 OS << "MaskPolicy=" << MaskPolicy << ", ";
147 OS << "VILL=" << VILL << ", ";
148 OS << "AltFmt=" << AltFmt << ", ";
149 OS << "TWiden=" << TWiden;
150 OS << "}";
151 }
152#endif
153};
154
155#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
158 DF.print(OS);
159 return OS;
160}
161#endif
162
163bool areCompatibleVTYPEs(uint64_t CurVType, uint64_t NewVType,
164 const DemandedFields &Used);
165
166/// Return the fields and properties demanded by the provided instruction.
167DemandedFields getDemanded(const MachineInstr &MI, const RISCVSubtarget *ST);
168
169/// Defines the abstract state with which the forward dataflow models the
170/// values of the VL and VTYPE registers after insertion.
172 struct AVLDef {
173 // Every AVLDef should have a VNInfo, unless we're running without
174 // LiveIntervals in which case this will be nullptr.
175 const VNInfo *ValNo;
176 Register DefReg;
177 };
178 union {
179 AVLDef AVLRegDef;
180 unsigned AVLImm;
181 };
182
183 enum class AVLState : uint8_t {
185 AVLIsReg,
186 AVLIsImm,
187 AVLIsVLMAX,
188 Unknown, // AVL and VTYPE are fully unknown
189 } State = AVLState::Uninitialized;
190
191 // Fields from VTYPE.
193 uint8_t SEW = 0;
194 uint8_t TailAgnostic : 1;
195 uint8_t MaskAgnostic : 1;
196 uint8_t SEWLMULRatioOnly : 1;
197 uint8_t AltFmt : 1;
198 uint8_t TWiden : 3;
199
200public:
202 : AVLImm(0), TailAgnostic(false), MaskAgnostic(false),
203 SEWLMULRatioOnly(false), AltFmt(false), TWiden(0) {}
204
206 VSETVLIInfo Info;
207 Info.setUnknown();
208 return Info;
209 }
210
211 bool isValid() const { return State != AVLState::Uninitialized; }
212 void setUnknown() { State = AVLState::Unknown; }
213 bool isUnknown() const { return State == AVLState::Unknown; }
214 bool isKnown() const { return isValid() && !isUnknown(); }
215
216 void setAVLRegDef(const VNInfo *VNInfo, Register AVLReg) {
217 assert(AVLReg.isVirtual());
218 AVLRegDef.ValNo = VNInfo;
219 AVLRegDef.DefReg = AVLReg;
220 State = AVLState::AVLIsReg;
221 }
222
223 void setAVLImm(unsigned Imm) {
224 AVLImm = Imm;
225 State = AVLState::AVLIsImm;
226 }
227
228 void setAVLVLMAX() { State = AVLState::AVLIsVLMAX; }
229
230 bool hasAVLImm() const { return State == AVLState::AVLIsImm; }
231 bool hasAVLReg() const { return State == AVLState::AVLIsReg; }
232 bool hasAVLVLMAX() const { return State == AVLState::AVLIsVLMAX; }
234 assert(hasAVLReg() && AVLRegDef.DefReg.isVirtual());
235 return AVLRegDef.DefReg;
236 }
237 unsigned getAVLImm() const {
238 assert(hasAVLImm());
239 return AVLImm;
240 }
241 const VNInfo *getAVLVNInfo() const {
242 assert(hasAVLReg());
243 return AVLRegDef.ValNo;
244 }
245 // Most AVLIsReg infos will have a single defining MachineInstr, unless it was
246 // a PHI node. In that case getAVLVNInfo()->def will point to the block
247 // boundary slot and this will return nullptr. If LiveIntervals isn't
248 // available, nullptr is also returned.
249 const MachineInstr *getAVLDefMI(const LiveIntervals *LIS) const {
250 assert(hasAVLReg());
251 if (!LIS || getAVLVNInfo()->isPHIDef())
252 return nullptr;
253 auto *MI = LIS->getInstructionFromIndex(getAVLVNInfo()->def);
254 assert(MI);
255 return MI;
256 }
257
258 void setAVL(const VSETVLIInfo &Info) {
259 assert(Info.isValid());
260 if (Info.isUnknown())
261 setUnknown();
262 else if (Info.hasAVLReg())
263 setAVLRegDef(Info.getAVLVNInfo(), Info.getAVLReg());
264 else if (Info.hasAVLVLMAX())
265 setAVLVLMAX();
266 else {
267 assert(Info.hasAVLImm());
268 setAVLImm(Info.getAVLImm());
269 }
270 }
271
272 bool hasSEWLMULRatioOnly() const {
273 assert(isKnown() && "Can't use VTYPE for uninitialized or unknown");
274 return SEWLMULRatioOnly;
275 }
276
277 unsigned getSEW() const {
279 "Can't use VTYPE for uninitialized or unknown");
280 return SEW;
281 }
284 "Can't use VTYPE for uninitialized or unknown");
285 return VLMul;
286 }
287 bool getTailAgnostic() const {
288 assert(isKnown() && "Can't use VTYPE for uninitialized or unknown");
289 return TailAgnostic;
290 }
291 bool getMaskAgnostic() const {
292 assert(isKnown() && "Can't use VTYPE for uninitialized or unknown");
293 return MaskAgnostic;
294 }
295 bool getAltFmt() const {
296 assert(isKnown() && "Can't use VTYPE for uninitialized or unknown");
297 return AltFmt;
298 }
299 unsigned getTWiden() const {
300 assert(isKnown() && "Can't use VTYPE for uninitialized or unknown");
301 return TWiden;
302 }
303
304 bool hasNonZeroAVL(const LiveIntervals *LIS) const {
305 if (hasAVLImm())
306 return getAVLImm() > 0;
307 if (hasAVLReg()) {
308 if (auto *DefMI = getAVLDefMI(LIS))
309 return RISCVInstrInfo::isNonZeroLoadImmediate(*DefMI);
310 }
311 if (hasAVLVLMAX())
312 return true;
313 return false;
314 }
315
317 const LiveIntervals *LIS) const {
318 if (hasSameAVL(Other))
319 return true;
320 return (hasNonZeroAVL(LIS) && Other.hasNonZeroAVL(LIS));
321 }
322
324 if (hasAVLReg() && Other.hasAVLReg()) {
325 assert(!getAVLVNInfo() == !Other.getAVLVNInfo() &&
326 "we either have intervals or we don't");
327 if (!getAVLVNInfo())
328 return getAVLReg() == Other.getAVLReg();
329 return getAVLVNInfo()->id == Other.getAVLVNInfo()->id &&
330 getAVLReg() == Other.getAVLReg();
331 }
332
333 if (hasAVLImm() && Other.hasAVLImm())
334 return getAVLImm() == Other.getAVLImm();
335
336 if (hasAVLVLMAX())
337 return Other.hasAVLVLMAX() && hasSameVLMAX(Other);
338
339 return false;
340 }
341
342 // Return true if the two lattice values are guaranteed to have
343 // the same AVL value at runtime.
344 bool hasSameAVL(const VSETVLIInfo &Other) const {
345 // Without LiveIntervals, we don't know which instruction defines a
346 // register. Since a register may be redefined, this means all AVLIsReg
347 // states must be treated as possibly distinct.
348 if (hasAVLReg() && Other.hasAVLReg()) {
349 assert(!getAVLVNInfo() == !Other.getAVLVNInfo() &&
350 "we either have intervals or we don't");
351 if (!getAVLVNInfo())
352 return false;
353 }
355 }
356
357 void setVTYPE(unsigned VType) {
358 assert(isKnown() && "Can't set VTYPE for uninitialized or unknown");
359 VLMul = RISCVVType::getVLMUL(VType);
360 SEW = RISCVVType::getSEW(VType);
361 TailAgnostic = RISCVVType::isTailAgnostic(VType);
362 MaskAgnostic = RISCVVType::isMaskAgnostic(VType);
363 AltFmt = RISCVVType::isAltFmt(VType);
364 TWiden =
366 }
367 void setVTYPE(RISCVVType::VLMUL L, unsigned S, bool TA, bool MA, bool Altfmt,
368 unsigned W) {
369 assert(isKnown() && "Can't set VTYPE for uninitialized or unknown");
370 VLMul = L;
371 SEW = S;
372 TailAgnostic = TA;
373 MaskAgnostic = MA;
374 AltFmt = Altfmt;
375 TWiden = W;
376 }
377
378 void setAltFmt(bool AF) { AltFmt = AF; }
379
380 void setVLMul(RISCVVType::VLMUL VLMul) { this->VLMul = VLMul; }
381
382 unsigned encodeVTYPE() const {
383 assert(isKnown() && !SEWLMULRatioOnly &&
384 "Can't encode VTYPE for uninitialized or unknown");
385 if (TWiden != 0)
386 return RISCVVType::encodeXSfmmVType(SEW, TWiden, AltFmt);
387 return RISCVVType::encodeVTYPE(VLMul, SEW, TailAgnostic, MaskAgnostic,
388 AltFmt);
389 }
390
391 bool hasSameVTYPE(const VSETVLIInfo &Other) const {
392 assert(isValid() && Other.isValid() &&
393 "Can't compare invalid VSETVLIInfos");
394 assert(!isUnknown() && !Other.isUnknown() &&
395 "Can't compare VTYPE in unknown state");
396 assert(!SEWLMULRatioOnly && !Other.SEWLMULRatioOnly &&
397 "Can't compare when only LMUL/SEW ratio is valid.");
398 return std::tie(VLMul, SEW, TailAgnostic, MaskAgnostic, AltFmt, TWiden) ==
399 std::tie(Other.VLMul, Other.SEW, Other.TailAgnostic,
400 Other.MaskAgnostic, Other.AltFmt, Other.TWiden);
401 }
402
403 unsigned getSEWLMULRatio() const {
404 assert(isKnown() && "Can't use VTYPE for uninitialized or unknown");
405 return RISCVVType::getSEWLMULRatio(SEW, VLMul);
406 }
407
408 // Check if the VTYPE for these two VSETVLIInfos produce the same VLMAX.
409 // Note that having the same VLMAX ensures that both share the same
410 // function from AVL to VL; that is, they must produce the same VL value
411 // for any given AVL value.
412 bool hasSameVLMAX(const VSETVLIInfo &Other) const {
413 assert(isValid() && Other.isValid() &&
414 "Can't compare invalid VSETVLIInfos");
415 assert(!isUnknown() && !Other.isUnknown() &&
416 "Can't compare VTYPE in unknown state");
417 return getSEWLMULRatio() == Other.getSEWLMULRatio();
418 }
419
420 bool hasCompatibleVTYPE(const DemandedFields &Used,
421 const VSETVLIInfo &Require) const;
422
423 // Determine whether the vector instructions requirements represented by
424 // Require are compatible with the previous vsetvli instruction represented
425 // by this. MI is the instruction whose requirements we're considering.
426 bool isCompatible(const DemandedFields &Used, const VSETVLIInfo &Require,
427 const LiveIntervals *LIS) const {
428 assert(isValid() && Require.isValid() &&
429 "Can't compare invalid VSETVLIInfos");
430 // Nothing is compatible with Unknown.
431 if (isUnknown() || Require.isUnknown())
432 return false;
433
434 // If only our VLMAX ratio is valid, then this isn't compatible.
435 if (SEWLMULRatioOnly || Require.SEWLMULRatioOnly)
436 return false;
437
438 if (Used.VLAny && !(hasSameAVL(Require) && hasSameVLMAX(Require)))
439 return false;
440
441 if (Used.VLZeroness && !hasEquallyZeroAVL(Require, LIS))
442 return false;
443
444 return hasCompatibleVTYPE(Used, Require);
445 }
446
447 bool operator==(const VSETVLIInfo &Other) const {
448 // Uninitialized is only equal to another Uninitialized.
449 if (!isValid())
450 return !Other.isValid();
451 if (!Other.isValid())
452 return !isValid();
453
454 // Unknown is only equal to another Unknown.
455 if (isUnknown())
456 return Other.isUnknown();
457 if (Other.isUnknown())
458 return isUnknown();
459
461 return false;
462
463 // If the SEWLMULRatioOnly bits are different, then they aren't equal.
464 if (SEWLMULRatioOnly != Other.SEWLMULRatioOnly)
465 return false;
466
467 // If only the VLMAX is valid, check that it is the same.
468 if (SEWLMULRatioOnly)
469 return hasSameVLMAX(Other);
470
471 // If the full VTYPE is valid, check that it is the same.
472 return hasSameVTYPE(Other);
473 }
474
475 bool operator!=(const VSETVLIInfo &Other) const { return !(*this == Other); }
476
477 // Calculate the VSETVLIInfo visible to a block assuming this and Other are
478 // both predecessors.
480 // If the new value isn't valid, ignore it.
481 if (!Other.isValid())
482 return *this;
483
484 // If this value isn't valid, this must be the first predecessor, use it.
485 if (!isValid())
486 return Other;
487
488 // If either is unknown, the result is unknown.
489 if (isUnknown() || Other.isUnknown())
491
492 // If we have an exact, match return this.
493 if (*this == Other)
494 return *this;
495
496 // Not an exact match, but maybe the AVL and VLMAX are the same. If so,
497 // return an SEW/LMUL ratio only value.
499 VSETVLIInfo MergeInfo = *this;
500 MergeInfo.SEWLMULRatioOnly = true;
501 return MergeInfo;
502 }
503
504 // Otherwise the result is unknown.
506 }
507
508#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
509 /// Support for debugging, callable in GDB: V->dump()
510 LLVM_DUMP_METHOD void dump() const {
511 print(dbgs());
512 dbgs() << "\n";
513 }
514
515 /// Implement operator<<.
516 /// @{
517 void print(raw_ostream &OS) const {
518 OS << '{';
519 switch (State) {
520 case AVLState::Uninitialized:
521 OS << "Uninitialized";
522 break;
523 case AVLState::Unknown:
524 OS << "unknown";
525 break;
526 case AVLState::AVLIsReg:
527 OS << "AVLReg=" << llvm::printReg(getAVLReg());
528 break;
529 case AVLState::AVLIsImm:
530 OS << "AVLImm=" << (unsigned)AVLImm;
531 break;
532 case AVLState::AVLIsVLMAX:
533 OS << "AVLVLMAX";
534 break;
535 }
536 if (isKnown()) {
537 OS << ", ";
538
539 unsigned LMul;
540 bool Fractional;
541 std::tie(LMul, Fractional) = decodeVLMUL(VLMul);
542
543 OS << "VLMul=m";
544 if (Fractional)
545 OS << 'f';
546 OS << LMul << ", "
547 << "SEW=e" << (unsigned)SEW << ", "
548 << "TailAgnostic=" << (bool)TailAgnostic << ", "
549 << "MaskAgnostic=" << (bool)MaskAgnostic << ", "
550 << "SEWLMULRatioOnly=" << (bool)SEWLMULRatioOnly << ", "
551 << "TWiden=" << (unsigned)TWiden << ", "
552 << "AltFmt=" << (bool)AltFmt;
553 }
554
555 OS << '}';
556 }
557#endif
558};
559
560#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
563 V.print(OS);
564 return OS;
565}
566#endif
567
569 const RISCVSubtarget *ST;
570 // Possibly null!
571 LiveIntervals *LIS;
572
573public:
576 : ST(ST), LIS(LIS) {}
577
580
581private:
582 void forwardVSETVLIAVL(VSETVLIInfo &Info) const;
583};
584
585} // namespace RISCV
586} // namespace llvm
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ATTRIBUTE_USED
Definition Compiler.h:236
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:661
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
IRTranslator LLVM IR MI
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
MachineInstr * getInstructionFromIndex(SlotIndex index) const
Returns the instruction associated with the given index.
Representation of each machine instruction.
RISCVVSETVLIInfoAnalysis(const RISCVSubtarget *ST, LiveIntervals *LIS)
VSETVLIInfo getInfoForVSETVLI(const MachineInstr &MI) const
VSETVLIInfo computeInfoForInstr(const MachineInstr &MI) const
Defines the abstract state with which the forward dataflow models the values of the VL and VTYPE regi...
void setVLMul(RISCVVType::VLMUL VLMul)
bool hasNonZeroAVL(const LiveIntervals *LIS) const
void print(raw_ostream &OS) const
Implement operator<<.
bool hasSameVTYPE(const VSETVLIInfo &Other) const
VSETVLIInfo intersect(const VSETVLIInfo &Other) const
bool operator!=(const VSETVLIInfo &Other) const
const MachineInstr * getAVLDefMI(const LiveIntervals *LIS) const
bool hasSameVLMAX(const VSETVLIInfo &Other) const
bool hasCompatibleVTYPE(const DemandedFields &Used, const VSETVLIInfo &Require) const
LLVM_DUMP_METHOD void dump() const
Support for debugging, callable in GDB: V->dump()
void setVTYPE(RISCVVType::VLMUL L, unsigned S, bool TA, bool MA, bool Altfmt, unsigned W)
bool isCompatible(const DemandedFields &Used, const VSETVLIInfo &Require, const LiveIntervals *LIS) const
bool hasSameAVL(const VSETVLIInfo &Other) const
const VNInfo * getAVLVNInfo() const
void setAVLRegDef(const VNInfo *VNInfo, Register AVLReg)
bool operator==(const VSETVLIInfo &Other) const
bool hasSameAVLLatticeValue(const VSETVLIInfo &Other) const
RISCVVType::VLMUL getVLMUL() const
bool hasEquallyZeroAVL(const VSETVLIInfo &Other, const LiveIntervals *LIS) const
void setAVL(const VSETVLIInfo &Info)
Wrapper class representing virtual and physical registers.
Definition Register.h:20
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
VNInfo - Value Number Information.
unsigned id
The ID number of this value.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
static bool isTailAgnostic(unsigned VType)
LLVM_ABI unsigned encodeXSfmmVType(unsigned SEW, unsigned Widen, bool AltFmt)
static unsigned getXSfmmWiden(unsigned VType)
static bool isMaskAgnostic(unsigned VType)
static bool hasXSfmmWiden(unsigned VType)
LLVM_ABI unsigned getSEWLMULRatio(unsigned SEW, VLMUL VLMul)
static bool isAltFmt(unsigned VType)
LLVM_ABI unsigned encodeVTYPE(VLMUL VLMUL, unsigned SEW, bool TailAgnostic, bool MaskAgnostic, bool AltFmt=false)
static unsigned getSEW(unsigned VType)
static VLMUL getVLMUL(unsigned VType)
DemandedFields getDemanded(const MachineInstr &MI, const RISCVSubtarget *ST)
Return the fields and properties demanded by the provided instruction.
bool areCompatibleVTYPEs(uint64_t CurVType, uint64_t NewVType, const DemandedFields &Used)
Return true if moving from CurVType to NewVType is indistinguishable from the perspective of an instr...
LLVM_ATTRIBUTE_USED raw_ostream & operator<<(raw_ostream &OS, const DemandedFields &DF)
This is an optimization pass for GlobalISel generic memory operations.
@ Uninitialized
Definition Threading.h:60
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
@ Other
Any other memory.
Definition ModRef.h:68
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
Which subfields of VL or VTYPE have values we need to preserve?
void doUnion(const DemandedFields &B)
LLVM_DUMP_METHOD void dump() const
Support for debugging, callable in GDB: V->dump()
void print(raw_ostream &OS) const
Implement operator<<.
enum llvm::RISCV::DemandedFields::@326061152055210015167034143142117063364004052074 SEW
enum llvm::RISCV::DemandedFields::@201276154261047021277240313173154105356124146047 LMUL