LLVM 22.0.0git
|
#include "RISCVISelDAGToDAG.h"
#include "MCTargetDesc/RISCVBaseInfo.h"
#include "MCTargetDesc/RISCVMCTargetDesc.h"
#include "MCTargetDesc/RISCVMatInt.h"
#include "RISCVISelLowering.h"
#include "RISCVInstrInfo.h"
#include "RISCVSelectionDAGInfo.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/SDPatternMatch.h"
#include "llvm/IR/IntrinsicsRISCV.h"
#include "llvm/Support/Alignment.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "RISCVGenDAGISel.inc"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "riscv-isel" |
#define | PASS_NAME "RISC-V DAG->DAG Pattern Instruction Selection" |
#define | GET_DAGISEL_BODY RISCVDAGToDAGISel |
#define | INST_NF_CASE(NAME, NF) |
#define | INST_NF_CASE_MASK(NAME, NF) |
#define | INST_NF_CASE_FF(NAME, NF) |
#define | INST_NF_CASE_FF_MASK(NAME, NF) |
#define | INST_ALL_NF_CASE_BASE(MACRO_NAME, NAME) |
#define | INST_ALL_NF_CASE(NAME) |
#define | INST_ALL_NF_CASE_WITH_FF(NAME) |
#define | CASE_VMSLT_OPCODES(lmulenum, suffix) |
#define | CASE_VMNAND_VMSET_OPCODES(lmulenum, suffix) |
#define | CASE_VMSLT_OPCODES(lmulenum, suffix) |
#define | CASE_VMXOR_VMANDN_VMOR_OPCODES(lmulenum, suffix) |
Variables | |
static cl::opt< bool > | UsePseudoMovImm ("riscv-use-rematerializable-movimm", cl::Hidden, cl::desc("Use a rematerializable pseudoinstruction for 2 instruction " "constant materialization"), cl::init(false)) |
#define CASE_VMNAND_VMSET_OPCODES | ( | lmulenum, | |
suffix | |||
) |
#define CASE_VMSLT_OPCODES | ( | lmulenum, | |
suffix | |||
) |
#define CASE_VMSLT_OPCODES | ( | lmulenum, | |
suffix | |||
) |
#define CASE_VMXOR_VMANDN_VMOR_OPCODES | ( | lmulenum, | |
suffix | |||
) |
#define DEBUG_TYPE "riscv-isel" |
Definition at line 30 of file RISCVISelDAGToDAG.cpp.
#define GET_DAGISEL_BODY RISCVDAGToDAGISel |
Definition at line 39 of file RISCVISelDAGToDAG.cpp.
#define INST_ALL_NF_CASE | ( | NAME | ) |
#define INST_ALL_NF_CASE_BASE | ( | MACRO_NAME, | |
NAME | |||
) |
#define INST_ALL_NF_CASE_WITH_FF | ( | NAME | ) |
#define INST_NF_CASE | ( | NAME, | |
NF | |||
) |
#define INST_NF_CASE_FF | ( | NAME, | |
NF | |||
) |
#define INST_NF_CASE_FF_MASK | ( | NAME, | |
NF | |||
) |
#define INST_NF_CASE_MASK | ( | NAME, | |
NF | |||
) |
#define PASS_NAME "RISC-V DAG->DAG Pattern Instruction Selection" |
Definition at line 31 of file RISCVISelDAGToDAG.cpp.
Definition at line 4038 of file RISCVISelDAGToDAG.cpp.
References assert(), llvm::ISD::INSERT_SUBVECTOR, N, and llvm::Splat.
Referenced by llvm::RISCVDAGToDAGISel::selectVSplat(), llvm::RISCVDAGToDAGISel::selectVSplatImm64Neg(), and selectVSplatImmHelper().
Definition at line 1041 of file RISCVISelDAGToDAG.cpp.
References INST_ALL_NF_CASE, INST_ALL_NF_CASE_WITH_FF, and llvm_unreachable.
Referenced by llvm::RISCVDAGToDAGISel::Select().
Definition at line 4299 of file RISCVISelDAGToDAG.cpp.
References I, and isImplicitDef().
Referenced by isImplicitDef().
|
static |
Return true if this a load/store that we have a RegRegScale instruction for.
Definition at line 3139 of file RISCVISelDAGToDAG.cpp.
References llvm::Add, llvm::EVT::isScalarInteger(), llvm::ISD::LOAD, and llvm::ISD::STORE.
Referenced by isWorthFoldingIntoRegRegScale().
Definition at line 2925 of file RISCVISelDAGToDAG.cpp.
References llvm::Add, llvm::ISD::ATOMIC_LOAD, llvm::ISD::ATOMIC_STORE, llvm::User::getOperand(), llvm::EVT::isScalarInteger(), llvm::isStrongerThanMonotonic(), llvm::ISD::LOAD, and llvm::ISD::STORE.
Referenced by llvm::RISCVDAGToDAGISel::SelectAddrRegImm().
|
static |
Is it profitable to fold this Add into RegRegScale load/store.
If Shift
is non-null, then we have matched a shl+add. We allow reassociating (add (add (shl A C2) B) C1) -> (add (add B C1) (shl A C2)) if there is a single addi and we don't have a SHXADD instruction we could use. FIXME: May still need to check how many and what kind of users the SHL has.
Definition at line 3162 of file RISCVISelDAGToDAG.cpp.
References llvm::Add, llvm::ISD::ADD, assert(), llvm::User::getOperand(), isRegRegScaleLoadOrStore(), llvm::ISD::SHL, and llvm::Value::users().
Referenced by llvm::RISCVDAGToDAGISel::SelectAddrRegRegScale().
|
static |
Definition at line 2873 of file RISCVISelDAGToDAG.cpp.
References Addr, assert(), llvm::SmallVectorTemplateCommon< T, typename >::back(), llvm::sampleprof::Base, DL, llvm::SmallVectorBase< Size_T >::empty(), llvm::RISCVMatInt::generateInstSeq(), llvm::SelectionDAG::getMachineNode(), llvm::SelectionDAG::getRegister(), llvm::SelectionDAG::getSignedTargetConstant(), llvm::SelectionDAG::getTargetConstant(), llvm::Hi, llvm::RISCVSubtarget::is64Bit(), llvm::Offset, llvm::SmallVectorTemplateBase< T, bool >::pop_back(), and selectImmSeq().
Referenced by llvm::RISCVDAGToDAGISel::SelectAddrRegImm(), and llvm::RISCVDAGToDAGISel::SelectAddrRegImmLsb00000().
|
static |
Definition at line 208 of file RISCVISelDAGToDAG.cpp.
References DL, llvm::SmallVectorBase< Size_T >::empty(), llvm::RISCVMatInt::generateInstSeq(), llvm::RISCVMatInt::generateTwoRegInstSeq(), llvm::SelectionDAG::getMachineNode(), llvm::SelectionDAG::getSignedTargetConstant(), llvm::SelectionDAG::getTargetConstant(), llvm::Lo, selectImmSeq(), llvm::SmallVectorBase< Size_T >::size(), and UsePseudoMovImm.
Referenced by llvm::RISCVDAGToDAGISel::Select(), llvm::RISCVDAGToDAGISel::selectInvLogicImm(), llvm::RISCVDAGToDAGISel::selectScalarFPAsInt(), llvm::RISCVDAGToDAGISel::tryBitfieldInsertOpFromOrAndImm(), and llvm::RISCVDAGToDAGISel::tryBitfieldInsertOpFromXor().
|
static |
Definition at line 179 of file RISCVISelDAGToDAG.cpp.
References DL, llvm::SelectionDAG::getMachineNode(), llvm::SelectionDAG::getRegister(), llvm::SelectionDAG::getSignedTargetConstant(), llvm::RISCVMatInt::Imm, llvm::RISCVMatInt::RegImm, llvm::RISCVMatInt::RegReg, and llvm::RISCVMatInt::RegX0.
Referenced by selectConstantAddr(), and selectImm().
|
static |
Definition at line 4062 of file RISCVISelDAGToDAG.cpp.
References assert(), findVSplat(), llvm::APInt::getSExtValue(), llvm::SelectionDAG::getSignedTargetConstant(), llvm::RISCVSubtarget::getXLenVT(), N, and llvm::Splat.
Referenced by llvm::RISCVDAGToDAGISel::selectVSplatSimm5(), llvm::RISCVDAGToDAGISel::selectVSplatSimm5Plus1(), llvm::RISCVDAGToDAGISel::selectVSplatSimm5Plus1NoDec(), llvm::RISCVDAGToDAGISel::selectVSplatSimm5Plus1NonZero(), and llvm::RISCVDAGToDAGISel::selectVSplatUimm().
Definition at line 4285 of file RISCVISelDAGToDAG.cpp.
References llvm::SDValue::getMachineOpcode(), llvm::SDNode::isMachineOpcode(), and Opc.
|
static |
Definition at line 3792 of file RISCVISelDAGToDAG.cpp.
References assert(), llvm::User::getNumOperands(), llvm::User::getOperand(), llvm::RISCV::getRVVMCOpcode(), llvm::RISCV::getVectorLowDemandedScalarBits(), llvm::RISCVII::hasSEWOp(), llvm::RISCVII::hasVecPolicyOp(), llvm::RISCVII::hasVLOp(), TII, and llvm::MCInstrDesc::TSFlags.
Referenced by llvm::RISCVDAGToDAGISel::hasAllNBitUsers().
|
static |
Referenced by selectImm().