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
45};
46
48unsigned getBrCond(CondCode CC, unsigned SelectOpc = 0);
49
50} // end of namespace RISCVCC
51
52// RISCV MachineCombiner patterns
60};
61
63
64public:
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
388};
389
390#define GET_RISCVVPseudosTable_DECL
391#include "RISCVGenSearchableTables.inc"
392
393} // end namespace RISCVVPseudosTable
394
395namespace RISCV {
396
401};
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
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
This class represents an Operation in the Expression.
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.
Definition: MCInstrDesc.h:199
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
Representation of each machine instruction.
Definition: MachineInstr.h:72
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
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...
Definition: SmallPtrSet.h:380
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
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.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
RISCVMachineCombinerPattern
@ SHXADD_ADD_SLLI_OP2
@ FMADD_AX
@ FMADD_XA
@ SHXADD_ADD_SLLI_OP1
MachineTraceStrategy
Strategies for selecting traces.
static const MachineMemOperand::Flags MONontemporalBit1
static const MachineMemOperand::Flags MONontemporalBit0
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
Description of the encoding of one expression 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.