Lines Matching +full:ext +full:- +full:regs

1 //===- SPIRVModuleAnalysis.cpp - analysis of global instrs & regs - C++ -*-===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
15 //===----------------------------------------------------------------------===//
31 #define DEBUG_TYPE "spirv-module-analysis"
34 SPVDumpDeps("spv-dump-deps",
35 cl::desc("Dump MIR with SPIR-V dependencies info"),
39 AvoidCapabilities("avoid-spirv-capabilities",
40 cl::desc("SPIR-V capabilities to avoid if there are "
44 "SPIR-V Shader capability")));
66 if (MdNode && OpIndex < MdNode->getNumOperands()) { in getMetadataUInt()
67 const auto &Op = MdNode->getOperand(OpIndex); in getMetadataUInt()
68 return mdconst::extract<ConstantInt>(Op)->getZExtValue(); in getMetadataUInt()
100 // By SPIR-V specification: "If an instruction, enumerant, or other in getSymbolicOperandRequirements()
112 if (i == Sz - 1 || !AvoidCaps.S.contains(Cap)) in getSymbolicOperandRequirements()
120 if (llvm::all_of(ReqExts, [&ST](const SPIRV::Extension::Extension &Ext) { in getSymbolicOperandRequirements() argument
121 return ST.canUseExtension(Ext); in getSymbolicOperandRequirements()
146 auto MemMD = MemModel->getOperand(0); in setBaseInfo()
153 MAI.Mem = ST->isOpenCLEnv() ? SPIRV::MemoryModel::OpenCL in setBaseInfo()
156 unsigned PtrSize = ST->getPointerSize(); in setBaseInfo()
169 // Construct version literal in accordance with SPIRV-LLVM-Translator. in setBaseInfo()
171 assert(VerNode->getNumOperands() > 0 && "Invalid SPIR"); in setBaseInfo()
172 auto VersionMD = VerNode->getOperand(0); in setBaseInfo()
182 // run-times with Unknown/0.0 version output. For a reference, LLVM-SPIRV in setBaseInfo()
183 // Translator avoids potential issues with run-times in a similar manner. in setBaseInfo()
184 if (ST->isOpenCLEnv()) { in setBaseInfo()
194 for (unsigned I = 0, E = ExtNode->getNumOperands(); I != E; ++I) { in setBaseInfo()
195 MDNode *MD = ExtNode->getOperand(I); in setBaseInfo()
196 if (!MD || MD->getNumOperands() == 0) in setBaseInfo()
198 for (unsigned J = 0, N = MD->getNumOperands(); J != N; ++J) in setBaseInfo()
199 MAI.SrcExt.insert(cast<MDString>(MD->getOperand(J))->getString()); in setBaseInfo()
212 if (ST->isOpenCLEnv()) { in setBaseInfo()
225 assert(MAI->hasRegisterAlias(MF, Reg) && "Cannot find register alias"); in collectDefInstr()
226 MachineInstr *MI = MF->getRegInfo().getUniqueVRegDef(Reg); in collectDefInstr()
228 MAI->setSkipEmission(MI); in collectDefInstr()
230 MAI->MS[MSType].push_back(MI); in collectDefInstr()
249 // Traversing deps graph in post-order allows us to get rid of in collectGlobalEntities()
251 // But pre-order is required for correct processing of function in collectGlobalEntities()
254 for (auto *S : E->getDeps()) in collectGlobalEntities()
263 if (!MF->getRegInfo().getUniqueVRegDef(Reg)) in collectGlobalEntities()
267 if (E->getIsGV()) in collectGlobalEntities()
268 MAI.GlobalVarList.push_back(MF->getRegInfo().getUniqueVRegDef(Reg)); in collectGlobalEntities()
272 for (auto *S : E->getDeps()) in collectGlobalEntities()
286 GR->buildDepsGraph(DepsGraph, SPVDumpDeps ? MMI : nullptr); in processDefInstrs()
290 [](const SPIRV::DTSortableEntry *E) { return !E->getIsFunc(); }); in processDefInstrs()
293 MachineFunction *MF = MMI->getMachineFunction(*F); in processDefInstrs()
301 auto Ext = SPIRV::Extension::Extension(MI.getOperand(0).getImm()); in processDefInstrs() local
302 MAI.Reqs.addExtension(Ext); in processDefInstrs()
315 [](const SPIRV::DTSortableEntry *E) { return E->getIsFunc(); }, true); in processDefInstrs()
328 auto Lnk = MI.getOperand(MI.getNumOperands() - 1).getImm(); in collectFuncNames()
332 F->getParent()->getFunction(getStringImm(MI, 2)); in collectFuncNames()
339 Register Reg = MI.defs().begin()->getReg(); in collectFuncNames()
352 if (MI->getOpcode() == SPIRV::OpConstantFunctionPointerINTEL) in collectFuncPtrs()
357 const MachineOperand *FunUse = &MI->getOperand(2); in collectFuncPtrs()
358 if (const MachineOperand *FunDef = GR->getFunctionDefinitionByUse(FunUse)) { in collectFuncPtrs()
359 const MachineInstr *FunDefMI = FunDef->getParent(); in collectFuncPtrs()
360 assert(FunDefMI->getOpcode() == SPIRV::OpFunction && in collectFuncPtrs()
362 Register FunDefReg = FunDef->getReg(); in collectFuncPtrs()
364 MAI.getRegisterAlias(FunDefMI->getMF(), FunDefReg); in collectFuncPtrs()
367 Register FunPtrReg = FunUse->getReg(); in collectFuncPtrs()
368 MAI.setRegisterAlias(MI->getMF(), FunPtrReg, GlobalFunDefReg); in collectFuncPtrs()
416 // Some global instructions make reference to function-local ID regs, so cannot
423 MachineFunction *MF = MMI->getMachineFunction(*F); in processOtherInstrs()
434 } else if (TII->isDecorationInstr(MI)) { in processOtherInstrs()
437 } else if (TII->isConstantInstr(MI)) { in processOtherInstrs()
457 MachineFunction *MF = MMI->getMachineFunction(*F); in numberRegistersGlobally()
500 if (!IsNewlyInserted) // Don't re-add if it's already been declared. in addCapabilities()
512 report_fatal_error("Adding SPIR-V requirements this target can't satisfy."); in addRequirements()
523 report_fatal_error("Adding SPIR-V requirements that can't be satisfied."); in addRequirements()
534 report_fatal_error("Adding SPIR-V requirements that can't be satisfied."); in addRequirements()
550 dbgs() << "Target SPIR-V version too high for required features\n" in checkSatisfiable()
557 LLVM_DEBUG(dbgs() << "Target SPIR-V version too low for required features\n" in checkSatisfiable()
567 << "Required SPIR-V min version: " << MinVersion in checkSatisfiable()
568 << " required SPIR-V max version " << MaxVersion << "\n"); in checkSatisfiable()
582 for (auto Ext : AllExtensions) { in checkSatisfiable() local
583 if (ST.canUseExtension(Ext)) in checkSatisfiable()
587 OperandCategory::ExtensionOperand, Ext) in checkSatisfiable()
593 report_fatal_error("Unable to meet SPIR-V requirements for this target."); in checkSatisfiable()
624 report_fatal_error("Unimplemented environment for SPIR-V generation."); in initAvailableCapabilities()
629 // Add the min requirements for different OpenCL and SPIR-V versions. in initAvailableCapabilitiesForOpenCL()
701 int64_t LinkageOp = MI.getOperand(MI.getNumOperands() - 1).getImm(); in addOpDecorateReqs()
774 "The atomic float instruction requires the following SPIR-V " \
782 SPIRVType *TypeDef = MI.getMF()->getRegInfo().getVRegDef(TypeReg); in AddAtomicFloatRequirements()
783 if (TypeDef->getOpcode() != SPIRV::OpTypeFloat) in AddAtomicFloatRequirements()
785 "floating-point type scalar"); in AddAtomicFloatRequirements()
787 unsigned BitWidth = TypeDef->getOperand(1).getImm(); in AddAtomicFloatRequirements()
809 "Unexpected floating-point type width in atomic float instruction"); in AddAtomicFloatRequirements()
828 "Unexpected floating-point type width in atomic float instruction"); in AddAtomicFloatRequirements()
895 const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo(); in addInstrRequirements()
897 if (TypeDef->getOpcode() == SPIRV::OpTypeFloat && in addInstrRequirements()
898 TypeDef->getOperand(1).getImm() == 16) in addInstrRequirements()
970 const MachineRegisterInfo &MRI = MI.getMF()->getRegInfo(); in addInstrRequirements()
977 assert(InstrPtr->getOperand(1).isReg() && "Unexpected operand in atomic"); in addInstrRequirements()
978 Register TypeReg = InstrPtr->getOperand(1).getReg(); in addInstrRequirements()
980 if (TypeDef->getOpcode() == SPIRV::OpTypeInt) { in addInstrRequirements()
981 unsigned BitWidth = TypeDef->getOperand(1).getImm(); in addInstrRequirements()
1109 "following SPIR-V extension: SPV_KHR_subgroup_rotate", in addInstrRequirements()
1132 "following SPIR-V extension: SPV_KHR_shader_clock", in addInstrRequirements()
1175 "following SPIR-V extension: SPV_KHR_cooperative_matrix", in addInstrRequirements()
1195 MachineFunction *MF = MMI->getMachineFunction(*F); in collectReqs()
1208 for (unsigned i = 0; i < Node->getNumOperands(); i++) { in collectReqs()
1209 MDNode *MDN = cast<MDNode>(Node->getOperand(i)); in collectReqs()
1210 const MDOperand &MDOp = MDN->getOperand(1); in collectReqs()
1212 Constant *C = CMeta->getValue(); in collectReqs()
1214 auto EM = Const->getZExtValue(); in collectReqs()
1316 MachineFunction *MF = MMI->getMachineFunction(*F); in addDecorations()
1336 GR = ST->getSPIRVGlobalRegistry(); in runOnModule()
1337 TII = ST->getInstrInfo(); in runOnModule()
1355 if (GR->hasConstFunPtr()) in runOnModule()
1366 GR->setBound(MAI.MaxID); in runOnModule()