LLVM 22.0.0git
RISCVInstrInfo.h
Go to the documentation of this file.
1//===-- RISCVInstrInfo.h - RISC-V Instruction 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 contains the RISC-V implementation of the TargetInstrInfo class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_RISCV_RISCVINSTRINFO_H
14#define LLVM_LIB_TARGET_RISCV_RISCVINSTRINFO_H
15
16#include "RISCV.h"
17#include "RISCVRegisterInfo.h"
20
21#define GET_INSTRINFO_HEADER
22#define GET_INSTRINFO_OPERAND_ENUM
23#include "RISCVGenInstrInfo.inc"
24#include "RISCVGenRegisterInfo.inc"
25
26namespace llvm {
27
28class RISCVSubtarget;
29
34
35namespace RISCVCC {
36
46
47CondCode getOppositeBranchCondition(CondCode);
48unsigned getBrCond(CondCode CC, unsigned SelectOpc = 0);
49
50} // end of namespace RISCVCC
51
52// RISCV MachineCombiner patterns
61
63
64public:
65 explicit RISCVInstrInfo(const RISCVSubtarget &STI);
66
67 MCInst getNop() const override;
68
70 int &FrameIndex) const override;
71 Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex,
72 TypeSize &MemBytes) const override;
74 int &FrameIndex) const override;
75 Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex,
76 TypeSize &MemBytes) const override;
77
78 bool isReallyTriviallyReMaterializable(const MachineInstr &MI) const override;
79
81 return MI.getOpcode() == RISCV::ADDI && MI.getOperand(1).isReg() &&
82 MI.getOperand(1).getReg() == RISCV::X0;
83 }
84
87 MCRegister DstReg, MCRegister SrcReg, bool KillSrc,
88 const TargetRegisterClass *RegClass) const;
90 const DebugLoc &DL, Register DstReg, Register SrcReg,
91 bool KillSrc, bool RenamableDest = false,
92 bool RenamableSrc = false) const override;
93
96 bool IsKill, int FrameIndex, const TargetRegisterClass *RC,
97 const TargetRegisterInfo *TRI, Register VReg,
98 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
99
102 int FrameIndex, const TargetRegisterClass *RC,
103 const TargetRegisterInfo *TRI, Register VReg,
104 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
105
110 int FrameIndex,
111 LiveIntervals *LIS = nullptr,
112 VirtRegMap *VRM = nullptr) const override;
113
114 // Materializes the given integer Val into DstReg.
116 const DebugLoc &DL, Register DstReg, uint64_t Val,
118 bool DstRenamable = false, bool DstIsDead = false) const;
119
120 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
121
123 MachineBasicBlock *&FBB,
125 bool AllowModify) const override;
126
129 const DebugLoc &dl,
130 int *BytesAdded = nullptr) const override;
131
133 MachineBasicBlock &NewDestBB,
134 MachineBasicBlock &RestoreBB, const DebugLoc &DL,
135 int64_t BrOffset, RegScavenger *RS) const override;
136
138 int *BytesRemoved = nullptr) const override;
139
140 bool
142
143 bool optimizeCondBranch(MachineInstr &MI) const override;
144
145 MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
146
147 bool isBranchOffsetInRange(unsigned BranchOpc,
148 int64_t BrOffset) const override;
149
150 bool analyzeSelect(const MachineInstr &MI,
151 SmallVectorImpl<MachineOperand> &Cond, unsigned &TrueOp,
152 unsigned &FalseOp, bool &Optimizable) const override;
153
156 bool) const override;
157
158 bool isAsCheapAsAMove(const MachineInstr &MI) const override;
159
160 std::optional<DestSourcePair>
161 isCopyInstrImpl(const MachineInstr &MI) const override;
162
164 StringRef &ErrInfo) const override;
165
167 const MachineInstr &AddrI,
168 ExtAddrMode &AM) const override;
169
171 const ExtAddrMode &AM) const override;
172
175 int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width,
176 const TargetRegisterInfo *TRI) const override;
177
179 int64_t Offset1, bool OffsetIsScalable1,
181 int64_t Offset2, bool OffsetIsScalable2,
182 unsigned ClusterSize,
183 unsigned NumBytes) const override;
184
186 const MachineOperand *&BaseOp,
187 int64_t &Offset, LocationSize &Width,
188 const TargetRegisterInfo *TRI) const;
189
191 const MachineInstr &MIb) const override;
192
193
194 std::pair<unsigned, unsigned>
195 decomposeMachineOperandsTargetFlags(unsigned TF) const override;
196
199
200 // Return true if the function can safely be outlined from.
202 bool OutlineFromLinkOnceODRs) const override;
203
204 // Return true if MBB is safe to outline from, and return any target-specific
205 // information in Flags.
207 unsigned &Flags) const override;
208
210
211 // Calculate target-specific information for a set of outlining candidates.
212 std::optional<std::unique_ptr<outliner::OutlinedFunction>>
214 const MachineModuleInfo &MMI,
215 std::vector<outliner::Candidate> &RepeatedSequenceLocs,
216 unsigned MinRepeats) const override;
217
218 // Return if/how a given MachineInstr should be outlined.
221 unsigned Flags) const override;
222
223 // Insert a custom frame for outlined functions.
225 const outliner::OutlinedFunction &OF) const override;
226
227 // Insert a call to an outlined function into a given basic block.
231 outliner::Candidate &C) const override;
232
233 std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI,
234 Register Reg) const override;
235
236 bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1,
237 unsigned &SrcOpIdx2) const override;
239 unsigned OpIdx1,
240 unsigned OpIdx2) const override;
241
242 bool simplifyInstruction(MachineInstr &MI) const override;
243
245 LiveIntervals *LIS) const override;
246
247 // MIR printer helper function to annotate Operands with a comment.
248 std::string
250 unsigned OpIdx,
251 const TargetRegisterInfo *TRI) const override;
252
253 /// Generate code to multiply the value in DestReg by Amt - handles all
254 /// the common optimizations for this idiom, and supports fallback for
255 /// subtargets which don't support multiply instructions.
258 Register DestReg, uint32_t Amt, MachineInstr::MIFlag Flag) const;
259
260 bool useMachineCombiner() const override { return true; }
261
263
264 CombinerObjective getCombinerObjective(unsigned Pattern) const override;
265
268 bool DoRegPressureReduce) const override;
269
270 void
271 finalizeInsInstrs(MachineInstr &Root, unsigned &Pattern,
272 SmallVectorImpl<MachineInstr *> &InsInstrs) const override;
273
275 MachineInstr &Root, unsigned Pattern,
278 DenseMap<Register, unsigned> &InstrIdxForVirtReg) const override;
279
280 bool hasReassociableOperands(const MachineInstr &Inst,
281 const MachineBasicBlock *MBB) const override;
282
283 bool hasReassociableSibling(const MachineInstr &Inst,
284 bool &Commuted) const override;
285
287 bool Invert) const override;
288
289 std::optional<unsigned> getInverseOpcode(unsigned Opcode) const override;
290
292 const MachineInstr &Root, unsigned Pattern,
293 std::array<unsigned, 5> &OperandIndices) const override;
294
297
298 unsigned getTailDuplicateSize(CodeGenOptLevel OptLevel) const override;
299
300 std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
301 analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override;
302
303 bool isHighLatencyDef(int Opc) const override;
304
305 /// Return true if pairing the given load or store may be paired with another.
306 static bool isPairableLdStInstOpc(unsigned Opc);
307
308 static bool isLdStSafeToPair(const MachineInstr &LdSt,
309 const TargetRegisterInfo *TRI);
310#define GET_INSTRINFO_HELPER_DECLS
311#include "RISCVGenInstrInfo.inc"
312
314
315 /// Return the result of the evaluation of C0 CC C1, where CC is a
316 /// RISCVCC::CondCode.
317 static bool evaluateCondBranch(RISCVCC::CondCode CC, int64_t C0, int64_t C1);
318
319 /// Return true if the operand is a load immediate instruction and
320 /// sets Imm to the immediate value.
321 static bool isFromLoadImm(const MachineRegisterInfo &MRI,
322 const MachineOperand &Op, int64_t &Imm);
323
324protected:
326
327private:
328 unsigned getInstBundleLength(const MachineInstr &MI) const;
329
330 bool isVectorAssociativeAndCommutative(const MachineInstr &MI,
331 bool Invert = false) const;
332 bool areRVVInstsReassociable(const MachineInstr &MI1,
333 const MachineInstr &MI2) const;
334 bool hasReassociableVectorSibling(const MachineInstr &Inst,
335 bool &Commuted) const;
336};
337
338namespace RISCV {
339
340// Returns true if the given MI is an RVV instruction opcode for which we may
341// expect to see a FrameIndex operand.
342bool isRVVSpill(const MachineInstr &MI);
343
344std::optional<std::pair<unsigned, unsigned>>
345isRVVSpillForZvlsseg(unsigned Opcode);
346
347// Return true if both input instructions have equal rounding mode. If at least
348// one of the instructions does not have rounding mode, false will be returned.
349bool hasEqualFRM(const MachineInstr &MI1, const MachineInstr &MI2);
350
351// If \p Opcode is a .vx vector instruction, returns the lower number of bits
352// that are used from the scalar .x operand for a given \p Log2SEW. Otherwise
353// returns null.
354std::optional<unsigned> getVectorLowDemandedScalarBits(unsigned Opcode,
355 unsigned Log2SEW);
356
357// Returns the MC opcode of RVV pseudo instruction.
358unsigned getRVVMCOpcode(unsigned RVVPseudoOpcode);
359
360// For a (non-pseudo) RVV instruction \p Desc and the given \p Log2SEW, returns
361// the log2 EEW of the destination operand.
362unsigned getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW);
363
364// Special immediate for AVL operand of V pseudo instructions to indicate VLMax.
365static constexpr int64_t VLMaxSentinel = -1LL;
366
367/// Given two VL operands, do we know that LHS <= RHS?
368bool isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS);
369
370// Mask assignments for floating-point
371static constexpr unsigned FPMASK_Negative_Infinity = 0x001;
372static constexpr unsigned FPMASK_Negative_Normal = 0x002;
373static constexpr unsigned FPMASK_Negative_Subnormal = 0x004;
374static constexpr unsigned FPMASK_Negative_Zero = 0x008;
375static constexpr unsigned FPMASK_Positive_Zero = 0x010;
376static constexpr unsigned FPMASK_Positive_Subnormal = 0x020;
377static constexpr unsigned FPMASK_Positive_Normal = 0x040;
378static constexpr unsigned FPMASK_Positive_Infinity = 0x080;
379static constexpr unsigned FPMASK_Signaling_NaN = 0x100;
380static constexpr unsigned FPMASK_Quiet_NaN = 0x200;
381} // namespace RISCV
382
383namespace RISCVVPseudosTable {
384
389
390#define GET_RISCVVPseudosTable_DECL
391#include "RISCVGenSearchableTables.inc"
392
393} // end namespace RISCVVPseudosTable
394
395namespace RISCV {
396
402#define GET_RISCVMaskedPseudosTable_DECL
403#include "RISCVGenSearchableTables.inc"
404} // end namespace RISCV
405
406} // end namespace llvm
407#endif
unsigned const MachineRegisterInfo * MRI
SmallVector< int16_t, MAX_SRC_OPERANDS_NUM > OperandIndices
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Register Reg
Register const TargetRegisterInfo * TRI
MachineInstr unsigned OpIdx
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
Value * RHS
Value * LHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
A debug info location.
Definition DebugLoc.h:124
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.
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:33
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
This class contains meta information specific to a module.
MachineOperand class - Representation of each machine instruction operand.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
MachineInstr * convertToThreeAddress(MachineInstr &MI, LiveVariables *LV, LiveIntervals *LIS) const override
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
std::optional< std::unique_ptr< outliner::OutlinedFunction > > getOutliningCandidateInfo(const MachineModuleInfo &MMI, std::vector< outliner::Candidate > &RepeatedSequenceLocs, unsigned MinRepeats) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
void genAlternativeCodeSequence(MachineInstr &Root, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, DenseMap< Register, unsigned > &InstrIdxForVirtReg) const override
void movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, uint64_t Val, MachineInstr::MIFlag Flag=MachineInstr::NoFlags, bool DstRenamable=false, bool DstIsDead=false) const
MachineInstr * emitLdStWithAddr(MachineInstr &MemI, const ExtAddrMode &AM) const override
void mulImm(MachineFunction &MF, MachineBasicBlock &MBB, MachineBasicBlock::iterator II, const DebugLoc &DL, Register DestReg, uint32_t Amt, MachineInstr::MIFlag Flag) const
Generate code to multiply the value in DestReg by Amt - handles all the common optimizations for this...
static bool isPairableLdStInstOpc(unsigned Opc)
Return true if pairing the given load or store may be paired with another.
bool isReallyTriviallyReMaterializable(const MachineInstr &MI) const override
RISCVInstrInfo(const RISCVSubtarget &STI)
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool isFunctionSafeToOutlineFrom(MachineFunction &MF, bool OutlineFromLinkOnceODRs) const override
std::unique_ptr< TargetInstrInfo::PipelinerLoopInfo > analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &dl, int *BytesAdded=nullptr) const override
bool hasReassociableSibling(const MachineInstr &Inst, bool &Commuted) const override
static bool isLdStSafeToPair(const MachineInstr &LdSt, const TargetRegisterInfo *TRI)
void copyPhysRegVector(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg, bool KillSrc, const TargetRegisterClass *RegClass) const
MachineInstr * optimizeSelect(MachineInstr &MI, SmallPtrSetImpl< MachineInstr * > &SeenMIs, bool) const override
bool canFoldIntoAddrMode(const MachineInstr &MemI, Register Reg, const MachineInstr &AddrI, ExtAddrMode &AM) const override
void insertIndirectBranch(MachineBasicBlock &MBB, MachineBasicBlock &NewDestBB, MachineBasicBlock &RestoreBB, const DebugLoc &DL, int64_t BrOffset, RegScavenger *RS) const override
bool isAsCheapAsAMove(const MachineInstr &MI) const override
bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override
bool getMemOperandWithOffsetWidth(const MachineInstr &LdSt, const MachineOperand *&BaseOp, int64_t &Offset, LocationSize &Width, const TargetRegisterInfo *TRI) const
unsigned getTailDuplicateSize(CodeGenOptLevel OptLevel) const override
void getReassociateOperandIndices(const MachineInstr &Root, unsigned Pattern, std::array< unsigned, 5 > &OperandIndices) const override
const RISCVSubtarget & STI
bool useMachineCombiner() const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
std::optional< unsigned > getInverseOpcode(unsigned Opcode) const override
bool simplifyInstruction(MachineInstr &MI) const override
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
outliner::InstrType getOutliningTypeImpl(const MachineModuleInfo &MMI, MachineBasicBlock::iterator &MBBI, unsigned Flags) const override
MachineTraceStrategy getMachineCombinerTraceStrategy() const override
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
std::optional< RegImmPair > isAddImmediate(const MachineInstr &MI, Register Reg) const override
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
ArrayRef< std::pair< MachineMemOperand::Flags, const char * > > getSerializableMachineMemOperandTargetFlags() const override
MCInst getNop() const override
MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const override
bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB, unsigned &Flags) const override
bool getMemOperandsWithOffsetWidth(const MachineInstr &MI, SmallVectorImpl< const MachineOperand * > &BaseOps, int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width, const TargetRegisterInfo *TRI) const override
void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF, const outliner::OutlinedFunction &OF) const override
void finalizeInsInstrs(MachineInstr &Root, unsigned &Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs) const override
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned OpIdx1, unsigned OpIdx2) const override
bool shouldBreakCriticalEdgeToSink(MachineInstr &MI) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DstReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool hasReassociableOperands(const MachineInstr &Inst, const MachineBasicBlock *MBB) const override
MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const override
std::string createMIROperandComment(const MachineInstr &MI, const MachineOperand &Op, unsigned OpIdx, const TargetRegisterInfo *TRI) const override
bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1, unsigned &SrcOpIdx2) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
MachineBasicBlock::iterator insertOutlinedCall(Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It, MachineFunction &MF, outliner::Candidate &C) const override
bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const override
static RISCVCC::CondCode getCondFromBranchOpc(unsigned Opc)
bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert) const override
CombinerObjective getCombinerObjective(unsigned Pattern) const override
bool isHighLatencyDef(int Opc) const override
static bool evaluateCondBranch(RISCVCC::CondCode CC, int64_t C0, int64_t C1)
Return the result of the evaluation of C0 CC C1, where CC is a RISCVCC::CondCode.
bool getMachineCombinerPatterns(MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns, bool DoRegPressureReduce) const override
bool optimizeCondBranch(MachineInstr &MI) const override
std::optional< DestSourcePair > isCopyInstrImpl(const MachineInstr &MI) const override
bool analyzeSelect(const MachineInstr &MI, SmallVectorImpl< MachineOperand > &Cond, unsigned &TrueOp, unsigned &FalseOp, bool &Optimizable) const override
static bool isFromLoadImm(const MachineRegisterInfo &MRI, const MachineOperand &Op, int64_t &Imm)
Return true if the operand is a load immediate instruction and sets Imm to the immediate value.
bool shouldClusterMemOps(ArrayRef< const MachineOperand * > BaseOps1, int64_t Offset1, bool OffsetIsScalable1, ArrayRef< const MachineOperand * > BaseOps2, int64_t Offset2, bool OffsetIsScalable2, unsigned ClusterSize, unsigned NumBytes) const override
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
Wrapper class representing virtual and physical registers.
Definition Register.h:19
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const
Target-dependent implementation for foldMemoryOperand.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
CondCode getOppositeBranchCondition(CondCode)
unsigned getBrCond(CondCode CC, unsigned SelectOpc=0)
static constexpr unsigned FPMASK_Negative_Zero
static constexpr unsigned FPMASK_Positive_Subnormal
bool hasEqualFRM(const MachineInstr &MI1, const MachineInstr &MI2)
static constexpr unsigned FPMASK_Positive_Normal
static constexpr unsigned FPMASK_Negative_Subnormal
static constexpr unsigned FPMASK_Negative_Normal
bool isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS)
Given two VL operands, do we know that LHS <= RHS?
static constexpr unsigned FPMASK_Positive_Infinity
static constexpr unsigned FPMASK_Negative_Infinity
static constexpr unsigned FPMASK_Quiet_NaN
unsigned getRVVMCOpcode(unsigned RVVPseudoOpcode)
unsigned getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW)
std::optional< unsigned > getVectorLowDemandedScalarBits(unsigned Opcode, unsigned Log2SEW)
std::optional< std::pair< unsigned, unsigned > > isRVVSpillForZvlsseg(unsigned Opcode)
static constexpr unsigned FPMASK_Signaling_NaN
static constexpr unsigned FPMASK_Positive_Zero
bool isRVVSpill(const MachineInstr &MI)
static constexpr int64_t VLMaxSentinel
InstrType
Represents how an instruction should be mapped by the outliner.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
RISCVMachineCombinerPattern
@ SHXADD_ADD_SLLI_OP2
@ SHXADD_ADD_SLLI_OP1
MachineTraceStrategy
Strategies for selecting traces.
static const MachineMemOperand::Flags MONontemporalBit1
static const MachineMemOperand::Flags MONontemporalBit0
Op::Description Desc
CombinerObjective
The combiner's goal may differ based on which pattern it is attempting to optimize.
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
DWARFExpression::Operation Op
Used to describe addressing mode similar to ExtAddrMode in CodeGenPrepare.
An individual sequence of instructions to be replaced with a call to an outlined function.
The information necessary to create an outlined function for some class of candidate.