|
LLVM 24.0.0git
|
#include "SPIRV.h"#include "SPIRVSubtarget.h"#include "SPIRVUtils.h"#include "llvm/ADT/PostOrderIterator.h"#include "llvm/CodeGen/GlobalISel/CSEInfo.h"#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"#include "llvm/CodeGen/MachinePassManager.h"#include "llvm/IR/Analysis.h"#include "llvm/IR/Attributes.h"#include "llvm/IR/Constants.h"#include "llvm/IR/InstrTypes.h"#include "llvm/IR/IntrinsicsSPIRV.h"#include "llvm/Support/MathExtras.h"Go to the source code of this file.
Classes | |
| struct | NarrowWideningInfo |
Namespaces | |
| namespace | llvm |
| This is an optimization pass for GlobalISel generic memory operations. | |
Macros | |
| #define | DEBUG_TYPE "spirv-prelegalizer" |
| #define DEBUG_TYPE "spirv-prelegalizer" |
Definition at line 31 of file SPIRVPreLegalizer.cpp.
|
static |
Definition at line 58 of file SPIRVPreLegalizer.cpp.
References llvm::SPIRVIRMapping::add(), llvm::SPIRVGlobalRegistry::addGlobalObject(), llvm::MachineInstr::addOperand(), assert(), llvm::cast(), llvm::MachineOperand::CreateReg(), llvm::dyn_cast(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::SPIRVIRMapping::find(), llvm::MachineFunction::front(), llvm::MachineBasicBlock::getFirstNonPHI(), llvm::SPIRVSubtarget::getInstrInfo(), llvm::MachineInstr::getOpcode(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVType(), llvm::MachineRegisterInfo::getRegClassOrNull(), llvm::MachineFunction::getRegInfo(), llvm::SPIRVGlobalRegistry::getSPIRVTypeID(), llvm::MachineRegisterInfo::getVRegDef(), invalidateAndEraseMI(), llvm::isSpvIntrinsic(), llvm::Register::isValid(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, llvm::MachineRegisterInfo::replaceRegWith(), llvm::MachineInstr::setDesc(), and llvm::MachineRegisterInfo::setRegClass().
Referenced by runPreLegalizer().
|
static |
Definition at line 184 of file SPIRVPreLegalizer.cpp.
References llvm::MachineInstrBuilder::addDef(), llvm::MachineInstrBuilder::addUse(), assert(), llvm::MachineIRBuilder::buildInstr(), llvm::MachineIRBuilder::getMRI(), llvm::SPIRVGlobalRegistry::getRegClass(), llvm::MachineRegisterInfo::getRegClassOrNull(), llvm::SPIRVGlobalRegistry::getSPIRVTypeForVReg(), llvm::SPIRVGlobalRegistry::getSPIRVTypeID(), llvm::SPIRVGlobalRegistry::isBitcastCompatible(), llvm::report_fatal_error(), and llvm::MachineRegisterInfo::setRegClass().
Referenced by lowerBitcasts().
|
static |
Definition at line 1296 of file SPIRVPreLegalizer.cpp.
References invalidateAndEraseMI(), llvm::isSpvIntrinsic(), MBB, MI, and llvm::SmallVectorTemplateBase< T, bool >::push_back().
Referenced by runPreLegalizer().
|
static |
Definition at line 1038 of file SPIRVPreLegalizer.cpp.
References AbstractManglingParser< Derived, Alloc >::Ops, F, llvm::MachineOperand::getImm(), llvm::MachineOperand::getReg(), llvm::MachineOperand::isDef(), llvm::MachineOperand::isImm(), llvm::MachineOperand::isMetadata(), llvm::MachineOperand::isReg(), MI, and llvm::InlineAsm::MIOp_FirstOperand.
Referenced by insertInlineAsmProcess().
|
static |
Definition at line 170 of file SPIRVPreLegalizer.cpp.
References I, llvm::isSpvIntrinsic(), Reg, llvm::MachineRegisterInfo::use_instr_begin(), llvm::MachineRegisterInfo::use_instr_end(), and UseMI.
Referenced by insertBitcasts().
|
static |
Definition at line 148 of file SPIRVPreLegalizer.cpp.
References llvm::buildOpName(), llvm::cast(), llvm::MDNode::getOperand(), invalidateAndEraseMI(), llvm::isSpvIntrinsic(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::MachineIRBuilder::setInsertPt().
Referenced by runPreLegalizer().
|
static |
Definition at line 727 of file SPIRVPreLegalizer.cpp.
References llvm::SPIRVIRMapping::add(), llvm::addressSpaceToStorageClass(), llvm::SPIRVGlobalRegistry::addValueAttrs(), assert(), llvm::MachineIRBuilder::buildAnd(), llvm::MachineIRBuilder::buildBuildVectorConstant(), llvm::MachineIRBuilder::buildConstant(), llvm::cast(), llvm::LLT::changeElementSize(), llvm::MachineRegisterInfo::createGenericVirtualRegister(), E(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::SPIRVIRMapping::find(), llvm::VectorType::get(), llvm::MachineOperand::getCImm(), llvm::LLT::getElementCount(), llvm::MachineOperand::getFPImm(), llvm::APInt::getLowBitsSet(), llvm::getMDOperandAsType(), llvm::MachineOperand::getMetadata(), llvm::MachineIRBuilder::getMF(), llvm::LLT::getNumElements(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MDNode::getOperand(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVType(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClassOrNull(), llvm::MachineFunction::getRegInfo(), llvm::LLT::getScalarSizeInBits(), llvm::SPIRVGlobalRegistry::getSPIRVTypeForVReg(), llvm::MachineRegisterInfo::getType(), llvm::Value::getType(), llvm::SPIRVGlobalRegistry::getTypeForSPIRVType(), llvm::getVRegDef(), llvm::MachineRegisterInfo::getVRegDef(), I, invalidateAndEraseMI(), llvm::isa(), llvm::LLT::isScalar(), llvm::isSpvIntrinsic(), llvm::LLT::isValid(), llvm::Register::isValid(), llvm::LLT::isVector(), llvm::isVector1(), MBB, MI, NarrowWideningInfo::OrigWidth, llvm::passCopy(), llvm::post_order(), propagateSPIRVType(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), recordNarrowOperandWidths(), Reg, llvm::MachineRegisterInfo::replaceRegWith(), llvm::MachineIRBuilder::setInsertPt(), llvm::MachineRegisterInfo::setType(), llvm::SPIRVGlobalRegistry::setUntypedPtrElementType(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::try_emplace(), llvm::updateRegType(), widenBitCountOps(), widenBitWidthToNextPow2(), widenCImmType(), widenScalarType(), and widenSignSensitiveOps().
Referenced by runPreLegalizer().
|
static |
Definition at line 436 of file SPIRVPreLegalizer.cpp.
References llvm::MachineRegisterInfo::getType(), Reg, and widenBitWidthToNextPow2().
Referenced by recordNarrowOperandWidths().
|
static |
Definition at line 1228 of file SPIRVPreLegalizer.cpp.
References assert(), E(), llvm::APInt::getBitWidth(), llvm::getImm(), llvm::MachineRegisterInfo::getType(), I, llvm_unreachable, llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_MInstr(), llvm::MIPatternMatch::mi_match(), Reg, and llvm::APInt::shl().
Referenced by processSwitchesConstants().
|
static |
Definition at line 250 of file SPIRVPreLegalizer.cpp.
References llvm::addressSpaceToStorageClass(), assert(), llvm::SPIRVGlobalRegistry::assignSPIRVTypeToVReg(), llvm::MachineIRBuilder::buildBitcast(), findAssignTypeInstr(), llvm::getMDOperandAsType(), llvm::MachineIRBuilder::getMF(), llvm::MachineIRBuilder::getMRI(), llvm::MachineInstr::getOpcode(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVPointerType(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVType(), llvm::SPIRVGlobalRegistry::getSPIRVTypeForVReg(), llvm::SPIRVGlobalRegistry::getUntypedPtrElementType(), invalidateAndEraseMI(), llvm::isa(), llvm::isSpvIntrinsic(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::MachineRegisterInfo::replaceRegWith(), and llvm::MachineIRBuilder::setInsertPt().
Referenced by runPreLegalizer().
|
static |
Definition at line 1166 of file SPIRVPreLegalizer.cpp.
References insertInlineAsmProcess(), llvm::isSpvIntrinsic(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::report_fatal_error(), and llvm::SmallVectorTemplateCommon< T, typename >::size().
Referenced by runPreLegalizer().
|
static |
Definition at line 1066 of file SPIRVPreLegalizer.cpp.
References llvm::SPIRVIRMapping::add(), llvm::MachineInstrBuilder::addDef(), llvm::MachineInstrBuilder::addImm(), llvm::addStringImm(), llvm::MachineInstrBuilder::addUse(), assert(), llvm::SPIRVGlobalRegistry::assignSPIRVTypeToVReg(), llvm::iterator_range< IteratorT >::begin(), llvm::MachineIRBuilder::buildInstr(), llvm::cast(), collectInlineAsmInstrOperands(), llvm::MachineRegisterInfo::createGenericVirtualRegister(), llvm::MachineInstr::defs(), llvm::InlineAsm::Extra_HasSideEffects, llvm::Function::getContext(), llvm::MachineFunction::getFunction(), llvm::getMDOperandAsType(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::SPIRVGlobalRegistry::getOrCreateOpTypeFunctionWithArgs(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVType(), llvm::MachineOperand::getReg(), llvm::MachineFunction::getRegInfo(), llvm::SPIRVGlobalRegistry::getRegType(), llvm::SPIRVGlobalRegistry::getSPIRVTypeID(), llvm::Type::getVoidTy(), llvm::MachineRegisterInfo::hasOneUse(), invalidateAndEraseMI(), llvm::isSpvIntrinsic(), llvm::Register::isValid(), MI, llvm::InlineAsm::MIOp_AsmString, llvm::InlineAsm::MIOp_ExtraInfo, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::MachineRegisterInfo::replaceRegWith(), llvm::LLT::scalar(), llvm::MachineIRBuilder::setInsertPt(), llvm::MachineRegisterInfo::setRegClass(), llvm::MachineRegisterInfo::setType(), llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::MachineRegisterInfo::use_instr_begin().
Referenced by insertInlineAsm().
|
static |
Definition at line 1188 of file SPIRVPreLegalizer.cpp.
References llvm::APFloat::bitcastToAPInt(), llvm::SPIRVGlobalRegistry::buildMemAliasingOpDecorate(), llvm::buildOpDecorate(), llvm::buildOpSpirvDecorations(), llvm::cast(), llvm::mdconst::dyn_extract(), llvm::MachineIRBuilder::getMF(), llvm::MachineFunction::getSubtarget(), llvm::ConstantFP::getValueAPF(), llvm::APInt::getZExtValue(), invalidateAndEraseMI(), llvm::isSpvIntrinsic(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::MachineIRBuilder::setInsertPt().
Referenced by runPreLegalizer().
|
inlinestatic |
Definition at line 51 of file SPIRVPreLegalizer.cpp.
References llvm::SPIRVGlobalRegistry::invalidateMachineInstr(), and MI.
Referenced by addConstantsToTrack(), cleanupHelperInstructions(), foldConstantsIntoIntrinsics(), generateAssignInstrs(), insertBitcasts(), insertInlineAsmProcess(), insertSpirvDecorations(), lowerBitcasts(), and processBlockAddr().
|
static |
Definition at line 1414 of file SPIRVPreLegalizer.cpp.
References E(), llvm::isSpvIntrinsic(), and MBB.
Referenced by removeImplicitFallthroughs().
|
static |
Definition at line 528 of file SPIRVPreLegalizer.cpp.
References llvm::CmpInst::isSigned(), and MI.
Referenced by recordNarrowOperandWidths().
Definition at line 555 of file SPIRVPreLegalizer.cpp.
Referenced by recordNarrowOperandWidths().
|
static |
Definition at line 214 of file SPIRVPreLegalizer.cpp.
References assert(), llvm::MachineIRBuilder::buildCopy(), buildOpBitcast(), llvm::SPIRVGlobalRegistry::getSPIRVTypeForVReg(), invalidateAndEraseMI(), llvm::isSpvIntrinsic(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::MachineIRBuilder::setInsertPt().
Referenced by runPreLegalizer().
|
static |
Definition at line 1313 of file SPIRVPreLegalizer.cpp.
References assert(), llvm::MachineOperand::CreateMBB(), llvm::Constant::destroyConstant(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::BlockAddress::getBasicBlock(), llvm::MachineOperand::getBlockAddress(), llvm::Function::getContext(), llvm::MachineFunction::getFunction(), llvm::Type::getInt32Ty(), llvm::ConstantExpr::getIntToPtr(), llvm::MachineInstr::getOpcode(), llvm::MachineInstr::getOperand(), llvm::MachineFunction::getRegInfo(), llvm::Value::getType(), llvm::MachineRegisterInfo::getVRegDef(), llvm::SmallPtrSetImpl< PtrType >::insert(), invalidateAndEraseMI(), llvm::MachineOperand::isBlockAddress(), llvm::isSpvIntrinsic(), MBB, MI, llvm::Next, llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, llvm::Value::replaceAllUsesWith(), llvm::report_fatal_error(), and llvm::SmallVectorTemplateCommon< T, typename >::size().
Referenced by runPreLegalizer().
|
static |
Definition at line 1027 of file SPIRVPreLegalizer.cpp.
References llvm::MachineFunction::getRegInfo(), llvm::isTypeFoldingSupported(), MBB, MI, and llvm::processInstr().
Referenced by runPreLegalizer().
|
static |
Definition at line 1263 of file SPIRVPreLegalizer.cpp.
References assert(), llvm::MachineOperand::CreateCImm(), llvm::Function::getContext(), llvm::MachineFunction::getFunction(), llvm::MachineFunction::getRegInfo(), getSwitchCaseValue(), llvm::isSpvIntrinsic(), MBB, MI, llvm::SmallVectorTemplateBase< T, bool >::push_back(), Reg, and llvm::SmallVectorTemplateCommon< T, typename >::size().
Referenced by runPreLegalizer().
|
static |
Definition at line 321 of file SPIRVPreLegalizer.cpp.
References llvm::addressSpaceToStorageClass(), assert(), llvm::SPIRVGlobalRegistry::assignSPIRVTypeToVReg(), llvm::SPIRVGlobalRegistry::changePointerStorageClass(), llvm::TypedPointerType::get(), llvm::SPIRVGlobalRegistry::getDeducedGlobalValueType(), llvm::MachineIRBuilder::getMF(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVType(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVVectorType(), llvm::SPIRVGlobalRegistry::getPointerStorageClass(), llvm::SPIRVGlobalRegistry::getRegClass(), llvm::MachineRegisterInfo::getRegClassOrNull(), llvm::SPIRVGlobalRegistry::getScalarOrVectorBitWidth(), llvm::SPIRVGlobalRegistry::getScalarOrVectorComponentCount(), llvm::LLT::getScalarSizeInBits(), llvm::SPIRVGlobalRegistry::getSPIRVTypeForVReg(), llvm::MachineFunction::getSubtarget(), llvm::MachineRegisterInfo::getType(), llvm::MachineRegisterInfo::getVRegDef(), llvm::Global, llvm::isa(), llvm::SPIRVTypeInst::isPointer(), MI, propagateSPIRVType(), Reg, llvm::MachineIRBuilder::setInsertPt(), llvm::MachineRegisterInfo::setRegClass(), llvm::storageClassToAddressSpace(), and llvm::toTypedPointer().
Referenced by generateAssignInstrs(), and propagateSPIRVType().
|
static |
Definition at line 571 of file SPIRVPreLegalizer.cpp.
References assert(), getNarrowScalarWidth(), isSignSensitiveOp(), isWidthSensitiveBitCountOp(), LHS, MBB, MI, N, Reg, and RHS.
Referenced by generateAssignInstrs().
|
static |
Definition at line 1433 of file SPIRVPreLegalizer.cpp.
References assert(), llvm::MachineIRBuilder::buildBr(), isImplicitFallthrough(), MBB, and llvm::MachineIRBuilder::setInsertPt().
Referenced by runPreLegalizer().
|
static |
Definition at line 1447 of file SPIRVPreLegalizer.cpp.
References addConstantsToTrack(), cleanupHelperInstructions(), foldConstantsIntoIntrinsics(), generateAssignInstrs(), llvm::MachineFunction::getSubtarget(), insertBitcasts(), insertInlineAsm(), insertSpirvDecorations(), lowerBitcasts(), processBlockAddr(), processInstrsWithTypeFolding(), processSwitchesConstants(), and removeImplicitFallthroughs().
Referenced by llvm::SPIRVPreLegalizerPass::run().
|
static |
Definition at line 468 of file SPIRVPreLegalizer.cpp.
References MBB, and llvm::MachineIRBuilder::setInsertPt().
Referenced by llvm::updateRegType(), and widenBitCountOps().
|
static |
Definition at line 661 of file SPIRVPreLegalizer.cpp.
References llvm::MachineIRBuilder::buildConstant(), llvm::MachineIRBuilder::buildOr(), llvm::MachineIRBuilder::buildShl(), llvm::MachineIRBuilder::buildSub(), llvm::MachineIRBuilder::buildZExtInReg(), llvm::Count, llvm::createVirtualRegister(), llvm::APInt::getBitWidth(), llvm::APInt::getLowBitsSet(), llvm::APInt::getOneBitSet(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(), llvm::APInt::isSubsetOf(), llvm_unreachable, llvm::MIPatternMatch::m_GAnd(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), llvm::Masked, MI, llvm::MIPatternMatch::mi_match(), llvm::LLT::scalar(), setInsertPtAfterDef(), llvm::MachineIRBuilder::setInstrAndDebugLoc(), widenBitWidthToNextPow2(), and widenScalarType().
Referenced by generateAssignInstrs().
Definition at line 429 of file SPIRVPreLegalizer.cpp.
References llvm::BitWidth, and llvm::PowerOf2Ceil().
Referenced by generateAssignInstrs(), getNarrowScalarWidth(), widenBitCountOps(), widenCImmType(), widenScalarType(), and widenSignSensitiveOps().
|
static |
Definition at line 457 of file SPIRVPreLegalizer.cpp.
References llvm::ConstantInt::getBitWidth(), llvm::MachineOperand::getCImm(), llvm::Type::getContext(), llvm::Value::getType(), llvm::ConstantInt::getValue(), llvm::MachineOperand::setCImm(), widenBitWidthToNextPow2(), and llvm::APInt::zextOrTrunc().
Referenced by generateAssignInstrs().
|
static |
Definition at line 447 of file SPIRVPreLegalizer.cpp.
References llvm::LLT::getScalarSizeInBits(), llvm::MachineRegisterInfo::getType(), Reg, llvm::LLT::scalar(), llvm::MachineRegisterInfo::setType(), and widenBitWidthToNextPow2().
Referenced by generateAssignInstrs(), and widenBitCountOps().
|
static |
Definition at line 614 of file SPIRVPreLegalizer.cpp.
References llvm::SPIRVGlobalRegistry::assignSPIRVTypeToVReg(), llvm::MachineIRBuilder::buildSExtInReg(), llvm::MachineRegisterInfo::createGenericVirtualRegister(), llvm::SPIRVGlobalRegistry::getOrCreateSPIRVIntegerType(), llvm::SPIRVGlobalRegistry::getRegClass(), LHS, MI, N, Reg, RHS, llvm::LLT::scalar(), llvm::MachineIRBuilder::setInsertPt(), llvm::MachineRegisterInfo::setRegClass(), llvm::MachineRegisterInfo::setType(), and widenBitWidthToNextPow2().
Referenced by generateAssignInstrs().