[llvm] [SPIRV] Fix enqueue empty kernel (PR #187671)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 16 05:59:46 PDT 2026
================
@@ -2797,85 +2794,137 @@ getOrCreateSPIRVDeviceEventPointer(MachineIRBuilder &MIRBuilder,
static bool buildEnqueueKernel(const SPIRV::IncomingCall *Call,
MachineIRBuilder &MIRBuilder,
SPIRVGlobalRegistry *GR) {
+ // In this function there are three stages:
+ // 1. prepare call indexes in order we expect them.
+ // 2. process all arguments which requered preparation.
+ // 3. create a SPIRV operator with arguments.
+
MachineRegisterInfo *MRI = MIRBuilder.getMRI();
const DataLayout &DL = MIRBuilder.getDataLayout();
- bool IsSpirvOp = Call->isSpirvOp();
- bool HasEvents = Call->Builtin->Name.contains("events") || IsSpirvOp;
const SPIRVTypeInst Int32Ty = GR->getOrCreateSPIRVIntegerType(32, MIRBuilder);
- // Make vararg instructions before OpEnqueueKernel.
- // Local sizes arguments: Sizes of block invoke arguments. Clang generates
- // local size operands as an array, so we need to unpack them.
+ // 1. prepare call indexes in order we expect them.
+ // Based on clang sources, clang/lib/CodeGen/CGBuiltin.cpp, BIenqueue_kernel,
+ // We expect 4 different layouts of call arguments:
+ // 1) No events, no vargs: {Queue, Flags, Range, Kernel, Block};
+ // 2) No events, varargs: {Queue, Flags, Range, Kernel, Block, NumElem,
+ // ElemPtr};
+ // 3) events, no varargs: {Queue, Flags, Range, NumEvents,
+ // EventWaitList, EventRet, Kernel, Block};
+ // 4) events, varargs: {Queue,
+ // Flags, Range, NumEvents, EventWaitList, EventRet, Kernel, Block,
+ // NumElem, ElemPtr};
+ //
+ // We also may expect __spirv_EnqueueKernel
+ /// TODO: handle __spirv_EnqueueKernel
----------------
idubinov wrote:
TODO removed, as this case already covered by the code. Test case added
https://github.com/llvm/llvm-project/pull/187671
More information about the llvm-commits
mailing list