LLVM 20.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, bool Imm = false);
49
50} // end of namespace RISCVCC
51
52// RISCV MachineCombiner patterns
60};
61
63
64public:
66
67 MCInst getNop() const override;
68 const MCInstrDesc &getBrCond(RISCVCC::CondCode CC, bool Imm = false) const;
69
71 int &FrameIndex) const override;
72 Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex,
73 unsigned &MemBytes) const override;
75 int &FrameIndex) const override;
76 Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex,
77 unsigned &MemBytes) const override;
78
79 bool isReallyTriviallyReMaterializable(const MachineInstr &MI) const override;
80
82 return MI.getOpcode() == RISCV::ADDI && MI.getOperand(1).isReg() &&
83 MI.getOperand(1).getReg() == RISCV::X0;
84 }
85
88 MCRegister DstReg, MCRegister SrcReg, bool KillSrc,
89 const TargetRegisterClass *RegClass) const;
91 const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg,
92 bool KillSrc, bool RenamableDest = false,
93 bool RenamableSrc = false) const override;
94
97 bool IsKill, int FrameIndex, const TargetRegisterClass *RC,
98 const TargetRegisterInfo *TRI, Register VReg,
99 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
100
103 int FrameIndex, const TargetRegisterClass *RC,
104 const TargetRegisterInfo *TRI, Register VReg,
105 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
106
111 int FrameIndex,
112 LiveIntervals *LIS = nullptr,
113 VirtRegMap *VRM = nullptr) const override;
114
115 // Materializes the given integer Val into DstReg.
117 const DebugLoc &DL, Register DstReg, uint64_t Val,
119 bool DstRenamable = false, bool DstIsDead = false) const;
120
121 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
122
124 MachineBasicBlock *&FBB,
126 bool AllowModify) const override;
127
130 const DebugLoc &dl,
131 int *BytesAdded = nullptr) const override;
132
134 MachineBasicBlock &NewDestBB,
135 MachineBasicBlock &RestoreBB, const DebugLoc &DL,
136 int64_t BrOffset, RegScavenger *RS) const override;
137
139 int *BytesRemoved = nullptr) const override;
140
141 bool
143
144 bool optimizeCondBranch(MachineInstr &MI) const override;
145
146 MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
147
148 bool isBranchOffsetInRange(unsigned BranchOpc,
149 int64_t BrOffset) const override;
150
151 bool analyzeSelect(const MachineInstr &MI,
152 SmallVectorImpl<MachineOperand> &Cond, unsigned &TrueOp,
153 unsigned &FalseOp, bool &Optimizable) const override;
154
157 bool) const override;
158
159 bool isAsCheapAsAMove(const MachineInstr &MI) const override;
160
161 std::optional<DestSourcePair>
162 isCopyInstrImpl(const MachineInstr &MI) const override;
163
165 StringRef &ErrInfo) const override;
166
168 const MachineInstr &AddrI,
169 ExtAddrMode &AM) const override;
170
172 const ExtAddrMode &AM) const override;
173
176 int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width,
177 const TargetRegisterInfo *TRI) const override;
178
180 int64_t Offset1, bool OffsetIsScalable1,
182 int64_t Offset2, bool OffsetIsScalable2,
183 unsigned ClusterSize,
184 unsigned NumBytes) const override;
185
187 const MachineOperand *&BaseOp,
188 int64_t &Offset, LocationSize &Width,
189 const TargetRegisterInfo *TRI) const;
190
192 const MachineInstr &MIb) const override;
193
194
195 std::pair<unsigned, unsigned>
196 decomposeMachineOperandsTargetFlags(unsigned TF) const override;
197
200
201 // Return true if the function can safely be outlined from.
203 bool OutlineFromLinkOnceODRs) const override;
204
205 // Return true if MBB is safe to outline from, and return any target-specific
206 // information in Flags.
208 unsigned &Flags) const override;
209
211
212 // Calculate target-specific information for a set of outlining candidates.
213 std::optional<std::unique_ptr<outliner::OutlinedFunction>>
215 const MachineModuleInfo &MMI,
216 std::vector<outliner::Candidate> &RepeatedSequenceLocs,
217 unsigned MinRepeats) const override;
218
219 // Return if/how a given MachineInstr should be outlined.
220 virtual outliner::InstrType
223 unsigned Flags) const override;
224
225 // Insert a custom frame for outlined functions.
227 const outliner::OutlinedFunction &OF) const override;
228
229 // Insert a call to an outlined function into a given basic block.
233 outliner::Candidate &C) const override;
234
235 std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI,
236 Register Reg) const override;
237
238 bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1,
239 unsigned &SrcOpIdx2) const override;
241 unsigned OpIdx1,
242 unsigned OpIdx2) 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<unsigned, 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
303protected:
305
306private:
307 unsigned getInstBundleLength(const MachineInstr &MI) const;
308
309 bool isVectorAssociativeAndCommutative(const MachineInstr &MI,
310 bool Invert = false) const;
311 bool areRVVInstsReassociable(const MachineInstr &MI1,
312 const MachineInstr &MI2) const;
313 bool hasReassociableVectorSibling(const MachineInstr &Inst,
314 bool &Commuted) const;
315};
316
317namespace RISCV {
318
319// Returns true if this is the sext.w pattern, addiw rd, rs1, 0.
320bool isSEXT_W(const MachineInstr &MI);
321bool isZEXT_W(const MachineInstr &MI);
322bool isZEXT_B(const MachineInstr &MI);
323
324// Returns true if the given MI is an RVV instruction opcode for which we may
325// expect to see a FrameIndex operand.
326bool isRVVSpill(const MachineInstr &MI);
327
328std::optional<std::pair<unsigned, unsigned>>
329isRVVSpillForZvlsseg(unsigned Opcode);
330
331bool isFaultFirstLoad(const MachineInstr &MI);
332
333// Implemented in RISCVGenInstrInfo.inc
334int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIndex);
335
336// Return true if both input instructions have equal rounding mode. If at least
337// one of the instructions does not have rounding mode, false will be returned.
338bool hasEqualFRM(const MachineInstr &MI1, const MachineInstr &MI2);
339
340// If \p Opcode is a .vx vector instruction, returns the lower number of bits
341// that are used from the scalar .x operand for a given \p Log2SEW. Otherwise
342// returns null.
343std::optional<unsigned> getVectorLowDemandedScalarBits(uint16_t Opcode,
344 unsigned Log2SEW);
345
346// Returns the MC opcode of RVV pseudo instruction.
347unsigned getRVVMCOpcode(unsigned RVVPseudoOpcode);
348
349// For a (non-pseudo) RVV instruction \p Desc and the given \p Log2SEW, returns
350// the log2 EEW of the destination operand.
351unsigned getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW);
352
353// Special immediate for AVL operand of V pseudo instructions to indicate VLMax.
354static constexpr int64_t VLMaxSentinel = -1LL;
355
356/// Given two VL operands, do we know that LHS <= RHS?
357bool isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS);
358
359// Mask assignments for floating-point
360static constexpr unsigned FPMASK_Negative_Infinity = 0x001;
361static constexpr unsigned FPMASK_Negative_Normal = 0x002;
362static constexpr unsigned FPMASK_Negative_Subnormal = 0x004;
363static constexpr unsigned FPMASK_Negative_Zero = 0x008;
364static constexpr unsigned FPMASK_Positive_Zero = 0x010;
365static constexpr unsigned FPMASK_Positive_Subnormal = 0x020;
366static constexpr unsigned FPMASK_Positive_Normal = 0x040;
367static constexpr unsigned FPMASK_Positive_Infinity = 0x080;
368static constexpr unsigned FPMASK_Signaling_NaN = 0x100;
369static constexpr unsigned FPMASK_Quiet_NaN = 0x200;
370} // namespace RISCV
371
372namespace RISCVVPseudosTable {
373
377};
378
379#define GET_RISCVVPseudosTable_DECL
380#include "RISCVGenSearchableTables.inc"
381
382} // end namespace RISCVVPseudosTable
383
384namespace RISCV {
385
390};
391#define GET_RISCVMaskedPseudosTable_DECL
392#include "RISCVGenSearchableTables.inc"
393} // end namespace RISCV
394
395} // end namespace llvm
396#endif
SmallVector< int16_t, MAX_SRC_OPERANDS_NUM > OperandIndices
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
IRTranslator LLVM IR MI
unsigned const TargetRegisterInfo * TRI
unsigned Reg
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:33
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:185
Describe properties that are true of each instruction in the target description file.
Definition: MCInstrDesc.h:198
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
Representation of each machine instruction.
Definition: MachineInstr.h:69
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:65
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 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...
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
void copyPhysRegVector(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg, bool KillSrc, const TargetRegisterClass *RegClass) const
void genAlternativeCodeSequence(MachineInstr &Root, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, DenseMap< unsigned, unsigned > &InstrIdxForVirtReg) const override
const MCInstrDesc & getBrCond(RISCVCC::CondCode CC, bool Imm=false) const
MachineInstr * optimizeSelect(MachineInstr &MI, SmallPtrSetImpl< MachineInstr * > &SeenMIs, bool) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, MCRegister DstReg, MCRegister SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) 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
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
virtual 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
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
bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert) const override
CombinerObjective getCombinerObjective(unsigned Pattern) const override
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
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:363
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
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, bool Imm=false)
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?
std::optional< unsigned > getVectorLowDemandedScalarBits(uint16_t Opcode, unsigned Log2SEW)
static constexpr unsigned FPMASK_Positive_Infinity
int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIndex)
static constexpr unsigned FPMASK_Negative_Infinity
static constexpr unsigned FPMASK_Quiet_NaN
unsigned getRVVMCOpcode(unsigned RVVPseudoOpcode)
unsigned getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW)
bool isSEXT_W(const MachineInstr &MI)
bool isFaultFirstLoad(const MachineInstr &MI)
std::optional< std::pair< unsigned, unsigned > > isRVVSpillForZvlsseg(unsigned Opcode)
static constexpr unsigned FPMASK_Signaling_NaN
bool isZEXT_B(const MachineInstr &MI)
static constexpr unsigned FPMASK_Positive_Zero
bool isRVVSpill(const MachineInstr &MI)
static constexpr int64_t VLMaxSentinel
bool isZEXT_W(const MachineInstr &MI)
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:480
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:54
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.