|
LLVM 24.0.0git
|
#include "LoongArchISelLowering.h"#include "LoongArch.h"#include "LoongArchMachineFunctionInfo.h"#include "LoongArchRegisterInfo.h"#include "LoongArchSelectionDAGInfo.h"#include "LoongArchSubtarget.h"#include "MCTargetDesc/LoongArchBaseInfo.h"#include "MCTargetDesc/LoongArchMCTargetDesc.h"#include "MCTargetDesc/LoongArchMatInt.h"#include "llvm/ADT/SmallSet.h"#include "llvm/ADT/Statistic.h"#include "llvm/ADT/StringExtras.h"#include "llvm/CodeGen/ISDOpcodes.h"#include "llvm/CodeGen/MachineInstrBuilder.h"#include "llvm/CodeGen/RuntimeLibcallUtil.h"#include "llvm/CodeGen/SelectionDAGNodes.h"#include "llvm/IR/IRBuilder.h"#include "llvm/IR/IntrinsicInst.h"#include "llvm/IR/IntrinsicsLoongArch.h"#include "llvm/Support/CodeGen.h"#include "llvm/Support/Debug.h"#include "llvm/Support/ErrorHandling.h"#include "llvm/Support/KnownBits.h"#include "llvm/Support/MathExtras.h"#include <llvm/Analysis/VectorUtils.h>#include "LoongArchGenAsmMatcher.inc"Go to the source code of this file.
Macros | |
| #define | DEBUG_TYPE "loongarch-isel-lowering" |
| #define | IOCSRRD_CASE(NAME, NODE) |
| #define | IOCSRWR_CASE(NAME, NODE) |
| #define | ASRT_LE_GT_CASE(NAME) |
| #define | CRC_CASE_EXT_BINARYOP(NAME, NODE) |
| #define | CRC_CASE_EXT_UNARYOP(NAME, NODE) |
| #define | CSR_CASE(ID) |
| #define | IOCSRRD_CASE(NAME, NODE) |
| #define | GET_REGISTER_MATCHER |
Enumerations | |
| enum | MaterializeFPImm { NoMaterializeFPImm = 0 , MaterializeFPImm2Ins = 2 , MaterializeFPImm3Ins = 3 , MaterializeFPImm4Ins = 4 , MaterializeFPImm5Ins = 5 , MaterializeFPImm6Ins = 6 } |
Variables | |
| static cl::opt< MaterializeFPImm > | MaterializeFPImmInsNum ("loongarch-materialize-float-imm", cl::Hidden, cl::desc("Maximum number of instructions used (including code sequence " "to generate the value and moving the value to FPR) when " "materializing floating-point immediates (default = 3)"), cl::init(MaterializeFPImm3Ins), cl::values(clEnumValN(NoMaterializeFPImm, "0", "Use constant pool"), clEnumValN(MaterializeFPImm2Ins, "2", "Materialize FP immediate within 2 instructions"), clEnumValN(MaterializeFPImm3Ins, "3", "Materialize FP immediate within 3 instructions"), clEnumValN(MaterializeFPImm4Ins, "4", "Materialize FP immediate within 4 instructions"), clEnumValN(MaterializeFPImm5Ins, "5", "Materialize FP immediate within 5 instructions"), clEnumValN(MaterializeFPImm6Ins, "6", "Materialize FP immediate within 6 instructions " "(behaves same as 5 on loongarch64)"))) |
| static cl::opt< bool > | ZeroDivCheck ("loongarch-check-zero-division", cl::Hidden, cl::desc("Trap on integer division by zero."), cl::init(false)) |
| const MCPhysReg | ArgGPRs [] |
| const MCPhysReg | PreserveNoneArgGPRs [] |
| const MCPhysReg | ArgFPR32s [] |
| const MCPhysReg | ArgFPR64s [] |
| const MCPhysReg | ArgVRs [] |
| const MCPhysReg | ArgXRs [] |
| #define ASRT_LE_GT_CASE | ( | NAME | ) |
| #define CRC_CASE_EXT_BINARYOP | ( | NAME, | |
| NODE ) |
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults().
| #define CRC_CASE_EXT_UNARYOP | ( | NAME, | |
| NODE ) |
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults().
| #define CSR_CASE | ( | ID | ) |
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults().
| #define DEBUG_TYPE "loongarch-isel-lowering" |
Definition at line 42 of file LoongArchISelLowering.cpp.
| #define GET_REGISTER_MATCHER |
Definition at line 11724 of file LoongArchISelLowering.cpp.
| #define IOCSRRD_CASE | ( | NAME, | |
| NODE ) |
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults().
| #define IOCSRRD_CASE | ( | NAME, | |
| NODE ) |
| #define IOCSRWR_CASE | ( | NAME, | |
| NODE ) |
| enum MaterializeFPImm |
| Enumerator | |
|---|---|
| NoMaterializeFPImm | |
| MaterializeFPImm2Ins | |
| MaterializeFPImm3Ins | |
| MaterializeFPImm4Ins | |
| MaterializeFPImm5Ins | |
| MaterializeFPImm6Ins | |
Definition at line 46 of file LoongArchISelLowering.cpp.
Definition at line 9784 of file LoongArchISelLowering.cpp.
References ArgGPRs, llvm::CallingConv::PreserveNone, and PreserveNoneArgGPRs.
Referenced by CC_LoongArch(), and CC_LoongArchAssign2GRLen().
|
static |
Definition at line 2531 of file LoongArchISelLowering.cpp.
References I, isValid(), Off, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::V1.
Referenced by lowerVECTOR_SHUFFLE_VPERMI(), and lowerVECTOR_SHUFFLE_XVPERMI().
|
static |
Shuffle vectors by lane to generate more optimized instructions.
256-bit shuffles are always considered as 2-lane 128-bit shuffles.
Therefore, except for the following four cases, other cases are regarded as cross-lane shuffles, where optimization is relatively limited.
The first case is the closest to LoongArch instructions and the other cases need to be converted to it for processing.
This function will return true for the last three cases above and will modify V1, V2 and Mask. Otherwise, return false for the first case and cross-lane shuffle cases.
Definition at line 3256 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::isUndef(), llvm::None, and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Definition at line 9833 of file LoongArchISelLowering.cpp.
References llvm::LoongArchABI::ABI_ILP32D, llvm::LoongArchABI::ABI_ILP32F, llvm::LoongArchABI::ABI_ILP32S, llvm::LoongArchABI::ABI_LP64D, llvm::LoongArchABI::ABI_LP64F, llvm::LoongArchABI::ABI_LP64S, allocateArgGPR(), ArgFPR32s, ArgFPR64s, ArgGPRs, ArgVRs, ArgXRs, assert(), llvm::CCValAssign::BCvt, CC_LoongArchAssign2GRLen(), llvm::SmallVectorImpl< T >::clear(), DL, llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::CCValAssign::Full, llvm::CCValAssign::getCustomMem(), llvm::CCValAssign::getCustomReg(), llvm::CCValAssign::getMem(), llvm::ISD::ArgFlagsTy::getNonZeroOrigAlign(), llvm::CCValAssign::getPending(), llvm::CCValAssign::getReg(), llvm::CCValAssign::Indirect, llvm::MVT::is128BitVector(), llvm::MVT::is256BitVector(), llvm::MVT::isFloatingPoint(), llvm::MVT::isScalarInteger(), llvm::ISD::ArgFlagsTy::isSplit(), llvm::ISD::ArgFlagsTy::isSplitEnd(), llvm::ISD::ArgFlagsTy::isVarArg(), llvm_unreachable, llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, and llvm::SmallVectorTemplateCommon< T, typename >::size().
Referenced by llvm::LoongArchTargetLowering::CanLowerReturn(), llvm::LoongArchTargetLowering::LowerCall(), llvm::LoongArchTargetLowering::LowerFormalArguments(), and llvm::LoongArchTargetLowering::LowerReturn().
|
static |
Definition at line 10185 of file LoongArchISelLowering.cpp.
References llvm::CCValAssign::getReg(), Reg, and llvm::report_fatal_error().
Referenced by llvm::LoongArchTargetLowering::LowerCall(), and llvm::LoongArchTargetLowering::LowerFormalArguments().
|
static |
Definition at line 9797 of file LoongArchISelLowering.cpp.
References allocateArgGPR(), llvm::CCValAssign::Full, llvm::CCValAssign::getLocVT(), llvm::CCValAssign::getMem(), llvm::ISD::ArgFlagsTy::getNonZeroOrigAlign(), llvm::CCValAssign::getReg(), llvm::CCValAssign::getValNo(), llvm::CCValAssign::getValVT(), and Reg.
Referenced by CC_LoongArch().
Definition at line 6680 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::ISD::BUILD_VECTOR, checkBitcastSrcVectorSize(), llvm::Depth, llvm::ISD::FREEZE, llvm::ISD::isBuildVectorAllOnes(), llvm::ISD::isBuildVectorAllZeros(), llvm::SelectionDAG::MaxRecursionDepth, llvm::ISD::OR, llvm::ISD::SELECT, llvm::ISD::SETCC, Size, llvm::ISD::TRUNCATE, llvm::ISD::VSELECT, and llvm::ISD::XOR.
Referenced by checkBitcastSrcVectorSize(), checkBitcastSrcVectorSize(), combineBitcastvxi1(), and performBITCASTCombine().
|
static |
Definition at line 4730 of file LoongArchISelLowering.cpp.
References llvm::cast(), llvm::LLVMContext::emitError(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::isInt(), llvm::isUInt(), and llvm::ISD::UNDEF.
|
static |
Definition at line 7127 of file LoongArchISelLowering.cpp.
References llvm::ISD::AssertSext, llvm::ISD::AssertZext, llvm::cast(), llvm::LoadSDNode::getExtensionType(), llvm::MemSDNode::getMemoryVT(), llvm::VTSDNode::getVT(), llvm::ISD::LOAD, llvm::ISD::NON_EXTLOAD, llvm::ISD::SEXTLOAD, and llvm::ISD::ZEXTLOAD.
|
static |
Definition at line 7471 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::cast(), llvm::ISD::Constant, DL, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::SelectionDAG::FoldSetCC(), llvm::APInt::getBitsSetFrom(), llvm::SelectionDAG::getCondCode(), llvm::SelectionDAG::getConstant(), llvm::SDValue::getConstantOperandVal(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::LoongArchSubtarget::getGRLen(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDValue::getScalarValueSizeInBits(), llvm::ISD::getSetCCInverse(), llvm::LoongArchTargetLowering::getSetCCResultType(), llvm::LoongArchSubtarget::getTargetLowering(), llvm::isa(), llvm::ISD::isIntEqualitySetCC(), llvm::isNullConstant(), llvm::isOneConstant(), llvm::isPowerOf2_64(), LHS, llvm::Log2_64(), llvm::SelectionDAG::MaskedValueIsZero(), RHS, llvm::ISD::SETCC, llvm::ISD::SETEQ, llvm::ISD::SETGE, llvm::ISD::SETLT, llvm::ISD::SETNE, llvm::ISD::SHL, llvm::ISD::SRA, llvm::ISD::SRL, translateSetCCForBranch(), and uint64_t.
Referenced by performBR_CCCombine(), llvm::RISCVTargetLowering::PerformDAGCombine(), and performSELECT_CCCombine().
|
static |
Try to fold: (and (xor X, -1), Y) -> (vandn X, Y).
Definition at line 6142 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, assert(), DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getNode(), llvm::MVT::is128BitVector(), llvm::MVT::is256BitVector(), isNOT(), N, X, and Y.
Referenced by performANDCombine().
|
static |
Definition at line 769 of file LoongArchISelLowering.cpp.
References assert(), llvm::cast(), llvm::ISD::CONCAT_VECTORS, DL, llvm::ISD::FP_ROUND, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValueType(), llvm::SelectionDAG::getVectorShuffle(), llvm::SDValue::hasOneUse(), Imm, llvm::EVT::is256BitVector(), llvm::SDValue::isUndef(), N, llvm::peekThroughBitcasts(), and llvm::Undef.
Referenced by performCONCAT_VECTORSCombine(), llvm::LoongArchTargetLowering::PerformDAGCombine(), and llvm::X86TargetLowering::PerformDAGCombine().
|
static |
Definition at line 1245 of file LoongArchISelLowering.cpp.
References llvm::ISD::ADD, llvm::ISD::AND, llvm::cast(), DL, llvm::SelectionDAG::getAllOnesConstant(), llvm::SDNode::getAsAPIntVal(), llvm::SelectionDAG::getFreeze(), llvm::SelectionDAG::getNegative(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::isa(), llvm::isAllOnesConstant(), llvm::isNullConstant(), LHS, matchSetCC(), N, llvm::ISD::OR, RHS, llvm::ISD::SETCC, and llvm::ISD::XOR.
|
static |
Compute whether each element of a shuffle is zeroable.
A "zeroable" vector shuffle element is one which can be lowered to zero.
Definition at line 1802 of file LoongArchISelLowering.cpp.
References assert(), llvm::SDValue::getNode(), llvm::APInt::getZero(), llvm::ISD::isBuildVectorAllZeros(), llvm::peekThroughBitcasts(), llvm::APInt::setBit(), Size, and llvm::V1.
Referenced by lower128BitShuffle(), lower256BitShuffle(), and lowerVECTOR_SHUFFLE().
|
static |
Definition at line 10058 of file LoongArchISelLowering.cpp.
References llvm::CCValAssign::BCvt, llvm::ISD::BITCAST, DL, llvm::CCValAssign::Full, llvm::CCValAssign::getLocInfo(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getNode(), llvm::CCValAssign::getValVT(), llvm::CCValAssign::Indirect, and llvm_unreachable.
|
static |
Definition at line 4096 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, DL, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::ISD::SRL, and llvm::ISD::XOR.
|
static |
Definition at line 10166 of file LoongArchISelLowering.cpp.
References llvm::CCValAssign::BCvt, llvm::ISD::BITCAST, DL, llvm::CCValAssign::Full, llvm::CCValAssign::getLocInfo(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getNode(), llvm::CCValAssign::getValVT(), and llvm_unreachable.
|
static |
Definition at line 5448 of file LoongArchISelLowering.cpp.
References llvm::ISD::ANY_EXTEND, DL, llvm::SelectionDAG::getConstant(), getLoongArchWOpcode(), llvm::SelectionDAG::getNode(), llvm_unreachable, N, llvm::ISD::ROTL, llvm::ISD::SUB, and llvm::ISD::TRUNCATE.
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults(), and llvm::RISCVTargetLowering::ReplaceNodeResults().
|
static |
Definition at line 5482 of file LoongArchISelLowering.cpp.
References llvm::ISD::ANY_EXTEND, DL, llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getValueType(), N, llvm::ISD::SIGN_EXTEND_INREG, and llvm::ISD::TRUNCATE.
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults(), and llvm::RISCVTargetLowering::ReplaceNodeResults().
|
static |
Definition at line 9449 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addReg(), assert(), llvm::BuildMI(), llvm::MachineRegisterInfo::createVirtualRegister(), DL, llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getRegInfo(), llvm::MachineFunction::getSubtarget(), MI, and TII.
Referenced by llvm::RISCVTargetLowering::EmitInstrWithCustomInserter().
|
static |
Definition at line 5494 of file LoongArchISelLowering.cpp.
References llvm::LLVMContext::emitError(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getUNDEF(), N, and Results.
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults(), and replaceVPICKVE2GRResults().
|
static |
Definition at line 5146 of file LoongArchISelLowering.cpp.
References llvm::LLVMContext::emitError(), and llvm::SelectionDAG::getContext().
|
static |
Definition at line 5023 of file LoongArchISelLowering.cpp.
References llvm::LLVMContext::emitError(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getMergeValues(), and llvm::SelectionDAG::getUNDEF().
|
static |
Definition at line 9265 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), assert(), llvm::BuildMI(), llvm::MachineRegisterInfo::createVirtualRegister(), DL, llvm::LoongArchSubtarget::getInstrInfo(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getRegInfo(), llvm_unreachable, MI, and TII.
|
static |
Definition at line 9315 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::MachineRegisterInfo::createVirtualRegister(), DL, llvm::LoongArchSubtarget::getInstrInfo(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getRegInfo(), llvm::LoongArchSubtarget::getRegisterInfo(), llvm::Hi, llvm::LoongArchSubtarget::is64Bit(), llvm_unreachable, llvm::Lo, MI, TII, and TRI.
|
static |
Definition at line 9196 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::MachineRegisterInfo::createVirtualRegister(), DL, llvm::LoongArchSubtarget::getInstrInfo(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getRegInfo(), llvm::MachineRegisterInfo::getVRegDef(), llvm::MachineInstr::isImplicitDef(), llvm::Register::isVirtual(), llvm_unreachable, MI, and TII.
|
static |
Definition at line 9482 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), llvm::MachineBasicBlock::addSuccessor(), llvm::any_of(), llvm::MachineBasicBlock::begin(), llvm::BuildMI(), llvm::MachineInstr::collectDebugValues(), llvm::SmallSet< T, N, C >::count(), DL, E(), llvm::MachineBasicBlock::end(), llvm::MachineInstr::eraseFromParent(), F, llvm::MachineBasicBlock::getBasicBlock(), llvm::getImm(), llvm::LoongArchSubtarget::getInstrInfo(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineBasicBlock::getParent(), I, llvm::SmallSet< T, N, C >::insert(), isSelectPseudo(), LHS, MI, llvm::Next, llvm::MachineBasicBlock::push_back(), RHS, llvm::MachineBasicBlock::setCallFrameSize(), llvm::MachineBasicBlock::splice(), TII, and llvm::MachineBasicBlock::transferSuccessorsAndUpdatePHIs().
|
static |
Definition at line 9429 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addReg(), assert(), llvm::BuildMI(), DL, llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getSubtarget(), MI, and TII.
|
static |
Definition at line 9071 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), llvm::MachineBasicBlock::addSuccessor(), llvm::MachineBasicBlock::begin(), llvm::BuildMI(), llvm::MachineRegisterInfo::createVirtualRegister(), DL, llvm::MachineBasicBlock::end(), F, llvm::MachineBasicBlock::getBasicBlock(), llvm::LoongArchSubtarget::getInstrInfo(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::getRegInfo(), llvm_unreachable, MI, llvm::MachineBasicBlock::splice(), TII, and llvm::MachineBasicBlock::transferSuccessorsAndUpdatePHIs().
|
static |
Definition at line 8468 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getContext(), llvm::MVT::getIntegerVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), llvm::EVT::getVectorNumElements(), llvm::EVT::getVectorVT(), and N.
Referenced by performSINT_TO_FPCombine(), and performUINT_TO_FPCombine().
|
static |
Definition at line 3693 of file LoongArchISelLowering.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, assert(), DL, fillVector(), llvm::SelectionDAG::getUNDEF(), llvm::EVT::getVectorNumElements(), and llvm::Vector.
|
static |
Definition at line 3674 of file LoongArchISelLowering.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, assert(), DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getVectorNumElements(), llvm::ISD::INSERT_VECTOR_ELT, llvm::SDValue::isUndef(), llvm::ISD::SCALAR_TO_VECTOR, and llvm::Vector.
Referenced by fillSubVectorFromBuildVector().
|
static |
Determine whether a range fits a regular pattern of values.
This function accounts for the possibility of jumping over the End iterator.
Definition at line 1780 of file LoongArchISelLowering.cpp.
Referenced by isVECTOR_SHUFFLE_SPLATI(), lowerVECTOR_SHUFFLE_ILVEV(), lowerVECTOR_SHUFFLE_ILVL(), lowerVECTOR_SHUFFLE_ILVOD(), lowerVECTOR_SHUFFLE_ILVR(), lowerVECTOR_SHUFFLE_PCKEV(), lowerVECTOR_SHUFFLE_PCKOD(), lowerVECTOR_SHUFFLE_VILVH(), lowerVECTOR_SHUFFLE_VILVL(), lowerVECTOR_SHUFFLE_VPACKEV(), lowerVECTOR_SHUFFLE_VPACKOD(), lowerVECTOR_SHUFFLE_VPICKEV(), lowerVECTOR_SHUFFLE_VPICKOD(), lowerVECTOR_SHUFFLE_VREPLVEI(), lowerVECTOR_SHUFFLE_XVILVH(), lowerVECTOR_SHUFFLE_XVILVL(), lowerVECTOR_SHUFFLE_XVPICKEV(), lowerVECTOR_SHUFFLE_XVPICKOD(), and lowerVECTOR_SHUFFLE_XVREPLVEI().
|
static |
Definition at line 1319 of file LoongArchISelLowering.cpp.
References DL, llvm::dyn_cast(), llvm::SelectionDAG::FoldConstantArithmetic(), llvm::SDNode::getAsAPIntVal(), llvm::SelectionDAG::getNode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getSelect(), llvm::SDNode::getValueType(), llvm::SDValue::hasOneUse(), llvm::isa(), llvm::APInt::isAllOnes(), llvm::ConstantSDNode::isOpaque(), llvm::APInt::isZero(), llvm::ISD::SELECT, and std::swap().
|
static |
Definition at line 7172 of file LoongArchISelLowering.cpp.
References llvm::SelectionDAG::ComputeNumSignBits(), DL, llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), llvm::isNullConstant(), llvm::EVT::isVector(), LHS, RHS, llvm::ISD::SETEQ, and llvm::ISD::SETNE.
Referenced by performBR_CCCombine(), and performSETCCCombine().
|
static |
Definition at line 11455 of file LoongArchISelLowering.cpp.
References llvm::EVT::getScalarType().
Referenced by llvm::LoongArchTargetLowering::getRecipEstimate(), and llvm::LoongArchTargetLowering::getSqrtEstimate().
|
static |
Definition at line 11276 of file LoongArchISelLowering.cpp.
References llvm::AtomicRMWInst::Add, llvm_unreachable, llvm::AtomicRMWInst::Max, llvm::AtomicRMWInst::Min, llvm::AtomicRMWInst::Nand, llvm::AtomicRMWInst::Sub, llvm::AtomicRMWInst::UMax, llvm::AtomicRMWInst::UMin, and llvm::AtomicRMWInst::Xchg.
Referenced by llvm::LoongArchTargetLowering::emitMaskedAtomicRMWIntrinsic(), and llvm::RISCVTargetLowering::emitMaskedAtomicRMWIntrinsic().
Definition at line 5415 of file LoongArchISelLowering.cpp.
References llvm::ISD::CTLZ, llvm::ISD::CTTZ, llvm_unreachable, llvm::ISD::ROTL, llvm::ISD::ROTR, llvm::ISD::SDIV, llvm::ISD::SHL, llvm::ISD::SRA, llvm::ISD::SREM, llvm::ISD::SRL, llvm::ISD::UDIV, and llvm::ISD::UREM.
Referenced by customLegalizeToWOp().
|
static |
Definition at line 10483 of file LoongArchISelLowering.cpp.
References llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getDataLayout(), llvm::DataLayout::getPrefTypeAlign(), and llvm::EVT::getTypeForEVT().
Referenced by llvm::SelectionDAG::CreateStackTemporary(), llvm::LoongArchTargetLowering::LowerCall(), and llvm::RISCVTargetLowering::LowerCall().
|
static |
Definition at line 4457 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getTargetBlockAddress(), and N.
|
static |
Definition at line 4463 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getTargetConstantPool(), and N.
|
static |
Definition at line 4452 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getTargetGlobalAddress(), and N.
|
static |
Definition at line 4469 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getTargetJumpTable(), and N.
|
static |
Definition at line 9020 of file LoongArchISelLowering.cpp.
References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::MachineFunction::CreateMachineBasicBlock(), DL, llvm::TargetSubtargetInfo::getInstrInfo(), llvm::getKillRegState(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getSubtarget(), llvm::MachineFunction::insert(), llvm::MachineOperand::isKill(), MBB, MI, llvm::MachineOperand::setIsKill(), TII, and ZeroDivCheck.
Referenced by llvm::MipsTargetLowering::EmitInstrWithCustomInserter().
Definition at line 6168 of file LoongArchISelLowering.cpp.
References llvm::dyn_cast(), N, and llvm::peekThroughBitcasts().
Referenced by llvm::ISD::isConstantSplatVectorAllOnes(), llvm::ISD::isConstantSplatVectorAllZeros(), performADDCombine(), performSHLCombine(), and performVSELECTCombine().
|
static |
Definition at line 707 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::ISD::BUILD_VECTOR, llvm::cast(), llvm::ISD::EXTRACT_SUBVECTOR, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getSplat(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::isAllOnesConstant(), llvm::ISD::isBuildVectorAllOnes(), isNOT(), llvm::isNullConstant(), llvm::TargetLoweringBase::isTypeLegal(), llvm::ISD::OR, llvm::peekThroughBitcasts(), and llvm::ISD::XOR.
Referenced by combineAndNotIntoVANDN(), llvm::X86InstrInfo::isDataInvariant(), isNOT(), and performVANDNCombine().
|
static |
Test whether a shuffle mask is equivalent within each sub-lane.
The specific repeated shuffle mask is populated in RepeatedMask, as it is non-trivial to compute in the face of undef lanes. The representation is suitable for use with existing 128-bit shuffles as entries from the second vector have been remapped to [LaneSize, 2*LaneSize).
Definition at line 1838 of file LoongArchISelLowering.cpp.
References assert(), llvm::SmallVectorImpl< T >::assign(), llvm::MVT::getScalarSizeInBits(), and Size.
Referenced by is128BitLaneRepeatedShuffleMask(), is128BitLaneRepeatedShuffleMask(), is256BitLaneRepeatedShuffleMask(), and matchShuffleAsByteRotate().
|
static |
Definition at line 9472 of file LoongArchISelLowering.cpp.
References MI.
Referenced by emitSelectPseudo().
|
static |
Definition at line 11464 of file LoongArchISelLowering.cpp.
References assert(), llvm::EVT::getSimpleVT(), llvm::EVT::isSimple(), and llvm::MVT::SimpleTy.
Referenced by llvm::LoongArchTargetLowering::getRecipEstimate(), and llvm::LoongArchTargetLowering::getSqrtEstimate().
|
static |
Definition at line 7649 of file LoongArchISelLowering.cpp.
References llvm::cast(), DL, llvm::LLVMContext::emitError(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::isInt(), llvm::isUInt(), and llvm::ISD::UNDEF.
Referenced by performINTRINSIC_WO_CHAINCombine().
|
static |
Dispatching routine to lower various 128-bit LoongArch vector shuffles.
This routine breaks down the specific type of 128-bit shuffle and dispatches to the lowering routines accordingly.
Definition at line 2650 of file LoongArchISelLowering.cpp.
References assert(), computeZeroableShuffleElements(), DL, llvm::SDValue::getSimpleValueType(), llvm::MVT::getVectorNumElements(), llvm::SDValue::isUndef(), lowerVECTOR_SHUFFLE_IsReverse(), lowerVECTOR_SHUFFLE_VEXTRINS(), lowerVECTOR_SHUFFLE_VILVH(), lowerVECTOR_SHUFFLE_VILVL(), lowerVECTOR_SHUFFLE_VPACKEV(), lowerVECTOR_SHUFFLE_VPACKOD(), lowerVECTOR_SHUFFLE_VPERMI(), lowerVECTOR_SHUFFLE_VPICKEV(), lowerVECTOR_SHUFFLE_VPICKOD(), lowerVECTOR_SHUFFLE_VREPLVEI(), lowerVECTOR_SHUFFLE_VSHUF(), lowerVECTOR_SHUFFLE_VSHUF4I(), lowerVECTOR_SHUFFLEAsByteRotate(), lowerVECTOR_SHUFFLEAsShift(), lowerVECTOR_SHUFFLEAsZeroOrAnyExtend(), llvm::MVT::SimpleTy, llvm::V1, and widenShuffleMask().
Referenced by lowerVECTOR_SHUFFLE().
|
static |
Dispatching routine to lower various 256-bit LoongArch vector shuffles.
This routine breaks down the specific type of 256-bit shuffle and dispatches to the lowering routines accordingly.
Definition at line 3406 of file LoongArchISelLowering.cpp.
References assert(), canonicalizeShuffleVectorByLane(), computeZeroableShuffleElements(), DL, llvm::SDValue::getSimpleValueType(), llvm::MVT::getVectorNumElements(), llvm::SDValue::isUndef(), lower256BitShuffle(), lowerVECTOR_SHUFFLE_IsReverse(), lowerVECTOR_SHUFFLE_XVEXTRINS(), lowerVECTOR_SHUFFLE_XVILVH(), lowerVECTOR_SHUFFLE_XVILVL(), lowerVECTOR_SHUFFLE_XVINSVE0(), lowerVECTOR_SHUFFLE_XVPACKEV(), lowerVECTOR_SHUFFLE_XVPACKOD(), lowerVECTOR_SHUFFLE_XVPERM(), lowerVECTOR_SHUFFLE_XVPERMI(), lowerVECTOR_SHUFFLE_XVPICKEV(), lowerVECTOR_SHUFFLE_XVPICKOD(), lowerVECTOR_SHUFFLE_XVREPLVE0(), lowerVECTOR_SHUFFLE_XVREPLVEI(), lowerVECTOR_SHUFFLE_XVSHUF(), lowerVECTOR_SHUFFLE_XVSHUF4I(), lowerVECTOR_SHUFFLEAsByteRotate(), lowerVECTOR_SHUFFLEAsLanePermuteAndShuffle(), lowerVECTOR_SHUFFLEAsShift(), llvm::MVT::SimpleTy, llvm::V1, and widenShuffleMask().
Referenced by lower256BitShuffle(), and lowerVECTOR_SHUFFLE().
|
static |
Definition at line 3628 of file LoongArchISelLowering.cpp.
References AbstractManglingParser< Derived, Alloc >::NumOps, AbstractManglingParser< Derived, Alloc >::Ops, assert(), llvm::cast(), DL, llvm::ISD::EXTLOAD, llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getNumOperands(), llvm::SDNode::getOperand(), llvm::MVT::getScalarSizeInBits(), llvm::SDNode::getSimpleValueType(), llvm::SDValue::getValue(), llvm::SelectionDAG::getVTList(), llvm::MVT::is128BitVector(), llvm::MVT::is256BitVector(), llvm::SDNode::isOnlyUserOf(), llvm::ISD::LOAD, llvm::ISD::NON_EXTLOAD, and llvm::SelectionDAG::ReplaceAllUsesOfValueWith().
|
static |
Lower VECTOR_SHUFFLE whose result is the reversed source vector.
It is possible to do optimization for VECTOR_SHUFFLE performing vector reverse whose mask likes: <7, 6, 5, 4, 3, 2, 1, 0>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2175 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getUNDEF(), llvm::MVT::getVectorElementType(), llvm::MVT::getVectorNumElements(), llvm::SelectionDAG::getVectorShuffle(), llvm::MVT::getVectorVT(), llvm::ShuffleVectorInst::isReverseMask(), and llvm::V1.
Referenced by lower128BitShuffle(), and lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VEXTRINS (if possible).
VEXTRINS copies one element of a vector into any place of the result vector and makes no change to the rest elements of the result vector.
It is possible to lower into VEXTRINS when the mask takes the form: <0, 1, 2, ..., n+i, ..., n-1> or <n, n+1, n+2, ..., i, ..., 2n-1> or <0, 1, 2, ..., i, ..., n-1> or <n, n+1, n+2, ..., n+i, ..., 2n-1> where n is the number of elements in the vector and i is in [0, n). For example: <0, 1, 2, 3, 4, 5, 6, 8> , <2, 9, 10, 11, 12, 13, 14, 15> , <0, 1, 2, 6, 4, 5, 6, 7> , <8, 9, 10, 11, 12, 9, 14, 15>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2466 of file LoongArchISelLowering.cpp.
References llvm::sampleprof::Base, DL, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getVectorElementType(), llvm::MVT::getVectorNumElements(), llvm::ISD::INSERT_VECTOR_ELT, llvm::MVT::isFloatingPoint(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VILVH (if possible).
VILVH interleaves consecutive elements from the left (highest-indexed) half of each vector.
It is possible to lower into VILVH when the mask consists of two of the following forms interleaved: <x, x+1, x+2, ...> <n+x, n+x+1, n+x+2, ...> where n is the number of elements in the vector and x is half n. For example: <x, x, x+1, x+1, x+2, x+2, ...> <x, n+x, x+1, n+x+1, x+2, n+x+2, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2299 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VILVL (if possible).
VILVL interleaves consecutive elements from the right (lowest-indexed) half of each vector.
It is possible to lower into VILVL when the mask consists of two of the following forms interleaved: <0, 1, 2, ...> <n, n+1, n+2, ...> where n is the number of elements in the vector. For example: <0, 0, 1, 1, 2, 2, ...> <0, n, 1, n+1, 2, n+2, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2342 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VPACKEV (if possible).
VPACKEV interleaves the even elements from each vector.
It is possible to lower into VPACKEV when the mask consists of two of the following forms interleaved: <0, 2, 4, ...> <n, n+2, n+4, ...> where n is the number of elements in the vector. For example: <0, 0, 2, 2, 4, 4, ...> <0, n, 2, n+2, 4, n+4, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2218 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower128BitShuffle(), and lowerVECTOR_SHUFFLE_XVPACKEV().
|
static |
Lower VECTOR_SHUFFLE into VPACKOD (if possible).
VPACKOD interleaves the odd elements from each vector.
It is possible to lower into VPACKOD when the mask consists of two of the following forms interleaved: <1, 3, 5, ...> <n+1, n+3, n+5, ...> where n is the number of elements in the vector. For example: <1, 1, 3, 3, 5, 5, ...> <1, n+1, 3, n+3, 5, n+5, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2258 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower128BitShuffle(), and lowerVECTOR_SHUFFLE_XVPACKOD().
|
static |
Lower VECTOR_SHUFFLE into VPERMI (if possible).
VPERMI selects two elements from each of the two vectors based on the mask and places them in the corresponding positions of the result vector in order. Only v4i32 and v4f32 types are allowed.
It is possible to lower into VPERMI when the mask consists of two of the following forms concatenated: <i, j, u, v> <u, v, i, j> where i,j are in [0,4) and u,v are in [4, 8). For example: <2, 3, 4, 5> <5, 7, 0, 2>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2603 of file LoongArchISelLowering.cpp.
References buildVPERMIInfo(), DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getVectorNumElements(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VPICKEV (if possible).
VPICKEV copies the even elements of each vector into the result vector.
It is possible to lower into VPICKEV when the mask consists of two of the following forms concatenated: <0, 2, 4, ...> <n, n+2, n+4, ...> where n is the number of elements in the vector. For example: <0, 2, 4, ..., 0, 2, 4, ...> <0, 2, 4, ..., n, n+2, n+4, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2382 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VPICKOD (if possible).
VPICKOD copies the odd elements of each vector into the result vector.
It is possible to lower into VPICKOD when the mask consists of two of the following forms concatenated: <1, 3, 5, ...> <n+1, n+3, n+5, ...> where n is the number of elements in the vector. For example: <1, 3, 5, ..., 1, 3, 5, ...> <1, 3, 5, ..., n+1, n+3, n+5, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above forms.
Definition at line 2424 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VREPLVEI (if possible).
VREPLVEI performs vector broadcast based on an element specified by an integer immediate, with its mask being similar to: <x, x, x, ...> where x is any valid index.
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above form.
Definition at line 2069 of file LoongArchISelLowering.cpp.
References assert(), DL, fitsRegularPattern(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getUNDEF(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VSHUF.
This mostly consists of converting the shuffle mask into a BUILD_VECTOR and adding it as an operand to the resulting VSHUF.
Definition at line 2624 of file LoongArchISelLowering.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, llvm::MVT::changeVectorElementTypeToInteger(), DL, llvm::SelectionDAG::getBuildVector(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getSignedConstant(), and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into VSHUF4I (if possible).
VSHUF4I splits the vector into blocks of four elements, then shuffles these elements according to a <4 x i2> constant (encoded as an integer immediate).
It is therefore possible to lower into VSHUF4I when the mask takes the form: <a, b, c, d, a+4, b+4, c+4, d+4, a+8, b+8, c+8, d+8, ...> When undef's appear they are treated as if they were whatever value is necessary in order to fit the above forms.
For example: %2 = shufflevector <8 x i16> %0, <8 x i16> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4> is lowered to: (VSHUF4I_H $v0, $v1, 27) where the 27 comes from: 3 + (2 << 2) + (1 << 4) + (0 << 6)
Definition at line 2111 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), Imm, and llvm::V1.
Referenced by lower128BitShuffle(), and lowerVECTOR_SHUFFLE_XVSHUF4I().
|
static |
Lower VECTOR_SHUFFLE into XVEXTRINS (if possible).
Definition at line 3058 of file LoongArchISelLowering.cpp.
References llvm::sampleprof::Base, llvm::SmallVectorTemplateCommon< T, typename >::begin(), DL, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getVectorElementType(), llvm::MVT::getVectorNumElements(), llvm::SmallVectorImpl< T >::insert(), llvm::ISD::INSERT_VECTOR_ELT, llvm::MVT::isFloatingPoint(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVILVH (if possible).
Definition at line 2913 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVILVL (if possible).
Definition at line 2952 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVINSVE0 (if possible).
Definition at line 3140 of file LoongArchISelLowering.cpp.
References assert(), llvm::sampleprof::Base, DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getVectorNumElements(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVPACKEV (if possible).
Definition at line 2899 of file LoongArchISelLowering.cpp.
References DL, lowerVECTOR_SHUFFLE_VPACKEV(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVPACKOD (if possible).
Definition at line 2906 of file LoongArchISelLowering.cpp.
References DL, lowerVECTOR_SHUFFLE_VPACKOD(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVPERM (if possible).
Definition at line 2856 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getBuildVector(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getUNDEF(), llvm::MVT::getVectorNumElements(), inRange(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVPERMI (if possible).
Definition at line 2818 of file LoongArchISelLowering.cpp.
References buildVPERMIInfo(), DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getVectorNumElements(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVPICKEV (if possible).
Definition at line 2986 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVPICKOD (if possible).
Definition at line 3021 of file LoongArchISelLowering.cpp.
References DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getNode(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVREPLVE0 (if possible).
It is a XVREPLVE0 when the VECTOR_SHUFFLE is a broadcast of element 0, i.e. the mask is: <0, 0, 0, ...>
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above form.
Definition at line 2807 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getNode(), llvm::ShuffleVectorInst::isZeroEltSplatMask(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVREPLVEI (if possible).
It is a XVREPLVEI when the mask is: <x, x, x, ..., x+n, x+n, x+n, ...> where the number of x is equal to n and n is half the length of vector.
When undef's appear in the mask they are treated as if they were whatever value is necessary in order to fit the above form.
Definition at line 2735 of file LoongArchISelLowering.cpp.
References assert(), DL, llvm::End, fitsRegularPattern(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getUNDEF(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVSHUF (if possible).
Definition at line 3186 of file LoongArchISelLowering.cpp.
References assert(), llvm::MVT::changeVectorElementTypeToInteger(), DL, llvm::End, llvm::SelectionDAG::getBuildVector(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getTargetConstant(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE into XVSHUF4I (if possible).
Definition at line 2769 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), lowerVECTOR_SHUFFLE_VSHUF4I(), and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE as byte rotate (if possible).
For example: shuffle = shufflevector <2 x i64> a, <2 x i64> b, <2 x i32> <i32 3, i32 0> is lowered to: (VBSRL_V $v1, $v1, 8) (VBSLL_V $v0, $v0, 8) (VOR_V $v0, $V0, $v1)
Definition at line 1942 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getSizeInBits(), llvm::MVT::getVectorVT(), llvm::Hi, llvm::Lo, matchShuffleAsByteRotate(), llvm::ISD::OR, and llvm::V1.
Referenced by lower128BitShuffle(), and lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE as lane permute and then shuffle (if possible).
Only for 256-bit vector.
For example: %2 = shufflevector <4 x i64> %0, <4 x i64> posion, <4 x i64> <i32 0, i32 3, i32 2, i32 0> is lowerded to: (XVPERMI $xr2, $xr0, 78) (XVSHUF $xr1, $xr2, $xr0) (XVORI $xr0, $xr1, 0)
Definition at line 3367 of file LoongArchISelLowering.cpp.
References assert(), llvm::SmallVectorImpl< T >::assign(), DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getUNDEF(), llvm::SelectionDAG::getVectorShuffle(), llvm::MVT::is256BitVector(), Size, and llvm::V1.
Referenced by lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE as shift (if possible).
For example: %2 = shufflevector <4 x i32> %0, <4 x i32> zeroinitializer, <4 x i32> <i32 4, i32 0, i32 1, i32 2> is lowered to: (VBSLL_V $v0, $v0, 4)
%2 = shufflevector <4 x i32> %0, <4 x i32> zeroinitializer, <4 x i32> <i32 4, i32 0, i32 4, i32 2> is lowered to: (VSLLI_D $v0, $v0, 32)
Definition at line 1742 of file LoongArchISelLowering.cpp.
References assert(), DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getScalarSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::MVT::getVectorNumElements(), llvm::TargetLoweringBase::isTypeLegal(), matchShuffleAsShift(), Size, and llvm::V1.
Referenced by lower128BitShuffle(), and lower256BitShuffle().
|
static |
Lower VECTOR_SHUFFLE as ZERO_EXTEND Or ANY_EXTEND (if possible).
For example: %2 = shufflevector <4 x i32> %0, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 1, i32 4> %3 = bitcast <4 x i32> %2 to <2 x i64> is lowered to: (VREPLI $v1, 0) (VILVL $v0, $v1, $v0)
Definition at line 1975 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getFreeze(), llvm::MVT::getIntegerVT(), llvm::SelectionDAG::getNode(), llvm::MVT::getScalarSizeInBits(), llvm::MVT::getSizeInBits(), llvm::MVT::getVectorNumElements(), llvm::MVT::getVectorVT(), llvm::APInt::isAllOnes(), llvm::Lower, llvm::Offset, and llvm::V1.
Referenced by lower128BitShuffle().
|
static |
Definition at line 7693 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, DL, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getNOT(), llvm::ISD::SHL, and truncateVecElts().
Referenced by performINTRINSIC_WO_CHAINCombine().
|
static |
Definition at line 7705 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::cast(), DL, llvm::LLVMContext::emitError(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), llvm::isUInt(), and llvm::ISD::UNDEF.
Referenced by performINTRINSIC_WO_CHAINCombine().
|
static |
Definition at line 7740 of file LoongArchISelLowering.cpp.
References llvm::cast(), DL, llvm::LLVMContext::emitError(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), Imm, llvm::isUInt(), llvm::ISD::UNDEF, and llvm::ISD::XOR.
Referenced by performINTRINSIC_WO_CHAINCombine().
|
static |
Definition at line 7723 of file LoongArchISelLowering.cpp.
References llvm::cast(), DL, llvm::LLVMContext::emitError(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), Imm, llvm::isUInt(), llvm::ISD::OR, and llvm::ISD::UNDEF.
Referenced by performINTRINSIC_WO_CHAINCombine().
|
static |
Definition at line 7757 of file LoongArchISelLowering.cpp.
References DL, llvm::LLVMContext::emitError(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getUNDEF(), llvm::SDValue::getValueType(), llvm::SelectionDAG::getValueType(), llvm::EVT::getVectorElementType(), Imm, llvm::isUInt(), and N.
Referenced by performINTRINSIC_WO_CHAINCombine().
|
static |
Definition at line 7666 of file LoongArchISelLowering.cpp.
References llvm::cast(), DL, llvm::LLVMContext::emitError(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getContext(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarType(), llvm::EVT::getSizeInBits(), llvm::isInt(), llvm::isUInt(), and llvm::ISD::UNDEF.
Referenced by performINTRINSIC_WO_CHAINCombine().
Definition at line 7367 of file LoongArchISelLowering.cpp.
References llvm::ISD::ADD, Opc, llvm::ISD::OR, stripSignExtendInReg(), llvm::ISD::SUB, X, and llvm::ISD::XOR.
Referenced by performSELECTCombine().
Definition at line 6185 of file LoongArchISelLowering.cpp.
References llvm::dyn_cast(), llvm::ISD::EXTRACT_VECTOR_ELT, and N.
Referenced by performHorizWideningCombine().
Definition at line 6502 of file LoongArchISelLowering.cpp.
References llvm::dyn_cast(), llvm::ISD::EXTRACT_SUBVECTOR, llvm::ISD::EXTRACT_VECTOR_ELT, llvm::SDValue::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getOperand(), llvm::EVT::getSizeInBits(), llvm::EVT::getVectorNumElements(), I, llvm::EVT::is128BitVector(), llvm::EVT::is256BitVector(), llvm::SDValue::isUndef(), llvm::EVT::isVector(), N, and llvm::peekThroughBitcasts().
Referenced by performEXTENDCombine(), and performSHLCombine().
|
static |
Definition at line 1222 of file LoongArchISelLowering.cpp.
References assert(), llvm::cast(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::ISD::getSetCCInverse(), llvm::ISD::getSetCCSwappedOperands(), llvm::SDValue::getValueType(), LHS, RHS, and llvm::ISD::SETCC.
Referenced by combineSelectToBinOp(), and lowerSelectToBinOp().
Attempts to match vector shuffle as byte rotation.
Definition at line 1867 of file LoongArchISelLowering.cpp.
References assert(), llvm::Hi, isRepeatedShuffleMask(), llvm::Lo, llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::V1.
Referenced by lowerShuffleAsByteRotate(), lowerVECTOR_SHUFFLEAsByteRotate(), and matchBinaryPermuteShuffle().
|
static |
Attempts to match a shuffle mask against the VBSLL, VBSRL, VSLLI and VSRLI instruction.
Definition at line 1667 of file LoongArchISelLowering.cpp.
References llvm::MVT::getIntegerVT(), llvm::MVT::getVectorVT(), isSequentialOrUndefInRange(), llvm::Left, llvm::Low, and Size.
Referenced by lowerShuffleAsShift(), lowerVECTOR_SHUFFLEAsShift(), and matchUnaryPermuteShuffle().
|
static |
Definition at line 8496 of file LoongArchISelLowering.cpp.
References llvm::ISD::CONCAT_VECTORS, DL, llvm::ISD::EXTRACT_SUBVECTOR, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getNode(), llvm::MVT::getScalarSizeInBits(), llvm::MVT::getScalarType(), llvm::MVT::getSizeInBits(), llvm::SelectionDAG::getUNDEF(), llvm::SelectionDAG::getVectorIdxConstant(), llvm::SelectionDAG::getVectorShuffle(), llvm::MVT::getVectorVT(), llvm::Hi, llvm::Lo, N, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::Undef.
Referenced by performFP_TO_INTCombine(), and performSINT_TO_FPCombine().
|
static |
Definition at line 6290 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, DL, llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::EVT::getVectorElementType(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), isConstantSplatVector(), llvm::EVT::isInteger(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), N, performHorizWideningCombine(), llvm::ISD::SRA, llvm::ISD::SRL, and X.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), llvm::MipsTargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 6407 of file LoongArchISelLowering.cpp.
References combineAndNotIntoVANDN(), DL, llvm::dyn_cast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::ConstantSDNode::getSExtValue(), llvm::EVT::getSizeInBits(), llvm::ConstantSDNode::getZExtValue(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), llvm::isShiftedMask_64(), N, llvm::ISD::SHL, llvm::ISD::SRA, llvm::ISD::SRL, uint64_t, and llvm::SDNode::use_size().
|
static |
Definition at line 6808 of file LoongArchISelLowering.cpp.
References checkBitcastSrcVectorSize(), DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getContext(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::EVT::getIntegerVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarType(), llvm::SelectionDAG::getShiftAmountConstant(), llvm::EVT::getSimpleVT(), llvm::EVT::getSizeInBits(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getZExtOrTrunc(), llvm::Hi, llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), llvm::EVT::isSimple(), llvm::Lo, N, Opc, llvm::ISD::OR, performSETCC_BITCASTCombine(), llvm::ISD::SETCC, llvm::ISD::SHL, llvm::ISD::SIGN_EXTEND, signExtendBitcastSrcVector(), llvm::MVT::SimpleTy, llvm::SelectionDAG::SplitVector(), and T.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 7456 of file LoongArchISelLowering.cpp.
References llvm::SelectionDAG::getNode(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), and N.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 7574 of file LoongArchISelLowering.cpp.
References llvm::cast(), combine_CC(), DL, foldVMskZeroTest(), llvm::get(), llvm::SelectionDAG::getCondCode(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), LHS, N, RHS, and llvm::ISD::SETNE.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8805 of file LoongArchISelLowering.cpp.
References combineFP_ROUND(), DL, llvm::EVT::isVector(), and N.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8360 of file LoongArchISelLowering.cpp.
References llvm::APInt::getAllOnes(), llvm::MVT::getScalarSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), N, and llvm::TargetLowering::SimplifyDemandedBits().
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8779 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), matchHalfOf128BitLanes(), N, PromoteMaskArithmetic(), llvm::ISD::SIGN_EXTEND, and llvm::ISD::ZERO_EXTEND.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8628 of file LoongArchISelLowering.cpp.
References DL, llvm::ISD::FP_TO_SINT, llvm::MVT::getIntegerVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getScalarSizeInBits(), llvm::EVT::getSizeInBits(), llvm::EVT::getVectorNumElements(), llvm::MVT::getVectorVT(), llvm::isPowerOf2_32(), llvm::EVT::isSimple(), llvm::EVT::isVector(), MergeBlocksConvert(), N, and llvm::ISD::TRUNCATE.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 6225 of file LoongArchISelLowering.cpp.
References llvm::ISD::ADD, assert(), DL, llvm::SelectionDAG::getNode(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValueType(), llvm::EVT::getVectorElementType(), llvm::EVT::isInteger(), isSigned(), llvm::EVT::isVector(), LHS, matchDeinterleaveBuildVector(), N, Opc, RHS, llvm::ISD::SIGN_EXTEND, llvm::ISD::SUB, and llvm::ISD::ZERO_EXTEND.
Referenced by performADDCombine(), and performSUBCombine().
|
static |
Definition at line 7773 of file LoongArchISelLowering.cpp.
References llvm::ISD::ADD, llvm::ISD::AND, llvm::ISD::ANY_EXTEND, llvm::ISD::CONCAT_VECTORS, llvm::ISD::CTLZ, llvm::ISD::CTPOP, DL, llvm::ISD::FADD, llvm::ISD::FDIV, llvm::ISD::FMA, llvm::ISD::FMUL, llvm::ISD::FSUB, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getNOT(), llvm::SDNode::getValueType(), llvm::ISD::INSERT_VECTOR_ELT, llvm::LoongArchSubtarget::is64Bit(), legalizeIntrinsicImmArg(), lowerVectorBitClear(), lowerVectorBitClearImm(), lowerVectorBitRevImm(), lowerVectorBitSetImm(), lowerVectorPickVE2GR(), lowerVectorSplatImm(), llvm::ISD::MUL, N, llvm::ISD::OR, llvm::ISD::SDIV, llvm::ISD::SHL, llvm::ISD::SMAX, llvm::ISD::SMIN, llvm::ISD::SRA, llvm::ISD::SREM, llvm::ISD::SRL, llvm::ISD::SUB, truncateVecElts(), llvm::ISD::UDIV, llvm::ISD::UMAX, llvm::ISD::UMIN, llvm::ISD::UREM, and llvm::ISD::XOR.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8344 of file LoongArchISelLowering.cpp.
References assert(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SDValue::getValueType(), and N.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8332 of file LoongArchISelLowering.cpp.
References llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), and N.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 6903 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::SelectionDAG::computeKnownBits(), llvm::dbgs(), DL, llvm::dyn_cast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::ConstantSDNode::getSExtValue(), llvm::SelectionDAG::getSignedConstant(), llvm::EVT::getSizeInBits(), llvm::ConstantSDNode::getZExtValue(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), llvm::isShiftedMask_64(), llvm::APInt::isSubsetOf(), LLVM_DEBUG, N, llvm::ISD::SHL, llvm::ISD::SRL, std::swap(), and llvm::KnownBits::Zero.
|
static |
Definition at line 7597 of file LoongArchISelLowering.cpp.
References llvm::ISD::ADD, llvm::ISD::AND, llvm::cast(), combine_CC(), DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLen(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getSignedConstant(), llvm::isa(), llvm::isInt(), llvm::isNullConstant(), LHS, N, RHS, llvm::ISD::SETGE, llvm::ISD::SETLT, llvm::ISD::SRA, and std::swap().
|
static |
Definition at line 7399 of file LoongArchISelLowering.cpp.
References Cond, DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getSelect(), llvm::SelectionDAG::getValueType(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), matchBinOpWithSharedOperand(), N, Opc, and llvm::ISD::SIGN_EXTEND_INREG.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), llvm::MipsTargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 6735 of file LoongArchISelLowering.cpp.
References llvm::cast(), llvm::ISD::DELETED_NODE, DL, llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getContext(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::EVT::getIntegerVT(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOperand(), llvm::EVT::getSizeInBits(), llvm::EVT::getVectorElementType(), llvm::EVT::getVectorNumElements(), llvm::SelectionDAG::getZExtOrTrunc(), llvm::ISD::isBuildVectorAllOnes(), llvm::ISD::isBuildVectorAllZeros(), N, Opc, llvm::ISD::SETCC, llvm::ISD::SETEQ, llvm::ISD::SETGE, llvm::ISD::SETGT, llvm::ISD::SETLE, llvm::ISD::SETLT, llvm::ISD::SETNE, and T.
Referenced by performBITCASTCombine().
|
static |
Definition at line 7258 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::cast(), checkValueWidth(), llvm::dyn_cast(), foldVMskZeroTest(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDNode::getOpcode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getSetCC(), llvm::SDNode::getValueType(), llvm::ConstantSDNode::isAllOnes(), llvm::ConstantSDNode::isZero(), N, llvm::SelectionDAG::ReplaceAllUsesWith(), llvm::ISD::SETEQ, llvm::ISD::SETNE, llvm::ISD::SEXTLOAD, llvm::ISD::TRUNCATE, llvm::ISD::XOR, llvm::ISD::ZERO_EXTEND, and llvm::ISD::ZEXTLOAD.
|
static |
Definition at line 6579 of file LoongArchISelLowering.cpp.
References assert(), DL, llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValueType(), llvm::EVT::getVectorElementType(), Imm, isConstantSplatVector(), isSigned(), llvm::TargetLoweringBase::isTypeLegal(), LHS, matchHalfOf128BitLanes(), N, Opc, RHS, llvm::ISD::SHL, llvm::ISD::SIGN_EXTEND, and llvm::ISD::ZERO_EXTEND.
|
static |
Definition at line 8546 of file LoongArchISelLowering.cpp.
References llvm::cast(), DL, ExtendSrcToDst(), llvm::MemSDNode::getAlign(), llvm::LoadSDNode::getBasePtr(), llvm::MemSDNode::getChain(), llvm::MachineMemOperand::getFlags(), llvm::SelectionDAG::getLoad(), llvm::MemSDNode::getMemOperand(), llvm::SelectionDAG::getNode(), llvm::MemSDNode::getPointerInfo(), llvm::EVT::getScalarSizeInBits(), llvm::EVT::getSizeInBits(), llvm::EVT::getVectorNumElements(), llvm::ISD::isNormalLoad(), llvm::isPowerOf2_32(), llvm::EVT::isSimple(), llvm::EVT::isVector(), llvm::Load, MergeBlocksConvert(), N, llvm::SelectionDAG::ReplaceAllUsesOfValueWith(), and llvm::ISD::SIGN_EXTEND.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8375 of file LoongArchISelLowering.cpp.
References C(), llvm::TargetLowering::DAGCombinerInfo::CombineTo(), DL, llvm::dyn_cast(), llvm::SelectionDAG::getConstant(), llvm::SDNode::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getUNDEF(), llvm::Hi, llvm::SDNode::isUndef(), llvm::Lo, and N.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 6624 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, DL, llvm::dyn_cast(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDNode::getOperand(), llvm::SDValue::getOperand(), llvm::ConstantSDNode::getZExtValue(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), llvm::isShiftedMask_64(), N, and uint64_t.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), llvm::MipsSETargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 6669 of file LoongArchISelLowering.cpp.
References N, and performHorizWideningCombine().
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), llvm::MipsTargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8610 of file LoongArchISelLowering.cpp.
References DL, ExtendSrcToDst(), llvm::EVT::isVector(), N, and llvm::ISD::ZERO_EXTEND.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Do target-specific dag combines on LoongArchISD::VANDN nodes.
Definition at line 8406 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::ISD::BUILD_VECTOR, C(), llvm::cast(), DL, llvm::dyn_cast(), llvm::SelectionDAG::getBitcast(), llvm::SelectionDAG::getConstant(), llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getNOT(), llvm::SDValue::getOpcode(), llvm::SelectionDAG::getSplat(), llvm::SelectionDAG::getTargetConstant(), llvm::SDNode::hasOneUse(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), llvm::ISD::isBuildVectorAllOnes(), llvm::ISD::isBuildVectorAllZeros(), isNOT(), llvm::SDNode::isOnlyUserOf(), llvm::SDValue::isUndef(), N, and llvm::ISD::OR.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8818 of file LoongArchISelLowering.cpp.
References llvm::ISD::ADD, llvm::ISD::AND, llvm::cast(), Cond, DL, llvm::SDValue::getNode(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::EVT::getSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::EVT::getVectorElementType(), llvm::TargetLowering::DAGCombinerInfo::isBeforeLegalizeOps(), isConstantSplatVector(), llvm::ISD::isConstantSplatVectorAllOnes(), llvm::ISD::isConstantSplatVectorAllZeros(), llvm::EVT::isInteger(), llvm::TargetLoweringBase::isTypeLegal(), llvm::EVT::isVector(), N, llvm::peekThroughBitcasts(), llvm::ISD::SETCC, llvm::ISD::SETEQ, llvm::ISD::SRA, llvm::ISD::SRL, and X.
Referenced by llvm::LoongArchTargetLowering::PerformDAGCombine(), llvm::MipsSETargetLowering::PerformDAGCombine(), and llvm::RISCVTargetLowering::PerformDAGCombine().
|
static |
Definition at line 8685 of file LoongArchISelLowering.cpp.
References llvm::Depth, DL, llvm::SelectionDAG::FoldConstantArithmetic(), llvm::SelectionDAG::getNode(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SDValue::getValueType(), llvm::SDValue::hasOneUse(), llvm::EVT::is256BitVector(), llvm::ISD::isBitwiseLogicOp(), llvm::ISD::isExtVecInRegOpcode(), llvm::TargetLoweringBase::isOperationLegalOrPromote(), llvm::SelectionDAG::MaxRecursionDepth, N, PromoteMaskArithmetic(), llvm::ISD::TRUNCATE, and llvm::ISD::ZERO_EXTEND.
Referenced by combineSext(), combineSignExtendInReg(), combineZext(), performEXTENDCombine(), PromoteMaskArithmetic(), PromoteMaskArithmetic(), PromoteMaskArithmetic(), and PromoteMaskArithmetic().
|
static |
Definition at line 8746 of file LoongArchISelLowering.cpp.
References llvm::ISD::ANY_EXTEND, assert(), DL, llvm::SelectionDAG::getNode(), llvm::SDValue::getValueType(), llvm::SelectionDAG::getValueType(), llvm::SelectionDAG::getZeroExtendInReg(), llvm::EVT::is256BitVector(), llvm::EVT::isVector(), llvm_unreachable, N, PromoteMaskArithmetic(), llvm::ISD::SIGN_EXTEND, llvm::ISD::SIGN_EXTEND_INREG, and llvm::ISD::ZERO_EXTEND.
|
static |
Definition at line 5608 of file LoongArchISelLowering.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, llvm::Acquire, llvm::AcquireRelease, assert(), llvm::ISD::BUILD_PAIR, llvm::cast(), DL, llvm::SelectionDAG::getMachineNode(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getVTList(), llvm_unreachable, llvm::Monotonic, N, llvm::Release, Results, llvm::SequentiallyConsistent, llvm::SelectionDAG::setNodeMemRefs(), and llvm::SelectionDAG::SplitScalar().
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults().
|
static |
Definition at line 5541 of file LoongArchISelLowering.cpp.
References llvm_unreachable, N, replaceVecCondBranchResults(), replaceVPICKVE2GRResults(), and Results.
Referenced by llvm::LoongArchTargetLowering::ReplaceNodeResults().
|
static |
Definition at line 5527 of file LoongArchISelLowering.cpp.
References DL, llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValue(), N, Results, and llvm::ISD::TRUNCATE.
Referenced by replaceINTRINSIC_WO_CHAINResults().
|
static |
Definition at line 5506 of file LoongArchISelLowering.cpp.
References DL, emitErrorAndReplaceIntrinsicResults(), llvm::SelectionDAG::getConstant(), llvm::LoongArchSubtarget::getGRLenVT(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValue(), llvm::SDValue::getValueType(), llvm::SelectionDAG::getValueType(), llvm::EVT::getVectorElementType(), Imm, llvm::isUInt(), Results, and llvm::ISD::TRUNCATE.
Referenced by replaceINTRINSIC_WO_CHAINResults().
|
static |
Definition at line 6709 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::ISD::BUILD_VECTOR, DL, llvm::ISD::FREEZE, llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getSelect(), llvm_unreachable, llvm::ISD::OR, llvm::ISD::SELECT, llvm::ISD::SETCC, llvm::ISD::SIGN_EXTEND, signExtendBitcastSrcVector(), llvm::ISD::TRUNCATE, llvm::ISD::VSELECT, and llvm::ISD::XOR.
Referenced by combineBitcastvxi1(), performBITCASTCombine(), signExtendBitcastSrcVector(), and signExtendBitcastSrcVector().
| STATISTIC | ( | NumTailCalls | , |
| "Number of tail calls" | ) |
Definition at line 7343 of file LoongArchISelLowering.cpp.
References llvm::cast(), and llvm::ISD::SIGN_EXTEND_INREG.
Referenced by matchBinOpWithSharedOperand().
|
static |
Definition at line 1378 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, llvm::bit_width(), C(), DL, llvm::dyn_cast(), llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::ISD::getSetCCSwappedOperands(), llvm::isa(), llvm::isInt(), llvm::isMask_64(), llvm::isNullConstant(), llvm::isPowerOf2_64(), LHS, llvm::Log2_64(), RHS, llvm::ISD::SETEQ, llvm::ISD::SETGE, llvm::ISD::SETGT, llvm::ISD::SETLE, llvm::ISD::SETLT, llvm::ISD::SETUGT, llvm::ISD::SETULE, llvm::ISD::SHL, std::swap(), and uint64_t.
Referenced by combine_CC(), and combine_CC().
|
static |
Definition at line 7685 of file LoongArchISelLowering.cpp.
References llvm::ISD::AND, DL, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), and llvm::SDValue::getScalarValueSizeInBits().
Referenced by lowerMSABitClear(), lowerVectorBitClear(), and performINTRINSIC_WO_CHAINCombine().
|
static |
Definition at line 10134 of file LoongArchISelLowering.cpp.
References assert(), llvm::MachineFrameInfo::CreateFixedObject(), DL, llvm::SelectionDAG::getCopyFromReg(), llvm::MachinePointerInfo::getFixedStack(), llvm::SelectionDAG::getFrameIndex(), llvm::MachineFunction::getFrameInfo(), llvm::SelectionDAG::getLoad(), llvm::CCValAssign::getLocMemOffset(), llvm::CCValAssign::getLocReg(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getMachineFunction(), llvm::SelectionDAG::getNode(), llvm::MachineFunction::getRegInfo(), llvm::CCValAssign::getValVT(), llvm::Hi, llvm::CCValAssign::isMemLoc(), llvm::CCValAssign::isRegLoc(), and llvm::Lo.
Referenced by llvm::LoongArchTargetLowering::LowerFormalArguments().
|
static |
Definition at line 10109 of file LoongArchISelLowering.cpp.
References llvm::CCValAssign::BCvt, llvm::MachineFrameInfo::CreateFixedObject(), DL, llvm::CCValAssign::Full, llvm::SelectionDAG::getDataLayout(), llvm::SelectionDAG::getExtLoad(), llvm::MachinePointerInfo::getFixedStack(), llvm::SelectionDAG::getFrameIndex(), llvm::MachineFunction::getFrameInfo(), llvm::MVT::getIntegerVT(), llvm::CCValAssign::getLocInfo(), llvm::CCValAssign::getLocMemOffset(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getMachineFunction(), llvm::DataLayout::getPointerSizeInBits(), llvm::EVT::getStoreSize(), llvm::CCValAssign::getValVT(), llvm::CCValAssign::Indirect, llvm_unreachable, and llvm::ISD::NON_EXTLOAD.
|
static |
Definition at line 10076 of file LoongArchISelLowering.cpp.
References llvm::LoongArchMachineFunctionInfo::addSExt32Register(), llvm::BitWidth, convertLocVTToValVT(), DL, llvm::Function::getArg(), llvm::SelectionDAG::getCopyFromReg(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getInfo(), llvm::Type::getIntegerBitWidth(), llvm::CCValAssign::getLocReg(), llvm::CCValAssign::getLocVT(), llvm::SelectionDAG::getMachineFunction(), llvm::TargetLoweringBase::getRegClassFor(), llvm::MachineFunction::getRegInfo(), llvm::EVT::getSimpleVT(), llvm::Value::getType(), and llvm::Type::isIntegerTy().
|
static |
Definition at line 1637 of file LoongArchISelLowering.cpp.
References DL, llvm::SelectionDAG::getBitcast(), llvm::MVT::getFloatingPointVT(), llvm::MVT::getIntegerVT(), llvm::MVT::getScalarSizeInBits(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::MVT::getVectorNumElements(), llvm::SelectionDAG::getVectorShuffle(), llvm::MVT::getVectorVT(), llvm::MVT::isFloatingPoint(), llvm::TargetLoweringBase::isTypeLegal(), llvm::V1, and llvm::widenShuffleMaskElts().
Referenced by lower128BitShuffle(), and lower256BitShuffle().
Definition at line 9768 of file LoongArchISelLowering.cpp.
Referenced by CC_LoongArch(), CC_RISCV_Impl(), and llvm::RISCV::getArgFPRs().
Definition at line 9772 of file LoongArchISelLowering.cpp.
Referenced by CC_LoongArch(), CC_RISCV_Impl(), and llvm::RISCV::getArgFPRs().
Definition at line 9741 of file LoongArchISelLowering.cpp.
Referenced by allocateArgGPR(), llvm::CC_CSKY_ABIV2_SOFT_64(), CC_LoongArch(), CC_RISCV_FastCC(), CC_RISCV_Impl(), CC_RISCVAssign2XLen(), llvm::LoongArchTargetLowering::LowerFormalArguments(), and llvm::Ret_CSKY_ABIV2_SOFT_64().
Definition at line 9776 of file LoongArchISelLowering.cpp.
Referenced by allocateRVVReg(), CC_LoongArch(), and llvm::RISCV::getArgVRs().
Definition at line 9780 of file LoongArchISelLowering.cpp.
Referenced by CC_LoongArch().
|
static |
Definition at line 9757 of file LoongArchISelLowering.cpp.
Referenced by allocateArgGPR().