|
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 4478 of file RISCVInstrInfo.cpp.
| #define CASE_FP_WIDEOP_CHANGE_OPCODE_LMULS | ( | OP | ) |
Definition at line 4483 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().
| #define CASE_FP_WIDEOP_CHANGE_OPCODE_LMULS_ALT | ( | OP | ) |
Definition at line 4501 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().
| #define CASE_FP_WIDEOP_OPCODE_COMMON | ( | OP, | |
| LMUL, | |||
| SEW ) |
Definition at line 4464 of file RISCVInstrInfo.cpp.
| #define CASE_FP_WIDEOP_OPCODE_LMULS | ( | OP | ) |
Definition at line 4467 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().
| #define CASE_FP_WIDEOP_OPCODE_LMULS_ALT | ( | OP | ) |
Definition at line 4494 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().
| #define CASE_OPERAND_SIMM | ( | NUM | ) |
Referenced by llvm::RISCVInstrInfo::verifyInstruction().
| #define CASE_OPERAND_UIMM | ( | NUM | ) |
Referenced by llvm::RISCVInstrInfo::verifyInstruction().
| #define CASE_RVV_OPCODE | ( | OP | ) |
Definition at line 3757 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().
| #define CASE_RVV_OPCODE_LMUL | ( | OP, | |
| LMUL ) |
Definition at line 3725 of file RISCVInstrInfo.cpp.
| #define CASE_RVV_OPCODE_MASK | ( | OP | ) |
Definition at line 3749 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().
| #define CASE_RVV_OPCODE_MASK_LMUL | ( | OP, | |
| LMUL ) |
Definition at line 3722 of file RISCVInstrInfo.cpp.
| #define CASE_RVV_OPCODE_MASK_WIDEN | ( | OP | ) |
Definition at line 3741 of file RISCVInstrInfo.cpp.
| #define CASE_RVV_OPCODE_UNMASK | ( | OP | ) |
Definition at line 3737 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().
| #define CASE_RVV_OPCODE_UNMASK_LMUL | ( | OP, | |
| LMUL ) |
Definition at line 3719 of file RISCVInstrInfo.cpp.
| #define CASE_RVV_OPCODE_UNMASK_WIDEN | ( | OP | ) |
Definition at line 3729 of file RISCVInstrInfo.cpp.
| #define CASE_RVV_OPCODE_WIDEN | ( | OP | ) |
Definition at line 3753 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::findCommutedOpIndices().
| #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 4009 of file RISCVInstrInfo.cpp.
| #define CASE_VFMA_CHANGE_OPCODE_LMULS_MF2 | ( | OLDOP, | |
| NEWOP, | |||
| TYPE, | |||
| SEW ) |
Definition at line 4015 of file RISCVInstrInfo.cpp.
| #define CASE_VFMA_CHANGE_OPCODE_LMULS_MF4 | ( | OLDOP, | |
| NEWOP, | |||
| TYPE, | |||
| SEW ) |
Definition at line 4019 of file RISCVInstrInfo.cpp.
| #define CASE_VFMA_CHANGE_OPCODE_SPLATS | ( | OLDOP, | |
| NEWOP ) |
Definition at line 4029 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().
| #define CASE_VFMA_CHANGE_OPCODE_VV | ( | OLDOP, | |
| NEWOP ) |
Definition at line 4023 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().
| #define CASE_VFMA_OPCODE_COMMON | ( | OP, | |
| TYPE, | |||
| LMUL, | |||
| SEW ) |
| #define CASE_VFMA_OPCODE_LMULS_M1 | ( | OP, | |
| TYPE, | |||
| SEW ) |
Definition at line 3779 of file RISCVInstrInfo.cpp.
| #define CASE_VFMA_OPCODE_LMULS_MF2 | ( | OP, | |
| TYPE, | |||
| SEW ) |
Definition at line 3785 of file RISCVInstrInfo.cpp.
| #define CASE_VFMA_OPCODE_LMULS_MF4 | ( | OP, | |
| TYPE, | |||
| SEW ) |
Definition at line 3789 of file RISCVInstrInfo.cpp.
| #define CASE_VFMA_OPCODE_VV | ( | OP | ) |
Definition at line 3793 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl(), and llvm::RISCVInstrInfo::findCommutedOpIndices().
| #define CASE_VFMA_SPLATS | ( | OP | ) |
Definition at line 3799 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl(), and llvm::RISCVInstrInfo::findCommutedOpIndices().
| #define CASE_VMA_CHANGE_OPCODE_COMMON | ( | OLDOP, | |
| NEWOP, | |||
| TYPE, | |||
| LMUL ) |
| #define CASE_VMA_CHANGE_OPCODE_LMULS | ( | OLDOP, | |
| NEWOP, | |||
| TYPE ) |
Definition at line 3994 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().
| #define CASE_VMA_OPCODE_COMMON | ( | OP, | |
| TYPE, | |||
| LMUL ) |
Definition at line 3763 of file RISCVInstrInfo.cpp.
| #define CASE_VMA_OPCODE_LMULS | ( | OP, | |
| TYPE ) |
Definition at line 3766 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl(), and llvm::RISCVInstrInfo::findCommutedOpIndices().
| #define CASE_WIDEOP_CHANGE_OPCODE_COMMON | ( | OP, | |
| LMUL ) |
| #define CASE_WIDEOP_CHANGE_OPCODE_LMULS | ( | OP | ) |
Definition at line 4455 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().
| #define CASE_WIDEOP_OPCODE_COMMON | ( | OP, | |
| LMUL ) |
Definition at line 4439 of file RISCVInstrInfo.cpp.
| #define CASE_WIDEOP_OPCODE_LMULS | ( | OP | ) |
Definition at line 4442 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::convertToThreeAddress().
| #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 ) |
Referenced by llvm::RISCVInstrInfo::getInverseOpcode().
| #define RVV_OPC_LMUL_MASK_CASE | ( | OPC, | |
| INV ) |
Referenced by llvm::RISCVInstrInfo::getInverseOpcode().
| Enumerator | |
|---|---|
| MachineOutlinerTailCall | |
| MachineOutlinerDefault | |
Definition at line 3439 of file RISCVInstrInfo.cpp.
|
static |
Definition at line 3489 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 2544 of file RISCVInstrInfo.cpp.
References llvm::MachineOperand::getReg(), llvm::MachineOperand::isReg(), llvm::Register::isVirtual(), MBB, MI, and MRI.
|
static |
Definition at line 2486 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 2565 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 1741 of file RISCVInstrInfo.cpp.
References llvm::drop_begin(), getPredicatedOpcode(), MI, MRI, Reg, and TII.
Referenced by llvm::RISCVInstrInfo::optimizeSelect().
|
static |
Definition at line 3468 of file RISCVInstrInfo.cpp.
References llvm::MCSubtargetInfo::getFeatureBits(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::RISCVII::getTailExpandUseRegNo(), isCandidatePatchable(), isMIModifiesReg(), isMIReadsReg(), MBB, and MI.
Referenced by analyzeCandidate(), and llvm::RISCVInstrInfo::getOutliningTypeImpl().
|
static |
Definition at line 2697 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().
Definition at line 250 of file RISCVInstrInfo.cpp.
|
static |
Definition at line 2743 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 2684 of file RISCVInstrInfo.cpp.
References llvm::FMADD_AX, llvm::FMADD_XA, llvm::FMSUB, llvm::FNMSUB, and llvm_unreachable.
Referenced by combineFPFusedMultiply().
|
static |
Definition at line 4942 of file RISCVInstrInfo.cpp.
References assert(), llvm::MachineOperand::getImm(), llvm::MachineInstr::getMF(), llvm::MachineOperand::getParent(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), llvm::MachineRegisterInfo::getVRegDef(), llvm::MachineOperand::isImm(), isLoadImm(), and llvm::Register::isVirtual().
Referenced by llvm::RISCV::isVLKnownLE().
| std::optional< unsigned > getFoldedOpcode | ( | MachineFunction & | MF, |
| MachineInstr & | MI, | ||
| ArrayRef< unsigned > | Ops, | ||
| const RISCVSubtarget & | ST ) |
Definition at line 802 of file RISCVInstrInfo.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, llvm::MachineFunction::getDataLayout(), llvm::RISCV::getRVVMCOpcode(), llvm::RISCVII::getSEWOpNum(), llvm::DataLayout::isBigEndian(), llvm_unreachable, and MI.
Referenced by llvm::RISCVInstrInfo::foldMemoryOperandImpl().
Definition at line 2662 of file RISCVInstrInfo.cpp.
References llvm::FMSUB, and llvm_unreachable.
Referenced by combineFPFusedMultiply().
|
static |
Definition at line 2513 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 2536 of file RISCVInstrInfo.cpp.
References getFPFusedMultiplyPatterns().
Referenced by llvm::RISCVInstrInfo::getMachineCombinerPatterns().
Definition at line 1026 of file RISCVInstrInfo.cpp.
References llvm_unreachable.
Referenced by llvm::RISCVInstrInfo::commuteInstructionImpl().
Definition at line 105 of file RISCVInstrInfo.cpp.
Referenced by llvm::RISCVInstrInfo::isLoadFromStackSlot(), llvm::RISCV::isRVVSpill(), and llvm::RISCVInstrInfo::isStoreToStackSlot().
Definition at line 1691 of file RISCVInstrInfo.cpp.
Referenced by canFoldAsPredicatedOp(), and llvm::RISCVInstrInfo::optimizeSelect().
|
static |
Definition at line 2611 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 2581 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by genShXAddAddShift(), getSHXADDPatterns(), and llvm::RISCVInstrInfo::simplifyInstruction().
Definition at line 2596 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by llvm::RISCVInstrInfo::simplifyInstruction().
|
static |
Definition at line 3449 of file RISCVInstrInfo.cpp.
References F, llvm::MachineFunction::getFunction(), and MBB.
Referenced by cannotInsertTailCall().
|
static |
Definition at line 255 of file RISCVInstrInfo.cpp.
References assert(), 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 2088 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by getFPFusedMultiplyPatterns(), and llvm::RISCVInstrInfo::isAssociativeAndCommutative().
Definition at line 2110 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by canCombineFPFusedMultiply(), and llvm::RISCVInstrInfo::isAssociativeAndCommutative().
Definition at line 2099 of file RISCVInstrInfo.cpp.
References Opc.
Referenced by getFPFusedMultiplyPatterns().
|
static |
Definition at line 1487 of file RISCVInstrInfo.cpp.
References MI.
Referenced by getEffectiveImm(), llvm::RISCVInstrInfo::isFromLoadImm(), and llvm::RISCVInstrInfo::optimizeCondBranch().
|
static |
Definition at line 3462 of file RISCVInstrInfo.cpp.
Referenced by analyzeCandidate(), cannotInsertTailCall(), and llvm::RISCVInstrInfo::getOutliningTypeImpl().
|
static |
Definition at line 3456 of file RISCVInstrInfo.cpp.
Referenced by cannotInsertTailCall().
|
static |
Definition at line 3266 of file RISCVInstrInfo.cpp.
References llvm::ArrayRef< T >::front(), llvm::getUnderlyingObject(), llvm::MachineInstr::hasOneMemOperand(), llvm::isa(), and llvm::MachineInstr::memoperands_begin().
|
static |
Definition at line 1015 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().