LLVM 22.0.0git
|
#include "RISCVInstrInfo.h"
#include "MCTargetDesc/RISCVBaseInfo.h"
#include "MCTargetDesc/RISCVMatInt.h"
#include "RISCV.h"
#include "RISCVMachineFunctionInfo.h"
#include "RISCVSubtarget.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/MemoryLocation.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/LiveIntervals.h"
#include "llvm/CodeGen/LiveVariables.h"
#include "llvm/CodeGen/MachineCombinerPattern.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/MachineTraceMetrics.h"
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/CodeGen/StackMaps.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/Module.h"
#include "llvm/MC/MCInstBuilder.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Support/ErrorHandling.h"
#include "RISCVGenCompressInstEmitter.inc"
#include "RISCVGenInstrInfo.inc"
#include "RISCVGenSearchableTables.inc"
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 |
Enumerations | |
enum | MachineOutlinerConstructionID { MachineOutlinerTailCall , MachineOutlinerDefault } |
Variables | |
static cl::opt< bool > | PreferWholeRegisterMove ("riscv-prefer-whole-register-move", cl::init(false), cl::Hidden, cl::desc("Prefer whole register move for vector registers.")) |
static 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."))) |
#define CASE_FP_WIDEOP_CHANGE_OPCODE_COMMON | ( | OP, | |
LMUL, | |||
SEW | |||
) |
Definition at line 4352 of file RISCVInstrInfo.cpp.
#define CASE_FP_WIDEOP_CHANGE_OPCODE_LMULS | ( | OP | ) |
Definition at line 4357 of file RISCVInstrInfo.cpp.
Definition at line 4338 of file RISCVInstrInfo.cpp.
#define CASE_FP_WIDEOP_OPCODE_LMULS | ( | OP | ) |
Definition at line 4341 of file RISCVInstrInfo.cpp.
#define CASE_OPERAND_SIMM | ( | NUM | ) |
#define CASE_OPERAND_UIMM | ( | NUM | ) |
#define CASE_RVV_OPCODE | ( | OP | ) |
Definition at line 3675 of file RISCVInstrInfo.cpp.
#define CASE_RVV_OPCODE_LMUL | ( | OP, | |
LMUL | |||
) |
Definition at line 3643 of file RISCVInstrInfo.cpp.
#define CASE_RVV_OPCODE_MASK | ( | OP | ) |
Definition at line 3667 of file RISCVInstrInfo.cpp.
Definition at line 3640 of file RISCVInstrInfo.cpp.
#define CASE_RVV_OPCODE_MASK_WIDEN | ( | OP | ) |
Definition at line 3659 of file RISCVInstrInfo.cpp.
#define CASE_RVV_OPCODE_UNMASK | ( | OP | ) |
Definition at line 3655 of file RISCVInstrInfo.cpp.
Definition at line 3637 of file RISCVInstrInfo.cpp.
#define CASE_RVV_OPCODE_UNMASK_WIDEN | ( | OP | ) |
Definition at line 3647 of file RISCVInstrInfo.cpp.
#define CASE_RVV_OPCODE_WIDEN | ( | OP | ) |
Definition at line 3671 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_CHANGE_OPCODE_COMMON | ( | OLDOP, | |
NEWOP, | |||
TYPE, | |||
LMUL, | |||
SEW | |||
) |
#define CASE_VFMA_CHANGE_OPCODE_LMULS_M1 | ( | OLDOP, | |
NEWOP, | |||
TYPE, | |||
SEW | |||
) |
Definition at line 3907 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF2 | ( | OLDOP, | |
NEWOP, | |||
TYPE, | |||
SEW | |||
) |
Definition at line 3913 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_CHANGE_OPCODE_LMULS_MF4 | ( | OLDOP, | |
NEWOP, | |||
TYPE, | |||
SEW | |||
) |
Definition at line 3917 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_CHANGE_OPCODE_SPLATS | ( | OLDOP, | |
NEWOP | |||
) |
Definition at line 3926 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_CHANGE_OPCODE_VV | ( | OLDOP, | |
NEWOP | |||
) |
Definition at line 3921 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_OPCODE_COMMON | ( | OP, | |
TYPE, | |||
LMUL, | |||
SEW | |||
) | RISCV::PseudoV##OP##_##TYPE##_##LMUL##_##SEW |
Definition at line 3694 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_OPCODE_LMULS_M1 | ( | OP, | |
TYPE, | |||
SEW | |||
) |
Definition at line 3697 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_OPCODE_LMULS_MF2 | ( | OP, | |
TYPE, | |||
SEW | |||
) |
Definition at line 3703 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_OPCODE_LMULS_MF4 | ( | OP, | |
TYPE, | |||
SEW | |||
) |
Definition at line 3707 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_OPCODE_VV | ( | OP | ) |
Definition at line 3711 of file RISCVInstrInfo.cpp.
#define CASE_VFMA_SPLATS | ( | OP | ) |
Definition at line 3716 of file RISCVInstrInfo.cpp.
#define CASE_VMA_CHANGE_OPCODE_COMMON | ( | OLDOP, | |
NEWOP, | |||
TYPE, | |||
LMUL | |||
) |
#define CASE_VMA_CHANGE_OPCODE_LMULS | ( | OLDOP, | |
NEWOP, | |||
TYPE | |||
) |
Definition at line 3892 of file RISCVInstrInfo.cpp.
Definition at line 3681 of file RISCVInstrInfo.cpp.
#define CASE_VMA_OPCODE_LMULS | ( | OP, | |
TYPE | |||
) |
Definition at line 3684 of file RISCVInstrInfo.cpp.
#define CASE_WIDEOP_CHANGE_OPCODE_COMMON | ( | OP, | |
LMUL | |||
) |
#define CASE_WIDEOP_CHANGE_OPCODE_LMULS | ( | OP | ) |
Definition at line 4329 of file RISCVInstrInfo.cpp.
Definition at line 4313 of file RISCVInstrInfo.cpp.
#define CASE_WIDEOP_OPCODE_LMULS | ( | OP | ) |
Definition at line 4316 of file RISCVInstrInfo.cpp.
#define DEBUG_TYPE "riscv-instr-info" |
Definition at line 47 of file RISCVInstrInfo.cpp.
#define GEN_CHECK_COMPRESS_INSTR |
Definition at line 40 of file RISCVInstrInfo.cpp.
#define GET_INSTRINFO_CTOR_DTOR |
Definition at line 43 of file RISCVInstrInfo.cpp.
#define GET_INSTRINFO_HELPERS |
Definition at line 87 of file RISCVInstrInfo.cpp.
#define GET_INSTRINFO_NAMED_OPS |
Definition at line 44 of file RISCVInstrInfo.cpp.
#define GET_RISCVMaskedPseudosTable_IMPL |
Definition at line 78 of file RISCVInstrInfo.cpp.
#define GET_RISCVVPseudosTable_IMPL |
Definition at line 71 of file RISCVInstrInfo.cpp.
#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 | |||
) |
Enumerator | |
---|---|
MachineOutlinerTailCall | |
MachineOutlinerDefault |
Definition at line 3365 of file RISCVInstrInfo.cpp.
|
static |
Definition at line 3415 of file RISCVInstrInfo.cpp.
References llvm::any_of(), assert(), llvm::CallingConv::C, cannotInsertTailCall(), isMIModifiesReg(), MI, and TRI.
Referenced by llvm::RISCVInstrInfo::getOutliningCandidateInfo().
|
static |
Utility routine that checks if.
MO | is defined by an |
CombineOpc | instruction in the basic block |
MBB |
Definition at line 2476 of file RISCVInstrInfo.cpp.
References llvm::MachineBasicBlock::getParent(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), llvm::MachineOperand::isReg(), llvm::Register::isVirtual(), MBB, MI, and MRI.
|
static |
Definition at line 2418 of file RISCVInstrInfo.cpp.
References llvm::MachineInstr::FmContract, llvm::MachineInstr::getFlag(), llvm::MachineInstr::getMF(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), llvm::RISCV::hasEqualFRM(), isFMUL(), llvm::MachineOperand::isReg(), llvm::Register::isVirtual(), MI, and MRI.
Referenced by getFPFusedMultiplyPatterns().
|
static |
Utility routine that checks if.
MO | is defined by a SLLI in |
MBB | that can be combined by splitting across 2 SHXADD instructions. The first SHXADD shift amount is given by |
OuterShiftAmt. |
Definition at line 2497 of file RISCVInstrInfo.cpp.
References canCombine(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getOperand(), and MBB.
Referenced by getSHXADDPatterns().
|
static |
Identify instructions that can be folded into a CCMOV instruction, and return the defining instruction.
Definition at line 1683 of file RISCVInstrInfo.cpp.
References llvm::drop_begin(), getPredicatedOpcode(), MI, and MRI.
Referenced by llvm::RISCVInstrInfo::optimizeSelect().
|
static |
Definition at line 3394 of file RISCVInstrInfo.cpp.
References llvm::MachineBasicBlock::back(), llvm::MCSubtargetInfo::getFeatureBits(), llvm::MachineBasicBlock::getParent(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::MachineFunction::getSubtarget(), llvm::RISCVII::getTailExpandUseRegNo(), isCandidatePatchable(), isMIModifiesReg(), isMIReadsReg(), llvm::MachineInstr::isReturn(), MBB, and MI.
Referenced by analyzeCandidate(), and llvm::RISCVInstrInfo::getOutliningTypeImpl().
|
static |
Definition at line 2629 of file RISCVInstrInfo.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), getAddendOperandIdx(), llvm::MachineInstr::getDebugLoc(), llvm::MachineInstr::getFlags(), getFPFusedMultiplyOpcode(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::DILocation::getMergedLocation(), llvm::MachineInstr::getMF(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), llvm::MachineFunction::getSubtarget(), llvm::MachineOperand::isKill(), MRI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::MachineInstrBuilder::setMIFlags(), and TII.
Referenced by llvm::RISCVInstrInfo::genAlternativeCodeSequence().
|
static |
Definition at line 250 of file RISCVInstrInfo.cpp.
|
static |
Definition at line 2675 of file RISCVInstrInfo.cpp.
References llvm::MachineInstrBuilder::addReg(), assert(), llvm::BuildMI(), llvm::MachineOperand::getImm(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::MachineInstr::getMF(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), getSHXADDShiftAmount(), llvm::MachineFunction::getSubtarget(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::RegState::Kill, llvm_unreachable, MRI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), TII, X, and Y.
Referenced by llvm::RISCVInstrInfo::genAlternativeCodeSequence().
Definition at line 2616 of file RISCVInstrInfo.cpp.
References llvm::FMADD_AX, llvm::FMADD_XA, llvm::FMSUB, llvm::FNMSUB, and llvm_unreachable.
Referenced by combineFPFusedMultiply().
std::optional< unsigned > getFoldedOpcode | ( | MachineFunction & | MF, |
MachineInstr & | MI, | ||
ArrayRef< unsigned > | Ops, | ||
const RISCVSubtarget & | ST | ||
) |
Definition at line 802 of file RISCVInstrInfo.cpp.
References llvm::MachineFunction::getDataLayout(), llvm::RISCV::getRVVMCOpcode(), llvm::RISCVII::getSEWOpNum(), llvm::DataLayout::isBigEndian(), llvm_unreachable, MI, and llvm::ArrayRef< T >::size().
Referenced by llvm::RISCVInstrInfo::foldMemoryOperandImpl().
Definition at line 2594 of file RISCVInstrInfo.cpp.
References llvm::FMSUB, and llvm_unreachable.
Referenced by combineFPFusedMultiply().
|
static |
Definition at line 2445 of file RISCVInstrInfo.cpp.
References canCombineFPFusedMultiply(), llvm::FMADD_AX, llvm::FMADD_XA, llvm::FMSUB, llvm::FNMSUB, llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), isFADD(), isFSUB(), Opc, and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by getFPPatterns().
|
static |
Definition at line 2468 of file RISCVInstrInfo.cpp.
References getFPFusedMultiplyPatterns().
Referenced by llvm::RISCVInstrInfo::getMachineCombinerPatterns().
Definition at line 105 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::isLoadFromStackSlot(), llvm::RISCV::isRVVSpill(), and llvm::RISCVInstrInfo::isStoreToStackSlot().
Definition at line 1640 of file RISCVInstrInfo.cpp.
Referenced by canFoldAsPredicatedOp(), and llvm::RISCVInstrInfo::optimizeSelect().
|
static |
Definition at line 2543 of file RISCVInstrInfo.cpp.
References canCombine(), canCombineShiftIntoShXAdd(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), getSHXADDShiftAmount(), MBB, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SHXADD_ADD_SLLI_OP1, and llvm::SHXADD_ADD_SLLI_OP2.
Referenced by llvm::RISCVInstrInfo::getMachineCombinerPatterns().
Definition at line 2513 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by genShXAddAddShift(), getSHXADDPatterns(), and llvm::RISCVInstrInfo::simplifyInstruction().
Definition at line 2528 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by llvm::RISCVInstrInfo::simplifyInstruction().
|
static |
Definition at line 3375 of file RISCVInstrInfo.cpp.
References F, llvm::MachineFunction::getFunction(), llvm::MachineBasicBlock::getParent(), and MBB.
Referenced by cannotInsertTailCall().
|
static |
Definition at line 255 of file RISCVInstrInfo.cpp.
References assert(), llvm::MachineBasicBlock::begin(), llvm::RISCVSubtarget::getRegisterInfo(), llvm::RISCVVType::getSEW(), llvm::RISCVVType::getVLMUL(), llvm::RISCVII::hasSEWOp(), llvm::RISCVII::hasVLOp(), llvm::RISCVII::isRVVWideningReduction(), llvm::RISCVVType::isTailAgnostic(), MBB, MBBI, PreferWholeRegisterMove, and TRI.
Referenced by llvm::RISCVInstrInfo::copyPhysRegVector().
Definition at line 2020 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by getFPFusedMultiplyPatterns(), and llvm::RISCVInstrInfo::isAssociativeAndCommutative().
Definition at line 2042 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by canCombineFPFusedMultiply(), and llvm::RISCVInstrInfo::isAssociativeAndCommutative().
Definition at line 2031 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by getFPFusedMultiplyPatterns().
|
static |
Definition at line 1438 of file RISCVInstrInfo.cpp.
References MI.
Referenced by llvm::RISCVInstrInfo::isFromLoadImm(), and llvm::RISCVInstrInfo::optimizeCondBranch().
|
static |
Definition at line 3388 of file RISCVInstrInfo.cpp.
Referenced by analyzeCandidate(), cannotInsertTailCall(), and llvm::RISCVInstrInfo::getOutliningTypeImpl().
|
static |
Definition at line 3382 of file RISCVInstrInfo.cpp.
Referenced by cannotInsertTailCall().
|
static |
Definition at line 3192 of file RISCVInstrInfo.cpp.
References llvm::ArrayRef< T >::front(), llvm::getUnderlyingObject(), llvm::MachineInstr::hasOneMemOperand(), and llvm::MachineInstr::memoperands_begin().
|
static |
Definition at line 1013 of file RISCVInstrInfo.cpp.
References assert(), Cond, llvm::MachineOperand::CreateImm(), llvm::MachineInstr::getDesc(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), and llvm::MCInstrDesc::isConditionalBranch().
STATISTIC | ( | NumVRegReloaded | , |
"Number of registers within vector register groups reloaded" | |||
) |
STATISTIC | ( | NumVRegSpilled | , |
"Number of registers within vector register groups spilled" | |||
) |
|
static |
Referenced by llvm::RISCVInstrInfo::getMachineCombinerTraceStrategy().
|
static |
Referenced by isConvertibleToVMV_V_V().