LLVM 22.0.0git
RISCVInstrInfo.cpp File Reference

Go to the source code of this file.

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.
namespace  llvm::RISCVVPseudosTable
namespace  llvm::RISCV

Macros

#define GEN_CHECK_COMPRESS_INSTR
#define GET_INSTRINFO_CTOR_DTOR
#define GET_INSTRINFO_NAMED_OPS
#define DEBUG_TYPE   "riscv-instr-info"
#define GET_RISCVVPseudosTable_IMPL
#define GET_RISCVMaskedPseudosTable_IMPL
#define GET_INSTRINFO_HELPERS
#define OPCODE_LMUL_CASE(OPC)
#define OPCODE_LMUL_MASK_CASE(OPC)
#define RVV_OPC_LMUL_CASE(OPC, INV)
#define RVV_OPC_LMUL_MASK_CASE(OPC, INV)
#define CASE_OPERAND_UIMM(NUM)
#define CASE_OPERAND_SIMM(NUM)
#define CASE_RVV_OPCODE_UNMASK_LMUL(OP, LMUL)
#define CASE_RVV_OPCODE_MASK_LMUL(OP, LMUL)
#define CASE_RVV_OPCODE_LMUL(OP, LMUL)
#define CASE_RVV_OPCODE_UNMASK_WIDEN(OP)
#define CASE_RVV_OPCODE_UNMASK(OP)
#define CASE_RVV_OPCODE_MASK_WIDEN(OP)
#define CASE_RVV_OPCODE_MASK(OP)
#define CASE_RVV_OPCODE_WIDEN(OP)
#define CASE_RVV_OPCODE(OP)
#define CASE_VMA_OPCODE_COMMON(OP, TYPE, LMUL)
#define CASE_VMA_OPCODE_LMULS(OP, TYPE)
#define CASE_VFMA_OPCODE_COMMON(OP, TYPE, LMUL, SEW)
#define CASE_VFMA_OPCODE_LMULS_M1(OP, TYPE, SEW)
#define CASE_VFMA_OPCODE_LMULS_MF2(OP, TYPE, SEW)
#define CASE_VFMA_OPCODE_LMULS_MF4(OP, TYPE, SEW)
#define CASE_VFMA_OPCODE_VV(OP)
#define CASE_VFMA_SPLATS(OP)
#define CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, LMUL)
#define CASE_VMA_CHANGE_OPCODE_LMULS(OLDOP, NEWOP, TYPE)
#define CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, LMUL, SEW)
#define CASE_VFMA_CHANGE_OPCODE_LMULS_M1(OLDOP, NEWOP, TYPE, SEW)
#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF2(OLDOP, NEWOP, TYPE, SEW)
#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF4(OLDOP, NEWOP, TYPE, SEW)
#define CASE_VFMA_CHANGE_OPCODE_VV(OLDOP, NEWOP)
#define CASE_VFMA_CHANGE_OPCODE_SPLATS(OLDOP, NEWOP)
#define CASE_WIDEOP_OPCODE_COMMON(OP, LMUL)
#define CASE_WIDEOP_OPCODE_LMULS(OP)
#define CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, LMUL)
#define CASE_WIDEOP_CHANGE_OPCODE_LMULS(OP)
#define CASE_FP_WIDEOP_OPCODE_COMMON(OP, LMUL, SEW)
#define CASE_FP_WIDEOP_OPCODE_LMULS(OP)
#define CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, LMUL, SEW)
#define CASE_FP_WIDEOP_CHANGE_OPCODE_LMULS(OP)

Enumerations

enum  MachineOutlinerConstructionID { MachineOutlinerTailCall , MachineOutlinerDefault }

Functions

 STATISTIC (NumVRegSpilled, "Number of registers within vector register groups spilled")
 STATISTIC (NumVRegReloaded, "Number of registers within vector register groups reloaded")
static std::optional< unsignedgetLMULForRVVWholeLoadStore (unsigned Opcode)
static bool forwardCopyWillClobberTuple (unsigned DstReg, unsigned SrcReg, unsigned NumRegs)
static bool isConvertibleToVMV_V_V (const RISCVSubtarget &STI, const MachineBasicBlock &MBB, MachineBasicBlock::const_iterator MBBI, MachineBasicBlock::const_iterator &DefMBBI, RISCVVType::VLMUL LMul)
std::optional< unsignedgetFoldedOpcode (MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, const RISCVSubtarget &ST)
static void parseCondBranch (MachineInstr &LastInst, MachineBasicBlock *&Target, SmallVectorImpl< MachineOperand > &Cond)
static bool isLoadImm (const MachineInstr *MI, int64_t &Imm)
unsigned getPredicatedOpcode (unsigned Opcode)
static MachineInstrcanFoldAsPredicatedOp (Register Reg, const MachineRegisterInfo &MRI, const TargetInstrInfo *TII)
 Identify instructions that can be folded into a CCMOV instruction, and return the defining instruction.
static bool isFADD (unsigned Opc)
static bool isFSUB (unsigned Opc)
static bool isFMUL (unsigned Opc)
static bool canCombineFPFusedMultiply (const MachineInstr &Root, const MachineOperand &MO, bool DoRegPressureReduce)
static bool getFPFusedMultiplyPatterns (MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns, bool DoRegPressureReduce)
static bool getFPPatterns (MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns, bool DoRegPressureReduce)
static const MachineInstrcanCombine (const MachineBasicBlock &MBB, const MachineOperand &MO, unsigned CombineOpc)
 Utility routine that checks if.
static bool canCombineShiftIntoShXAdd (const MachineBasicBlock &MBB, const MachineOperand &MO, unsigned OuterShiftAmt)
 Utility routine that checks if.
static unsigned getSHXADDShiftAmount (unsigned Opc)
static unsigned getSHXADDUWShiftAmount (unsigned Opc)
static bool getSHXADDPatterns (const MachineInstr &Root, SmallVectorImpl< unsigned > &Patterns)
static unsigned getFPFusedMultiplyOpcode (unsigned RootOpc, unsigned Pattern)
static unsigned getAddendOperandIdx (unsigned Pattern)
static void combineFPFusedMultiply (MachineInstr &Root, MachineInstr &Prev, unsigned Pattern, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs)
static void genShXAddAddShift (MachineInstr &Root, unsigned AddOpIdx, SmallVectorImpl< MachineInstr * > &InsInstrs, SmallVectorImpl< MachineInstr * > &DelInstrs, DenseMap< Register, unsigned > &InstrIdxForVirtReg)
static bool memOpsHaveSameBasePtr (const MachineInstr &MI1, ArrayRef< const MachineOperand * > BaseOps1, const MachineInstr &MI2, ArrayRef< const MachineOperand * > BaseOps2)
static bool isCandidatePatchable (const MachineBasicBlock &MBB)
static bool isMIReadsReg (const MachineInstr &MI, const TargetRegisterInfo *TRI, MCRegister RegNo)
static bool isMIModifiesReg (const MachineInstr &MI, const TargetRegisterInfo *TRI, MCRegister RegNo)
static bool cannotInsertTailCall (const MachineBasicBlock &MBB)
static bool analyzeCandidate (outliner::Candidate &C)
static std::optional< int64_t > getEffectiveImm (const MachineOperand &MO)

Variables

static cl::opt< boolPreferWholeRegisterMove ("riscv-prefer-whole-register-move", cl::init(false), cl::Hidden, cl::desc("Prefer whole register move for vector registers."))
static cl::opt< MachineTraceStrategyForceMachineCombinerStrategy ("riscv-force-machine-combiner-strategy", cl::Hidden, cl::desc("Force machine combiner to use a specific strategy for machine " "trace metrics evaluation."), cl::init(MachineTraceStrategy::TS_NumStrategies), cl::values(clEnumValN(MachineTraceStrategy::TS_Local, "local", "Local strategy."), clEnumValN(MachineTraceStrategy::TS_MinInstrCount, "min-instr", "MinInstrCount strategy.")))

Macro Definition Documentation

◆ CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON

#define CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON ( OP,
LMUL,
SEW )
Value:
case RISCV::PseudoV##OP##_##LMUL##_##SEW##_TIED: \
NewOpc = RISCV::PseudoV##OP##_##LMUL##_##SEW; \
break;
#define _
#define OP(OPC)
Definition Instruction.h:46

Definition at line 4378 of file RISCVInstrInfo.cpp.

◆ CASE_FP_WIDEOP_CHANGE_OPCODE_LMULS

#define CASE_FP_WIDEOP_CHANGE_OPCODE_LMULS ( OP)
Value:
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, MF2, E16) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, MF2, E32) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, M1, E16) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, M1, E32) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, M2, E16) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, M2, E32) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, M4, E16) \
CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, M4, E32) \
#define CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON(OP, LMUL, SEW)
unsigned M1(unsigned Val)
Definition VE.h:377

Definition at line 4383 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().

◆ CASE_FP_WIDEOP_OPCODE_COMMON

#define CASE_FP_WIDEOP_OPCODE_COMMON ( OP,
LMUL,
SEW )
Value:
RISCV::PseudoV##OP##_##LMUL##_##SEW##_TIED

Definition at line 4364 of file RISCVInstrInfo.cpp.

◆ CASE_FP_WIDEOP_OPCODE_LMULS

#define CASE_FP_WIDEOP_OPCODE_LMULS ( OP)
Value:
case CASE_FP_WIDEOP_OPCODE_COMMON(OP, MF2, E16): \
case CASE_FP_WIDEOP_OPCODE_COMMON(OP, MF2, E32): \
case CASE_FP_WIDEOP_OPCODE_COMMON(OP, M2, E16): \
case CASE_FP_WIDEOP_OPCODE_COMMON(OP, M2, E32): \
case CASE_FP_WIDEOP_OPCODE_COMMON(OP, M4, E16): \
#define CASE_FP_WIDEOP_OPCODE_COMMON(OP, LMUL, SEW)

Definition at line 4367 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().

◆ CASE_OPERAND_SIMM

#define CASE_OPERAND_SIMM ( NUM)
Value:
case RISCVOp::OPERAND_SIMM##NUM: \
Ok = isInt<NUM>(Imm); \
break;
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
Definition MathExtras.h:174

Referenced by llvm::RISCVInstrInfo::verifyInstruction().

◆ CASE_OPERAND_UIMM

#define CASE_OPERAND_UIMM ( NUM)
Value:
case RISCVOp::OPERAND_UIMM##NUM: \
Ok = isUInt<NUM>(Imm); \
break;
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:198

Referenced by llvm::RISCVInstrInfo::verifyInstruction().

◆ CASE_RVV_OPCODE

#define CASE_RVV_OPCODE ( OP)
Value:
#define CASE_RVV_OPCODE_UNMASK(OP)
#define CASE_RVV_OPCODE_MASK(OP)

Definition at line 3701 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().

◆ CASE_RVV_OPCODE_LMUL

#define CASE_RVV_OPCODE_LMUL ( OP,
LMUL )
Value:
#define CASE_RVV_OPCODE_UNMASK_LMUL(OP, LMUL)
#define CASE_RVV_OPCODE_MASK_LMUL(OP, LMUL)

Definition at line 3669 of file RISCVInstrInfo.cpp.

◆ CASE_RVV_OPCODE_MASK

#define CASE_RVV_OPCODE_MASK ( OP)
Value:

Definition at line 3693 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().

◆ CASE_RVV_OPCODE_MASK_LMUL

#define CASE_RVV_OPCODE_MASK_LMUL ( OP,
LMUL )
Value:
RISCV::Pseudo##OP##_##LMUL##_MASK

Definition at line 3666 of file RISCVInstrInfo.cpp.

◆ CASE_RVV_OPCODE_MASK_WIDEN

#define CASE_RVV_OPCODE_MASK_WIDEN ( OP)

◆ CASE_RVV_OPCODE_UNMASK

#define CASE_RVV_OPCODE_UNMASK ( OP)
Value:

Definition at line 3681 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().

◆ CASE_RVV_OPCODE_UNMASK_LMUL

#define CASE_RVV_OPCODE_UNMASK_LMUL ( OP,
LMUL )
Value:
RISCV::Pseudo##OP##_##LMUL

Definition at line 3663 of file RISCVInstrInfo.cpp.

◆ CASE_RVV_OPCODE_UNMASK_WIDEN

#define CASE_RVV_OPCODE_UNMASK_WIDEN ( OP)

◆ CASE_RVV_OPCODE_WIDEN

#define CASE_RVV_OPCODE_WIDEN ( OP)

◆ CASE_VFMA_CHANGE_OPCODE_COMMON

#define CASE_VFMA_CHANGE_OPCODE_COMMON ( OLDOP,
NEWOP,
TYPE,
LMUL,
SEW )
Value:
case RISCV::PseudoV##OLDOP##_##TYPE##_##LMUL##_##SEW: \
Opc = RISCV::PseudoV##NEWOP##_##TYPE##_##LMUL##_##SEW; \
break;

Definition at line 3928 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_CHANGE_OPCODE_LMULS_M1

#define CASE_VFMA_CHANGE_OPCODE_LMULS_M1 ( OLDOP,
NEWOP,
TYPE,
SEW )
Value:
CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M1, SEW) \
CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M2, SEW) \
CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M4, SEW) \
CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M8, SEW)
#define CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, LMUL, SEW)

Definition at line 3933 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_CHANGE_OPCODE_LMULS_MF2

#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF2 ( OLDOP,
NEWOP,
TYPE,
SEW )
Value:
CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF2, SEW) \
CASE_VFMA_CHANGE_OPCODE_LMULS_M1(OLDOP, NEWOP, TYPE, SEW)

Definition at line 3939 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_CHANGE_OPCODE_LMULS_MF4

#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF4 ( OLDOP,
NEWOP,
TYPE,
SEW )
Value:
CASE_VFMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF4, SEW) \
CASE_VFMA_CHANGE_OPCODE_LMULS_MF2(OLDOP, NEWOP, TYPE, SEW)

Definition at line 3943 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_CHANGE_OPCODE_SPLATS

#define CASE_VFMA_CHANGE_OPCODE_SPLATS ( OLDOP,
NEWOP )
Value:
CASE_VFMA_CHANGE_OPCODE_LMULS_MF4(OLDOP, NEWOP, VFPR16, E16) \
CASE_VFMA_CHANGE_OPCODE_LMULS_MF2(OLDOP, NEWOP, VFPR32, E32) \
CASE_VFMA_CHANGE_OPCODE_LMULS_M1(OLDOP, NEWOP, VFPR64, E64)
#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF4(OLDOP, NEWOP, TYPE, SEW)

Definition at line 3952 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().

◆ CASE_VFMA_CHANGE_OPCODE_VV

#define CASE_VFMA_CHANGE_OPCODE_VV ( OLDOP,
NEWOP )
Value:
CASE_VFMA_CHANGE_OPCODE_LMULS_MF4(OLDOP, NEWOP, VV, E16) \
CASE_VFMA_CHANGE_OPCODE_LMULS_MF2(OLDOP, NEWOP, VV, E32) \
CASE_VFMA_CHANGE_OPCODE_LMULS_M1(OLDOP, NEWOP, VV, E64)

Definition at line 3947 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().

◆ CASE_VFMA_OPCODE_COMMON

#define CASE_VFMA_OPCODE_COMMON ( OP,
TYPE,
LMUL,
SEW )
Value:
RISCV::PseudoV##OP##_##TYPE##_##LMUL##_##SEW

Definition at line 3720 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_OPCODE_LMULS_M1

#define CASE_VFMA_OPCODE_LMULS_M1 ( OP,
TYPE,
SEW )
Value:
CASE_VFMA_OPCODE_COMMON(OP, TYPE, M1, SEW): \
case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M2, SEW): \
case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M4, SEW): \
case CASE_VFMA_OPCODE_COMMON(OP, TYPE, M8, SEW)
#define CASE_VFMA_OPCODE_COMMON(OP, TYPE, LMUL, SEW)

Definition at line 3723 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_OPCODE_LMULS_MF2

#define CASE_VFMA_OPCODE_LMULS_MF2 ( OP,
TYPE,
SEW )
Value:
CASE_VFMA_OPCODE_COMMON(OP, TYPE, MF2, SEW): \
case CASE_VFMA_OPCODE_LMULS_M1(OP, TYPE, SEW)
#define CASE_VFMA_OPCODE_LMULS_M1(OP, TYPE, SEW)

Definition at line 3729 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_OPCODE_LMULS_MF4

#define CASE_VFMA_OPCODE_LMULS_MF4 ( OP,
TYPE,
SEW )
Value:
CASE_VFMA_OPCODE_COMMON(OP, TYPE, MF4, SEW): \
case CASE_VFMA_OPCODE_LMULS_MF2(OP, TYPE, SEW)
#define CASE_VFMA_OPCODE_LMULS_MF2(OP, TYPE, SEW)

Definition at line 3733 of file RISCVInstrInfo.cpp.

◆ CASE_VFMA_OPCODE_VV

#define CASE_VFMA_OPCODE_VV ( OP)
Value:
case CASE_VFMA_OPCODE_LMULS_MF2(OP, VV, E32): \
#define CASE_VFMA_OPCODE_LMULS_MF4(OP, TYPE, SEW)

Definition at line 3737 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl(), and llvm::RISCVInstrInfo::findCommutedOpIndices().

◆ CASE_VFMA_SPLATS

#define CASE_VFMA_SPLATS ( OP)

◆ CASE_VMA_CHANGE_OPCODE_COMMON

#define CASE_VMA_CHANGE_OPCODE_COMMON ( OLDOP,
NEWOP,
TYPE,
LMUL )
Value:
case RISCV::PseudoV##OLDOP##_##TYPE##_##LMUL: \
Opc = RISCV::PseudoV##NEWOP##_##TYPE##_##LMUL; \
break;

Definition at line 3913 of file RISCVInstrInfo.cpp.

◆ CASE_VMA_CHANGE_OPCODE_LMULS

#define CASE_VMA_CHANGE_OPCODE_LMULS ( OLDOP,
NEWOP,
TYPE )
Value:
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF8) \
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF4) \
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, MF2) \
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M1) \
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M2) \
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M4) \
CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, M8)
#define CASE_VMA_CHANGE_OPCODE_COMMON(OLDOP, NEWOP, TYPE, LMUL)

Definition at line 3918 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().

◆ CASE_VMA_OPCODE_COMMON

#define CASE_VMA_OPCODE_COMMON ( OP,
TYPE,
LMUL )
Value:
RISCV::PseudoV##OP##_##TYPE##_##LMUL

Definition at line 3707 of file RISCVInstrInfo.cpp.

◆ CASE_VMA_OPCODE_LMULS

#define CASE_VMA_OPCODE_LMULS ( OP,
TYPE )
Value:
CASE_VMA_OPCODE_COMMON(OP, TYPE, MF8): \
case CASE_VMA_OPCODE_COMMON(OP, TYPE, MF4): \
case CASE_VMA_OPCODE_COMMON(OP, TYPE, MF2): \
case CASE_VMA_OPCODE_COMMON(OP, TYPE, M1): \
case CASE_VMA_OPCODE_COMMON(OP, TYPE, M2): \
case CASE_VMA_OPCODE_COMMON(OP, TYPE, M4): \
case CASE_VMA_OPCODE_COMMON(OP, TYPE, M8)
#define CASE_VMA_OPCODE_COMMON(OP, TYPE, LMUL)

Definition at line 3710 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl(), and llvm::RISCVInstrInfo::findCommutedOpIndices().

◆ CASE_WIDEOP_CHANGE_OPCODE_COMMON

#define CASE_WIDEOP_CHANGE_OPCODE_COMMON ( OP,
LMUL )
Value:
case RISCV::PseudoV##OP##_##LMUL##_TIED: \
NewOpc = RISCV::PseudoV##OP##_##LMUL; \
break;

Definition at line 4350 of file RISCVInstrInfo.cpp.

◆ CASE_WIDEOP_CHANGE_OPCODE_LMULS

#define CASE_WIDEOP_CHANGE_OPCODE_LMULS ( OP)
Value:
CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, MF4) \
CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, MF2) \
CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, M1) \
CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, M2) \
CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, M4)
#define CASE_WIDEOP_CHANGE_OPCODE_COMMON(OP, LMUL)

Definition at line 4355 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().

◆ CASE_WIDEOP_OPCODE_COMMON

#define CASE_WIDEOP_OPCODE_COMMON ( OP,
LMUL )
Value:
RISCV::PseudoV##OP##_##LMUL##_TIED

Definition at line 4339 of file RISCVInstrInfo.cpp.

◆ CASE_WIDEOP_OPCODE_LMULS

#define CASE_WIDEOP_OPCODE_LMULS ( OP)
Value:

Definition at line 4342 of file RISCVInstrInfo.cpp.

Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().

◆ DEBUG_TYPE

#define DEBUG_TYPE   "riscv-instr-info"

Definition at line 47 of file RISCVInstrInfo.cpp.

◆ GEN_CHECK_COMPRESS_INSTR

#define GEN_CHECK_COMPRESS_INSTR

Definition at line 40 of file RISCVInstrInfo.cpp.

◆ GET_INSTRINFO_CTOR_DTOR

#define GET_INSTRINFO_CTOR_DTOR

Definition at line 43 of file RISCVInstrInfo.cpp.

◆ GET_INSTRINFO_HELPERS

#define GET_INSTRINFO_HELPERS

Definition at line 87 of file RISCVInstrInfo.cpp.

◆ GET_INSTRINFO_NAMED_OPS

#define GET_INSTRINFO_NAMED_OPS

Definition at line 44 of file RISCVInstrInfo.cpp.

◆ GET_RISCVMaskedPseudosTable_IMPL

#define GET_RISCVMaskedPseudosTable_IMPL

Definition at line 78 of file RISCVInstrInfo.cpp.

◆ GET_RISCVVPseudosTable_IMPL

#define GET_RISCVVPseudosTable_IMPL

Definition at line 71 of file RISCVInstrInfo.cpp.

◆ OPCODE_LMUL_CASE

#define OPCODE_LMUL_CASE ( OPC)
Value:
case RISCV::OPC##_M1: \
case RISCV::OPC##_M2: \
case RISCV::OPC##_M4: \
case RISCV::OPC##_M8: \
case RISCV::OPC##_MF2: \
case RISCV::OPC##_MF4: \
case RISCV::OPC##_MF8

◆ OPCODE_LMUL_MASK_CASE

#define OPCODE_LMUL_MASK_CASE ( OPC)
Value:
case RISCV::OPC##_M1_MASK: \
case RISCV::OPC##_M2_MASK: \
case RISCV::OPC##_M4_MASK: \
case RISCV::OPC##_M8_MASK: \
case RISCV::OPC##_MF2_MASK: \
case RISCV::OPC##_MF4_MASK: \
case RISCV::OPC##_MF8_MASK

◆ RVV_OPC_LMUL_CASE

#define RVV_OPC_LMUL_CASE ( OPC,
INV )
Value:
case RISCV::OPC##_M1: \
return RISCV::INV##_M1; \
case RISCV::OPC##_M2: \
return RISCV::INV##_M2; \
case RISCV::OPC##_M4: \
return RISCV::INV##_M4; \
case RISCV::OPC##_M8: \
return RISCV::INV##_M8; \
case RISCV::OPC##_MF2: \
return RISCV::INV##_MF2; \
case RISCV::OPC##_MF4: \
return RISCV::INV##_MF4; \
case RISCV::OPC##_MF8: \
return RISCV::INV##_MF8

Referenced by llvm::RISCVInstrInfo::getInverseOpcode().

◆ RVV_OPC_LMUL_MASK_CASE

#define RVV_OPC_LMUL_MASK_CASE ( OPC,
INV )
Value:
case RISCV::OPC##_M1_MASK: \
return RISCV::INV##_M1_MASK; \
case RISCV::OPC##_M2_MASK: \
return RISCV::INV##_M2_MASK; \
case RISCV::OPC##_M4_MASK: \
return RISCV::INV##_M4_MASK; \
case RISCV::OPC##_M8_MASK: \
return RISCV::INV##_M8_MASK; \
case RISCV::OPC##_MF2_MASK: \
return RISCV::INV##_MF2_MASK; \
case RISCV::OPC##_MF4_MASK: \
return RISCV::INV##_MF4_MASK; \
case RISCV::OPC##_MF8_MASK: \
return RISCV::INV##_MF8_MASK

Referenced by llvm::RISCVInstrInfo::getInverseOpcode().

Enumeration Type Documentation

◆ MachineOutlinerConstructionID

Enumerator
MachineOutlinerTailCall 
MachineOutlinerDefault 

Definition at line 3388 of file RISCVInstrInfo.cpp.

Function Documentation

◆ analyzeCandidate()

◆ canCombine()

const MachineInstr * canCombine ( const MachineBasicBlock & MBB,
const MachineOperand & MO,
unsigned CombineOpc )
static

Utility routine that checks if.

Parameters
MOis defined by an
CombineOpcinstruction in the basic block
MBB

Definition at line 2496 of file RISCVInstrInfo.cpp.

References llvm::MachineOperand::getReg(), llvm::MachineOperand::isReg(), llvm::Register::isVirtual(), MBB, MI, and MRI.

◆ canCombineFPFusedMultiply()

◆ canCombineShiftIntoShXAdd()

bool canCombineShiftIntoShXAdd ( const MachineBasicBlock & MBB,
const MachineOperand & MO,
unsigned OuterShiftAmt )
static

Utility routine that checks if.

Parameters
MOis defined by a SLLI in
MBBthat can be combined by splitting across 2 SHXADD instructions. The first SHXADD shift amount is given by
OuterShiftAmt.

Definition at line 2517 of file RISCVInstrInfo.cpp.

References canCombine(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOperand(), and MBB.

Referenced by getSHXADDPatterns().

◆ canFoldAsPredicatedOp()

MachineInstr * canFoldAsPredicatedOp ( Register Reg,
const MachineRegisterInfo & MRI,
const TargetInstrInfo * TII )
static

Identify instructions that can be folded into a CCMOV instruction, and return the defining instruction.

Definition at line 1703 of file RISCVInstrInfo.cpp.

References llvm::drop_begin(), getPredicatedOpcode(), MI, MRI, Reg, and TII.

Referenced by llvm::RISCVInstrInfo::optimizeSelect().

◆ cannotInsertTailCall()

◆ combineFPFusedMultiply()

◆ forwardCopyWillClobberTuple()

bool forwardCopyWillClobberTuple ( unsigned DstReg,
unsigned SrcReg,
unsigned NumRegs )
static

Definition at line 250 of file RISCVInstrInfo.cpp.

◆ genShXAddAddShift()

◆ getAddendOperandIdx()

unsigned getAddendOperandIdx ( unsigned Pattern)
static

◆ getEffectiveImm()

◆ getFoldedOpcode()

◆ getFPFusedMultiplyOpcode()

unsigned getFPFusedMultiplyOpcode ( unsigned RootOpc,
unsigned Pattern )
static

Definition at line 2614 of file RISCVInstrInfo.cpp.

References llvm::FMSUB, and llvm_unreachable.

Referenced by combineFPFusedMultiply().

◆ getFPFusedMultiplyPatterns()

◆ getFPPatterns()

bool getFPPatterns ( MachineInstr & Root,
SmallVectorImpl< unsigned > & Patterns,
bool DoRegPressureReduce )
static

◆ getLMULForRVVWholeLoadStore()

std::optional< unsigned > getLMULForRVVWholeLoadStore ( unsigned Opcode)
static

◆ getPredicatedOpcode()

unsigned getPredicatedOpcode ( unsigned Opcode)

◆ getSHXADDPatterns()

◆ getSHXADDShiftAmount()

unsigned getSHXADDShiftAmount ( unsigned Opc)
static

◆ getSHXADDUWShiftAmount()

unsigned getSHXADDUWShiftAmount ( unsigned Opc)
static

Definition at line 2548 of file RISCVInstrInfo.cpp.

References Opc.

Referenced by llvm::RISCVInstrInfo::simplifyInstruction().

◆ isCandidatePatchable()

bool isCandidatePatchable ( const MachineBasicBlock & MBB)
static

Definition at line 3398 of file RISCVInstrInfo.cpp.

References F, llvm::MachineFunction::getFunction(), and MBB.

Referenced by cannotInsertTailCall().

◆ isConvertibleToVMV_V_V()

◆ isFADD()

bool isFADD ( unsigned Opc)
static

◆ isFMUL()

bool isFMUL ( unsigned Opc)
static

◆ isFSUB()

bool isFSUB ( unsigned Opc)
static

Definition at line 2051 of file RISCVInstrInfo.cpp.

References Opc.

Referenced by getFPFusedMultiplyPatterns().

◆ isLoadImm()

bool isLoadImm ( const MachineInstr * MI,
int64_t & Imm )
static

◆ isMIModifiesReg()

bool isMIModifiesReg ( const MachineInstr & MI,
const TargetRegisterInfo * TRI,
MCRegister RegNo )
static

Definition at line 3411 of file RISCVInstrInfo.cpp.

References MI, and TRI.

Referenced by analyzeCandidate(), cannotInsertTailCall(), and llvm::RISCVInstrInfo::getOutliningTypeImpl().

◆ isMIReadsReg()

bool isMIReadsReg ( const MachineInstr & MI,
const TargetRegisterInfo * TRI,
MCRegister RegNo )
static

Definition at line 3405 of file RISCVInstrInfo.cpp.

References MI, and TRI.

Referenced by cannotInsertTailCall().

◆ memOpsHaveSameBasePtr()

◆ parseCondBranch()

◆ STATISTIC() [1/2]

STATISTIC ( NumVRegReloaded ,
"Number of registers within vector register groups reloaded"  )

◆ STATISTIC() [2/2]

STATISTIC ( NumVRegSpilled ,
"Number of registers within vector register groups spilled"  )

Variable Documentation

◆ ForceMachineCombinerStrategy

cl::opt< MachineTraceStrategy > ForceMachineCombinerStrategy("riscv-force-machine-combiner-strategy", cl::Hidden, cl::desc("Force machine combiner to use a specific strategy for machine " "trace metrics evaluation."), cl::init(MachineTraceStrategy::TS_NumStrategies), cl::values(clEnumValN(MachineTraceStrategy::TS_Local, "local", "Local strategy."), clEnumValN(MachineTraceStrategy::TS_MinInstrCount, "min-instr", "MinInstrCount strategy."))) ( "riscv-force-machine-combiner-strategy" ,
cl::Hidden ,
cl::desc("Force machine combiner to use a specific strategy for machine " "trace metrics evaluation.") ,
cl::init(MachineTraceStrategy::TS_NumStrategies) ,
cl::values(clEnumValN(MachineTraceStrategy::TS_Local, "local", "Local strategy."), clEnumValN(MachineTraceStrategy::TS_MinInstrCount, "min-instr", "MinInstrCount strategy."))  )
static

◆ PreferWholeRegisterMove

cl::opt< bool > PreferWholeRegisterMove("riscv-prefer-whole-register-move", cl::init(false), cl::Hidden, cl::desc("Prefer whole register move for vector registers.")) ( "riscv-prefer-whole-register-move" ,
cl::init(false) ,
cl::Hidden ,
cl::desc("Prefer whole register move for vector registers.")  )
static

Referenced by isConvertibleToVMV_V_V().