LLVM 23.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
28// If Value is of the form C1<<C2, where C1 = 3, 5 or 9,
29// returns log2(C1 - 1) and assigns Shift = C2.
30// Otherwise, returns 0.
31template <typename T> int isShifted359(T Value, int &Shift) {
32 if (Value == 0)
33 return 0;
34 Shift = llvm::countr_zero(Value);
35 switch (Value >> Shift) {
36 case 3:
37 return 1;
38 case 5:
39 return 2;
40 case 9:
41 return 3;
42 default:
43 return 0;
44 }
45}
46
47class RISCVSubtarget;
48
53
54namespace RISCVCC {
55
65
66CondCode getInverseBranchCondition(CondCode);
67unsigned getBrCond(CondCode CC, unsigned SelectOpc = 0);
68
69} // end of namespace RISCVCC
70
71// RISCV MachineCombiner patterns
80
82 const RISCVRegisterInfo RegInfo;
83
84public:
85 explicit RISCVInstrInfo(const RISCVSubtarget &STI);
86
87 const RISCVRegisterInfo &getRegisterInfo() const { return RegInfo; }
88
89 MCInst getNop() const override;
90
92 int &FrameIndex) const override;
93 Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex,
94 TypeSize &MemBytes) const override;
96 int &FrameIndex) const override;
97 Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex,
98 TypeSize &MemBytes) const override;
99
100 bool isReMaterializableImpl(const MachineInstr &MI) const override;
101
103 return MI.getOpcode() == RISCV::ADDI && MI.getOperand(1).isReg() &&
104 MI.getOperand(1).getReg() == RISCV::X0;
105 }
106
109 MCRegister DstReg, MCRegister SrcReg, bool KillSrc,
110 const TargetRegisterClass *RegClass) const;
112 const DebugLoc &DL, Register DstReg, Register SrcReg,
113 bool KillSrc, bool RenamableDest = false,
114 bool RenamableSrc = false) const override;
115
118 bool IsKill, int FrameIndex, const TargetRegisterClass *RC,
119
120 Register VReg,
121 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
122
125 int FrameIndex, const TargetRegisterClass *RC, Register VReg,
126 unsigned SubReg = 0,
127 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
128
133 int FrameIndex,
134 LiveIntervals *LIS = nullptr,
135 VirtRegMap *VRM = nullptr) const override;
136
140 LiveIntervals *LIS = nullptr) const override;
141
142 // Materializes the given integer Val into DstReg.
144 const DebugLoc &DL, Register DstReg, uint64_t Val,
146 bool DstRenamable = false, bool DstIsDead = false) const;
147
148 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
149
151 MachineBasicBlock *&FBB,
153 bool AllowModify) const override;
154
157 const DebugLoc &dl,
158 int *BytesAdded = nullptr) const override;
159
161 MachineBasicBlock &NewDestBB,
162 MachineBasicBlock &RestoreBB, const DebugLoc &DL,
163 int64_t BrOffset, RegScavenger *RS) const override;
164
166 int *BytesRemoved = nullptr) const override;
167
168 bool
170
171 bool optimizeCondBranch(MachineInstr &MI) const override;
172
173 MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
174
175 bool isBranchOffsetInRange(unsigned BranchOpc,
176 int64_t BrOffset) const override;
177
178 bool analyzeSelect(const MachineInstr &MI,
179 SmallVectorImpl<MachineOperand> &Cond, unsigned &TrueOp,
180 unsigned &FalseOp, bool &Optimizable) const override;
181
184 bool) const override;
185
186 bool isAsCheapAsAMove(const MachineInstr &MI) const override;
187
188 std::optional<DestSourcePair>
189 isCopyInstrImpl(const MachineInstr &MI) const override;
190
192 StringRef &ErrInfo) const override;
193
195 const MachineInstr &AddrI,
196 ExtAddrMode &AM) const override;
197
199 const ExtAddrMode &AM) const override;
200
203 int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width,
204 const TargetRegisterInfo *TRI) const override;
205
207 int64_t Offset1, bool OffsetIsScalable1,
209 int64_t Offset2, bool OffsetIsScalable2,
210 unsigned ClusterSize,
211 unsigned NumBytes) const override;
212
214 const MachineOperand *&BaseOp,
215 int64_t &Offset, LocationSize &Width,
216 const TargetRegisterInfo *TRI) const;
217
219 const MachineInstr &MIb) const override;
220
221
222 std::pair<unsigned, unsigned>
223 decomposeMachineOperandsTargetFlags(unsigned TF) const override;
224
227
228 // Return true if the function can safely be outlined from.
230 bool OutlineFromLinkOnceODRs) const override;
231
232 // Return true if MBB is safe to outline from, and return any target-specific
233 // information in Flags.
235 unsigned &Flags) const override;
236
238
240 // Calculate target-specific information for a set of outlining candidates.
241 std::optional<std::unique_ptr<outliner::OutlinedFunction>>
243 const MachineModuleInfo &MMI,
244 std::vector<outliner::Candidate> &RepeatedSequenceLocs,
245 unsigned MinRepeats) const override;
246
247 // Return if/how a given MachineInstr should be outlined.
250 unsigned Flags) const override;
251
252 // Insert a custom frame for outlined functions.
254 const outliner::OutlinedFunction &OF) const override;
255
256 // Insert a call to an outlined function into a given basic block.
260 outliner::Candidate &C) const override;
261
262 std::optional<RegImmPair> isAddImmediate(const MachineInstr &MI,
263 Register Reg) const override;
264
265 bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1,
266 unsigned &SrcOpIdx2) const override;
268 unsigned OpIdx1,
269 unsigned OpIdx2) const override;
270
271 bool simplifyInstruction(MachineInstr &MI) const override;
272
274 LiveIntervals *LIS) const override;
275
276 // MIR printer helper function to annotate Operands with a comment.
277 std::string
279 unsigned OpIdx,
280 const TargetRegisterInfo *TRI) const override;
281
282 /// Generate code to multiply the value in DestReg by Amt - handles all
283 /// the common optimizations for this idiom, and supports fallback for
284 /// subtargets which don't support multiply instructions.
287 Register DestReg, uint32_t Amt, MachineInstr::MIFlag Flag) const;
288
289 bool useMachineCombiner() const override { return true; }
290
292
293 CombinerObjective getCombinerObjective(unsigned Pattern) const override;
294
297 bool DoRegPressureReduce) const override;
298
299 void
300 finalizeInsInstrs(MachineInstr &Root, unsigned &Pattern,
301 SmallVectorImpl<MachineInstr *> &InsInstrs) const override;
302
304 MachineInstr &Root, unsigned Pattern,
307 DenseMap<Register, unsigned> &InstrIdxForVirtReg) const override;
308
309 bool hasReassociableOperands(const MachineInstr &Inst,
310 const MachineBasicBlock *MBB) const override;
311
312 bool hasReassociableSibling(const MachineInstr &Inst,
313 bool &Commuted) const override;
314
316 bool Invert) const override;
317
318 std::optional<unsigned> getInverseOpcode(unsigned Opcode) const override;
319
321 const MachineInstr &Root, unsigned Pattern,
322 std::array<unsigned, 5> &OperandIndices) const override;
323
326
327 unsigned getTailDuplicateSize(CodeGenOptLevel OptLevel) const override;
328
329 std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
330 analyzeLoopForPipelining(MachineBasicBlock *LoopBB) const override;
331
332 bool isHighLatencyDef(int Opc) const override;
333
334 /// Return true if \p MI is a COPY to a vector register of a specific \p LMul,
335 /// or any kind of vector registers when \p LMul is zero.
336 bool isVRegCopy(const MachineInstr *MI, unsigned LMul = 0) const;
337
338 /// Return true if pairing the given load or store may be paired with another.
339 static bool isPairableLdStInstOpc(unsigned Opc);
340
341 static bool isLdStSafeToPair(const MachineInstr &LdSt,
342 const TargetRegisterInfo *TRI);
343#define GET_INSTRINFO_HELPER_DECLS
344#include "RISCVGenInstrInfo.inc"
345
347
348 /// Return the result of the evaluation of C0 CC C1, where CC is a
349 /// RISCVCC::CondCode.
350 static bool evaluateCondBranch(RISCVCC::CondCode CC, int64_t C0, int64_t C1);
351
352 /// Return true if the operand is a load immediate instruction and
353 /// sets Imm to the immediate value.
354 static bool isFromLoadImm(const MachineRegisterInfo &MRI,
355 const MachineOperand &Op, int64_t &Imm);
356
357protected:
359
360private:
361 unsigned getInstBundleLength(const MachineInstr &MI) const;
362
363 bool isVectorAssociativeAndCommutative(const MachineInstr &MI,
364 bool Invert = false) const;
365 bool areRVVInstsReassociable(const MachineInstr &MI1,
366 const MachineInstr &MI2) const;
367 bool hasReassociableVectorSibling(const MachineInstr &Inst,
368 bool &Commuted) const;
369};
370
371namespace RISCV {
372
373// Returns true if the given MI is an RVV instruction opcode for which we may
374// expect to see a FrameIndex operand.
375bool isRVVSpill(const MachineInstr &MI);
376
377/// Return true if \p MI is a copy that will be lowered to one or more vmvNr.vs.
379
380std::optional<std::pair<unsigned, unsigned>>
381isRVVSpillForZvlsseg(unsigned Opcode);
382
383// Return true if both input instructions have equal rounding mode. If at least
384// one of the instructions does not have rounding mode, false will be returned.
385bool hasEqualFRM(const MachineInstr &MI1, const MachineInstr &MI2);
386
387// If \p Opcode is a .vx vector instruction, returns the lower number of bits
388// that are used from the scalar .x operand for a given \p Log2SEW. Otherwise
389// returns null.
390std::optional<unsigned> getVectorLowDemandedScalarBits(unsigned Opcode,
391 unsigned Log2SEW);
392
393// Returns the MC opcode of RVV pseudo instruction.
394unsigned getRVVMCOpcode(unsigned RVVPseudoOpcode);
395
396// For a (non-pseudo) RVV instruction \p Desc and the given \p Log2SEW, returns
397// the log2 EEW of the destination operand.
398unsigned getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW);
399
400// Special immediate for AVL operand of V pseudo instructions to indicate VLMax.
401static constexpr int64_t VLMaxSentinel = -1LL;
402
403/// Given two VL operands, do we know that LHS <= RHS?
404bool isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS);
405
406// Mask assignments for floating-point
407static constexpr unsigned FPMASK_Negative_Infinity = 0x001;
408static constexpr unsigned FPMASK_Negative_Normal = 0x002;
409static constexpr unsigned FPMASK_Negative_Subnormal = 0x004;
410static constexpr unsigned FPMASK_Negative_Zero = 0x008;
411static constexpr unsigned FPMASK_Positive_Zero = 0x010;
412static constexpr unsigned FPMASK_Positive_Subnormal = 0x020;
413static constexpr unsigned FPMASK_Positive_Normal = 0x040;
414static constexpr unsigned FPMASK_Positive_Infinity = 0x080;
415static constexpr unsigned FPMASK_Signaling_NaN = 0x100;
416static constexpr unsigned FPMASK_Quiet_NaN = 0x200;
417} // namespace RISCV
418
419namespace RISCVVPseudosTable {
420
428
429#define GET_RISCVVPseudosTable_DECL
430#include "RISCVGenSearchableTables.inc"
431
432} // end namespace RISCVVPseudosTable
433
434namespace RISCV {
435
441#define GET_RISCVMaskedPseudosTable_DECL
442#include "RISCVGenSearchableTables.inc"
443} // end namespace RISCV
444
445} // end namespace llvm
446#endif
unsigned SubReg
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
#define T
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:40
A debug info location.
Definition DebugLoc.h:123
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:41
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
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
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.
RISCVInstrInfo(const RISCVSubtarget &STI)
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DstReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, 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
bool isReMaterializableImpl(const MachineInstr &MI) const override
MachineInstr * optimizeSelect(MachineInstr &MI, SmallPtrSetImpl< MachineInstr * > &SeenMIs, bool) const override
bool isVRegCopy(const MachineInstr *MI, unsigned LMul=0) const
Return true if MI is a COPY to a vector register of a specific LMul, or any kind of vector registers ...
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 analyzeCandidate(outliner::Candidate &C) const
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
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
const RISCVRegisterInfo & getRegisterInfo() const
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:20
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...
LLVM Value Representation.
Definition Value.h:75
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
CondCode getInverseBranchCondition(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
bool isVectorCopy(const TargetRegisterInfo *TRI, const MachineInstr &MI)
Return true if MI is a copy that will be lowered to one or more vmvNr.vs.
InstrType
Represents how an instruction should be mapped by the outliner.
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
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
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
Definition bit.h:202
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
int isShifted359(T Value, int &Shift)
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.