Summary
IGC silently drops a __global__ kernel from the compiled module at default
optimization. The kernel is declared as OpEntryPoint Kernel in the SPIR-V
handed to zeModuleCreate, so the SPIR-V is well formed; the IGC backend
just stops exposing it to zeModuleGetKernelNames / zeKernelCreate.
clCreateKernel / zeKernelCreate returns CL_INVALID_KERNEL_NAME /
ZE_RESULT_ERROR_INVALID_KERNEL_NAME for the missing name.
Building the same SPIR-V with -cl-opt-disable (passed via
ze_module_desc_t::pBuildFlags) recovers the kernel. No finer-grained IGC
env var works; I tried ~40 of them. Details below.
Environment
Intel Arc A770 (Xe-HPG, DG2)
Driver: NEO 26.09.37435.1, Level Zero 1.28
Compiler frontend: clang HIP frontend via chipStar HIPRTC (the bug reproduces
from the SPIR-V alone; chipStar is only the producer)
Source: libCEED hip-shared-basis-tensor-at-points-templates.h
(GradAtPoints2d, Q_1D = 9)
Reproducing
Self-contained pure-Level-Zero reproducer (no HIP / chipStar / OpenCL runtime needed). All source inlined below; re-assemble the SPIR-V with spirv-as and link the host against -lze_loader.
make && ./repro # GradAtPoints MISSING, exit 1
./repro -cl-opt-disable # GradAtPoints PRESENT, exit 0
Trigger
All of the following are required; removing any one makes the drop disappear:
Outer for loop with trip count ≥ 2 containing an if/else calling two
different __device__ __forceinline__ helpers that both write to the same
local double[QN] array (x).
A nested reduction reading x[] against extern __shared__ double indexed
by threadIdx.z * QN * QN (SLM offset that depends on threadIdx.z at
runtime).
A second call to one of the helpers after the reduction, overwriting x[].
A final reduction accumulating into r_V.
QN == 9 — exact. Tested 3, 4, 5, 6, 7, 8, 10, 11, 12, 16. None
reproduces.
double precision.
IGC shader-dump evidence (IGC_ShaderDumpEnable=1)
The dropped GradAtPoints kernel is present in every LLVM stage :
beforeUnification.ll : 1 spir_kernel declaration (GradAtPoints)
afterUnification.ll : 1 (GradAtPoints)
optimized.ll : 1 (GradAtPoints)
codegen.ll : 1 (GradAtPoints)
push_analysis.ll : 1 (GradAtPoints)
…but no corresponding entry_*.asm / entry_*.visaasm is produced for it
at any SIMD width. With -cl-opt-disable, GradAtPoints compiles as SIMD8
with 9 inlined sub-functions (_f0..f8) and a valid VISA/native entry is
emitted.
This points at a late vISA-emit stage failure: IsValidShader() returns false
(m_programSize == 0) for all SIMD widths, and
OpenCLKernelCodeGen.cpp::GatherDataForDriver silently skips the kernel. The
RetryManager path exhausts SIMD32 → SIMD16 → SIMD8 without producing a valid
binary, and the kernel is dropped rather than surfacing the error.
The SIMD8 compile of the same SPIR-V with -cl-opt-disable succeeds with 9
sub-function splits — evidence that the default IGC pipeline's more aggressive
function inlining for Q_1D == 9 produces vISA that register allocation can't
satisfy at any SIMD width.
IGC flags tried that do NOT help
Non-exhaustive list (none produces GradAtPoints):
IGC_FunctionControl=0, IGC_ForceInlineAll=0, IGC_EnableFunctionCloning=0,
IGC_ForceFunctionsNoinline=1, IGC_EnableSubroutine=1,
IGC_EnableFunctionPointer=1, IGC_DisableDeadFunctionsEliminationPass=1,
IGC_DisableEmptyFunctionEraser=1, IGC_DisableInternalization=1,
IGC_SIMD{8,16,32}_SpillThreshold=100, IGC_ForceAllowSmallSpill=1,
IGC_DisableSubroutines=1, IGC_FunctionSplittingThreshold={0,100000},
IGC_EnableFunctionSplitting={0,1}, IGC_RetryRegAlloc=1,
IGC_ExtraRetrySIMD16=1, IGC_EnableSIMD8CompileAttemptFirst=1,
IGC_AllowStackCallRetry={0,1,2}, IGC_DisableLoopUnroll=1,
IGC_DisableRegAllocOpt=1, IGC_DisableRegAlloc=1,
IGC_DisableCompaction=1, IGC_forceGlobalRA=1, IGC_KeepAllVariables=1.
Also tried as build flags via ze_module_desc_t::pBuildFlags:
-O0, -O1, -O2, -cl-opt-level=0 — no effect (ignored?)
-cl-fast-relaxed-math, -cl-no-signed-zeros, -cl-uniform-work-group-size — no effect
Only -cl-opt-disable and -ze-opt-disable work, and they disable all IGC
optimization. That's a ~10× perf hit on the compute-bound kernels this pattern
appears in (libCEED FEM basis evaluation), so it's not a viable shipping
workaround — it only serves as a diagnostic fence.
Related previously-reported issues
intel/intel-graphics-compiler#403
— same failure class (kernels silently omitted from final native object
after RetryManager exhausts SIMD widths). Different trigger (rocThrust
lookback template filter at link step). Open.
intel/compute-runtime#683
— same surface symptom against the same codebase (CHIP-SPV / libCEED
CeedKernel* missing from module, zeKernelCreate fails by name).
Reporter diagnosed "register spills + user local memory allocation usage
exceeds the hardware SLM size" , matching this fingerprint. Intel triager
requested a zebin, reporter didn't respond, bot auto-closed. This is that
bug with the zebin-and-then-some.
Not the same as #403 (different trigger) nor as compute-runtime#683 (wrong
repo — failure is in IGC codegen, not NEO). Filing fresh here with the
zebin-equivalent evidence Intel asked for in 2023.
The kernel (HIP source, 52 LOC)
// kernel.hip — compiled via chipStar HIPRTC at -O2 into the SPIR-V below
#include < hip/hip_runtime.h>
#define QN 9
#define NP 4
__device__ __forceinline__ void polyA (const double x, double *cx) {
cx[0 ] = 1.0 ; cx[1 ] = 2 * x;
for (int i = 2 ; i < QN; i++) cx[i] = 2 * x * cx[i - 1 ] - cx[i - 2 ];
}
__device__ __forceinline__ void polyB (const double x, double *cx) {
cx[0 ] = x; cx[1 ] = 1.0 ;
for (int i = 2 ; i < QN; i++) cx[i] = x * cx[i - 1 ] + cx[i - 2 ];
}
__device__ __forceinline__ void GradAtPoints2d (double *slice, int p,
const double *r_X,
double *r_V) {
double buf[QN], x[QN];
for (int dim = 0 ; dim < 3 ; dim++) {
if (p == 0 ) polyA (r_X[0 ], x);
else polyB (r_X[0 ], x);
for (int i = 0 ; i < QN; i++) {
buf[i] = 0.0 ;
for (int j = 0 ; j < QN; j++) buf[i] += x[j] * slice[j + i * QN];
}
polyB (r_X[1 ], x);
for (int i = 0 ; i < QN; i++) r_V[0 ] += x[i] * buf[i];
}
}
extern " C" __global__
void GradAtPoints (const double *__restrict__ d_X, double *__restrict__ d_V) {
extern __shared__ double slice_raw[];
double *slice = slice_raw + threadIdx.z * QN * QN;
int p = threadIdx.x ;
double r_X[2 ] = { d_X[p], d_X[p + NP] };
double r_V[2 ] = { 0 , 0 };
GradAtPoints2d (slice, p, r_X, r_V);
d_V[p] = r_V[0 ];
d_V[p + NP] = r_V[1 ];
}
SPIR-V (718 LOC, result of clang -O2 + llvm-spirv + spirv-opt --eliminate-dead-* + line-bisection)
Click to expand SPIR-V assembly
OpEntryPoint Kernel %2 "GradAtPoints" %gl_LocalInvocationID
OpDecorate %gl_LocalInvocationID BuiltIn LocalInvocationId
OpDecorate %6 LinkageAttributes "GradAtPoints" Export
OpDecorate %8 FuncParamAttr NoAlias
OpDecorate %9 FuncParamAttr NoAlias
OpDecorate %10 FuncParamAttr NoAlias
%ulong = OpTypeInt 64 0
%uchar = OpTypeInt 8 0
%uint = OpTypeInt 32 0
%ulong_0 = OpConstant %ulong 0
%uchar_1 = OpConstant %uchar 1
%uint_81 = OpConstant %uint 81
%uint_4 = OpConstant %uint 4
%uint_0 = OpConstant %uint 0
%ulong_8 = OpConstant %ulong 8
%ulong_16 = OpConstant %ulong 16
%ulong_24 = OpConstant %ulong 24
%ulong_32 = OpConstant %ulong 32
%ulong_40 = OpConstant %ulong 40
%ulong_48 = OpConstant %ulong 48
%ulong_56 = OpConstant %ulong 56
%ulong_64 = OpConstant %ulong 64
%ulong_72 = OpConstant %ulong 72
%ulong_80 = OpConstant %ulong 80
%ulong_88 = OpConstant %ulong 88
%ulong_96 = OpConstant %ulong 96
%ulong_104 = OpConstant %ulong 104
%ulong_112 = OpConstant %ulong 112
%ulong_120 = OpConstant %ulong 120
%ulong_128 = OpConstant %ulong 128
%ulong_136 = OpConstant %ulong 136
%ulong_144 = OpConstant %ulong 144
%ulong_152 = OpConstant %ulong 152
%ulong_160 = OpConstant %ulong 160
%ulong_168 = OpConstant %ulong 168
%ulong_176 = OpConstant %ulong 176
%ulong_184 = OpConstant %ulong 184
%ulong_192 = OpConstant %ulong 192
%ulong_200 = OpConstant %ulong 200
%ulong_208 = OpConstant %ulong 208
%ulong_216 = OpConstant %ulong 216
%ulong_224 = OpConstant %ulong 224
%ulong_232 = OpConstant %ulong 232
%ulong_240 = OpConstant %ulong 240
%ulong_248 = OpConstant %ulong 248
%ulong_256 = OpConstant %ulong 256
%ulong_264 = OpConstant %ulong 264
%ulong_272 = OpConstant %ulong 272
%ulong_280 = OpConstant %ulong 280
%ulong_288 = OpConstant %ulong 288
%ulong_296 = OpConstant %ulong 296
%ulong_304 = OpConstant %ulong 304
%ulong_312 = OpConstant %ulong 312
%ulong_320 = OpConstant %ulong 320
%ulong_328 = OpConstant %ulong 328
%ulong_336 = OpConstant %ulong 336
%ulong_344 = OpConstant %ulong 344
%ulong_352 = OpConstant %ulong 352
%ulong_360 = OpConstant %ulong 360
%ulong_368 = OpConstant %ulong 368
%ulong_376 = OpConstant %ulong 376
%ulong_384 = OpConstant %ulong 384
%ulong_392 = OpConstant %ulong 392
%ulong_400 = OpConstant %ulong 400
%ulong_408 = OpConstant %ulong 408
%ulong_416 = OpConstant %ulong 416
%ulong_424 = OpConstant %ulong 424
%ulong_432 = OpConstant %ulong 432
%ulong_440 = OpConstant %ulong 440
%ulong_448 = OpConstant %ulong 448
%ulong_456 = OpConstant %ulong 456
%ulong_464 = OpConstant %ulong 464
%ulong_472 = OpConstant %ulong 472
%ulong_480 = OpConstant %ulong 480
%ulong_488 = OpConstant %ulong 488
%ulong_496 = OpConstant %ulong 496
%ulong_504 = OpConstant %ulong 504
%ulong_512 = OpConstant %ulong 512
%ulong_520 = OpConstant %ulong 520
%ulong_528 = OpConstant %ulong 528
%ulong_536 = OpConstant %ulong 536
%ulong_544 = OpConstant %ulong 544
%ulong_552 = OpConstant %ulong 552
%ulong_560 = OpConstant %ulong 560
%ulong_568 = OpConstant %ulong 568
%ulong_576 = OpConstant %ulong 576
%ulong_584 = OpConstant %ulong 584
%ulong_592 = OpConstant %ulong 592
%ulong_600 = OpConstant %ulong 600
%ulong_608 = OpConstant %ulong 608
%ulong_616 = OpConstant %ulong 616
%ulong_624 = OpConstant %ulong 624
%ulong_632 = OpConstant %ulong 632
%ulong_640 = OpConstant %ulong 640
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%_ptr_CrossWorkgroup_ulong = OpTypePointer CrossWorkgroup %ulong
%_ptr_CrossWorkgroup_uchar = OpTypePointer CrossWorkgroup %uchar
%v3ulong = OpTypeVector %ulong 3
%_ptr_Input_v3ulong = OpTypePointer Input %v3ulong
%void = OpTypeVoid
%double = OpTypeFloat 64
%_ptr_Workgroup_double = OpTypePointer Workgroup %double
%108 = OpTypeFunction %void %_ptr_CrossWorkgroup_uchar %_ptr_CrossWorkgroup_uchar %_ptr_Workgroup_double
%_ptr_Generic_double = OpTypePointer Generic %double
%bool = OpTypeBool
%_ptr_Workgroup_uchar = OpTypePointer Workgroup %uchar
%112 = OpTypeFunction %void %_ptr_CrossWorkgroup_ulong
%113 = OpTypeFunction %void %_ptr_CrossWorkgroup_uchar
%114 = OpTypeFunction %void
%4 = OpVariable %_ptr_CrossWorkgroup_ulong CrossWorkgroup %ulong_0
%5 = OpVariable %_ptr_CrossWorkgroup_uchar CrossWorkgroup %uchar_1
%gl_LocalInvocationID = OpVariable %_ptr_Input_v3ulong Input
%true = OpConstantTrue %bool
%double_2 = OpConstant %double 2
%double_1 = OpConstant %double 1
%double_n1 = OpConstant %double -1
%double_0 = OpConstant %double 0
%6 = OpFunction %void None %108
%7 = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
%8 = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
%120 = OpFunctionParameter %_ptr_Workgroup_double
%121 = OpLabel
%122 = OpConvertPtrToU %ulong %7
%123 = OpConvertUToPtr %_ptr_Generic_double %122
%124 = OpLoad %v3ulong %gl_LocalInvocationID Aligned 32
%125 = OpCompositeExtract %ulong %124 2
%126 = OpSelect %ulong %true %125 %ulong_0
%127 = OpUConvert %uint %126
%128 = OpIMul %uint %127 %uint_81
%129 = OpUConvert %ulong %128
%130 = OpInBoundsPtrAccessChain %_ptr_Workgroup_double %120 %129
%131 = OpLoad %v3ulong %gl_LocalInvocationID Aligned 32
%132 = OpCompositeExtract %ulong %131 0
%133 = OpSelect %ulong %true %132 %ulong_0
%134 = OpUConvert %uint %133
%135 = OpSConvert %ulong %134
%136 = OpInBoundsPtrAccessChain %_ptr_Generic_double %123 %135
%137 = OpLoad %double %136 Aligned 8
%138 = OpIAdd %uint %134 %uint_4
%139 = OpSConvert %ulong %138
%140 = OpInBoundsPtrAccessChain %_ptr_Generic_double %123 %139
%141 = OpLoad %double %140 Aligned 8
%142 = OpIEqual %bool %134 %uint_0
%143 = OpFMul %double %137 %double_2
%144 = OpFAdd %double %137 %137
%145 = OpFMul %double %137 %144
%146 = OpFAdd %double %145 %double_1
%147 = OpFMul %double %137 %146
%148 = OpFAdd %double %147 %144
%149 = OpFMul %double %137 %148
%150 = OpFAdd %double %149 %146
%151 = OpFMul %double %137 %150
%152 = OpFAdd %double %151 %148
%153 = OpFMul %double %137 %152
%154 = OpFAdd %double %153 %150
%155 = OpFMul %double %137 %154
%156 = OpFAdd %double %155 %152
%157 = OpFMul %double %143 %143
%158 = OpFAdd %double %157 %double_n1
%159 = OpFMul %double %143 %158
%160 = OpFSub %double %159 %143
%161 = OpFMul %double %143 %160
%162 = OpFSub %double %161 %158
%163 = OpFMul %double %143 %162
%164 = OpFSub %double %163 %160
%165 = OpFMul %double %143 %164
%166 = OpFSub %double %165 %162
%167 = OpFMul %double %143 %166
%168 = OpFSub %double %167 %164
%169 = OpFMul %double %143 %168
%170 = OpFSub %double %169 %166
%171 = OpLoad %double %130 Aligned 8
%172 = OpBitcast %_ptr_Workgroup_uchar %130
%173 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %172 %ulong_8
%174 = OpBitcast %_ptr_Workgroup_double %173
%175 = OpLoad %double %174 Aligned 8
%176 = OpBitcast %_ptr_Workgroup_uchar %130
%177 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %176 %ulong_16
%178 = OpBitcast %_ptr_Workgroup_double %177
%179 = OpLoad %double %178 Aligned 8
%180 = OpBitcast %_ptr_Workgroup_uchar %130
%181 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %180 %ulong_24
%182 = OpBitcast %_ptr_Workgroup_double %181
%183 = OpLoad %double %182 Aligned 8
%184 = OpBitcast %_ptr_Workgroup_uchar %130
%185 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %184 %ulong_32
%186 = OpBitcast %_ptr_Workgroup_double %185
%187 = OpLoad %double %186 Aligned 8
%188 = OpBitcast %_ptr_Workgroup_uchar %130
%189 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %188 %ulong_40
%190 = OpBitcast %_ptr_Workgroup_double %189
%191 = OpLoad %double %190 Aligned 8
%192 = OpBitcast %_ptr_Workgroup_uchar %130
%193 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %192 %ulong_48
%194 = OpBitcast %_ptr_Workgroup_double %193
%195 = OpLoad %double %194 Aligned 8
%196 = OpBitcast %_ptr_Workgroup_uchar %130
%197 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %196 %ulong_56
%198 = OpBitcast %_ptr_Workgroup_double %197
%199 = OpLoad %double %198 Aligned 8
%200 = OpBitcast %_ptr_Workgroup_uchar %130
%201 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %200 %ulong_64
%202 = OpBitcast %_ptr_Workgroup_double %201
%203 = OpLoad %double %202 Aligned 8
%204 = OpBitcast %_ptr_Workgroup_uchar %130
%205 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %204 %ulong_72
%206 = OpBitcast %_ptr_Workgroup_double %205
%207 = OpLoad %double %206 Aligned 8
%208 = OpBitcast %_ptr_Workgroup_uchar %130
%209 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %208 %ulong_80
%210 = OpBitcast %_ptr_Workgroup_double %209
%211 = OpLoad %double %210 Aligned 8
%212 = OpBitcast %_ptr_Workgroup_uchar %130
%213 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %212 %ulong_88
%214 = OpBitcast %_ptr_Workgroup_double %213
%215 = OpLoad %double %214 Aligned 8
%216 = OpBitcast %_ptr_Workgroup_uchar %130
%217 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %216 %ulong_96
%218 = OpBitcast %_ptr_Workgroup_double %217
%219 = OpLoad %double %218 Aligned 8
%220 = OpBitcast %_ptr_Workgroup_uchar %130
%221 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %220 %ulong_104
%222 = OpBitcast %_ptr_Workgroup_double %221
%223 = OpLoad %double %222 Aligned 8
%224 = OpBitcast %_ptr_Workgroup_uchar %130
%225 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %224 %ulong_112
%226 = OpBitcast %_ptr_Workgroup_double %225
%227 = OpLoad %double %226 Aligned 8
%228 = OpBitcast %_ptr_Workgroup_uchar %130
%229 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %228 %ulong_120
%230 = OpBitcast %_ptr_Workgroup_double %229
%231 = OpLoad %double %230 Aligned 8
%232 = OpBitcast %_ptr_Workgroup_uchar %130
%233 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %232 %ulong_128
%234 = OpBitcast %_ptr_Workgroup_double %233
%235 = OpLoad %double %234 Aligned 8
%236 = OpBitcast %_ptr_Workgroup_uchar %130
%237 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %236 %ulong_136
%238 = OpBitcast %_ptr_Workgroup_double %237
%239 = OpLoad %double %238 Aligned 8
%240 = OpBitcast %_ptr_Workgroup_uchar %130
%241 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %240 %ulong_144
%242 = OpBitcast %_ptr_Workgroup_double %241
%243 = OpLoad %double %242 Aligned 8
%244 = OpBitcast %_ptr_Workgroup_uchar %130
%245 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %244 %ulong_152
%246 = OpBitcast %_ptr_Workgroup_double %245
%247 = OpLoad %double %246 Aligned 8
%248 = OpBitcast %_ptr_Workgroup_uchar %130
%249 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %248 %ulong_160
%250 = OpBitcast %_ptr_Workgroup_double %249
%251 = OpLoad %double %250 Aligned 8
%252 = OpBitcast %_ptr_Workgroup_uchar %130
%253 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %252 %ulong_168
%254 = OpBitcast %_ptr_Workgroup_double %253
%255 = OpLoad %double %254 Aligned 8
%256 = OpBitcast %_ptr_Workgroup_uchar %130
%257 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %256 %ulong_176
%258 = OpBitcast %_ptr_Workgroup_double %257
%259 = OpLoad %double %258 Aligned 8
%260 = OpBitcast %_ptr_Workgroup_uchar %130
%261 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %260 %ulong_184
%262 = OpBitcast %_ptr_Workgroup_double %261
%263 = OpLoad %double %262 Aligned 8
%264 = OpBitcast %_ptr_Workgroup_uchar %130
%265 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %264 %ulong_192
%266 = OpBitcast %_ptr_Workgroup_double %265
%267 = OpLoad %double %266 Aligned 8
%268 = OpBitcast %_ptr_Workgroup_uchar %130
%269 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %268 %ulong_200
%270 = OpBitcast %_ptr_Workgroup_double %269
%271 = OpLoad %double %270 Aligned 8
%272 = OpBitcast %_ptr_Workgroup_uchar %130
%273 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %272 %ulong_208
%274 = OpBitcast %_ptr_Workgroup_double %273
%275 = OpLoad %double %274 Aligned 8
%276 = OpBitcast %_ptr_Workgroup_uchar %130
%277 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %276 %ulong_216
%278 = OpBitcast %_ptr_Workgroup_double %277
%279 = OpLoad %double %278 Aligned 8
%280 = OpBitcast %_ptr_Workgroup_uchar %130
%281 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %280 %ulong_224
%282 = OpBitcast %_ptr_Workgroup_double %281
%283 = OpLoad %double %282 Aligned 8
%284 = OpBitcast %_ptr_Workgroup_uchar %130
%285 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %284 %ulong_232
%286 = OpBitcast %_ptr_Workgroup_double %285
%287 = OpLoad %double %286 Aligned 8
%288 = OpBitcast %_ptr_Workgroup_uchar %130
%289 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %288 %ulong_240
%290 = OpBitcast %_ptr_Workgroup_double %289
%291 = OpLoad %double %290 Aligned 8
%292 = OpBitcast %_ptr_Workgroup_uchar %130
%293 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %292 %ulong_248
%294 = OpBitcast %_ptr_Workgroup_double %293
%295 = OpLoad %double %294 Aligned 8
%296 = OpBitcast %_ptr_Workgroup_uchar %130
%297 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %296 %ulong_256
%298 = OpBitcast %_ptr_Workgroup_double %297
%299 = OpLoad %double %298 Aligned 8
%300 = OpBitcast %_ptr_Workgroup_uchar %130
%301 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %300 %ulong_264
%302 = OpBitcast %_ptr_Workgroup_double %301
%303 = OpLoad %double %302 Aligned 8
%304 = OpBitcast %_ptr_Workgroup_uchar %130
%305 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %304 %ulong_272
%306 = OpBitcast %_ptr_Workgroup_double %305
%307 = OpLoad %double %306 Aligned 8
%308 = OpBitcast %_ptr_Workgroup_uchar %130
%309 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %308 %ulong_280
%310 = OpBitcast %_ptr_Workgroup_double %309
%311 = OpLoad %double %310 Aligned 8
%312 = OpBitcast %_ptr_Workgroup_uchar %130
%313 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %312 %ulong_288
%314 = OpBitcast %_ptr_Workgroup_double %313
%315 = OpLoad %double %314 Aligned 8
%316 = OpBitcast %_ptr_Workgroup_uchar %130
%317 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %316 %ulong_296
%318 = OpBitcast %_ptr_Workgroup_double %317
%319 = OpLoad %double %318 Aligned 8
%320 = OpBitcast %_ptr_Workgroup_uchar %130
%321 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %320 %ulong_304
%322 = OpBitcast %_ptr_Workgroup_double %321
%323 = OpLoad %double %322 Aligned 8
%324 = OpBitcast %_ptr_Workgroup_uchar %130
%325 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %324 %ulong_312
%326 = OpBitcast %_ptr_Workgroup_double %325
%327 = OpLoad %double %326 Aligned 8
%328 = OpBitcast %_ptr_Workgroup_uchar %130
%329 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %328 %ulong_320
%330 = OpBitcast %_ptr_Workgroup_double %329
%331 = OpLoad %double %330 Aligned 8
%332 = OpBitcast %_ptr_Workgroup_uchar %130
%333 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %332 %ulong_328
%334 = OpBitcast %_ptr_Workgroup_double %333
%335 = OpLoad %double %334 Aligned 8
%336 = OpBitcast %_ptr_Workgroup_uchar %130
%337 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %336 %ulong_336
%338 = OpBitcast %_ptr_Workgroup_double %337
%339 = OpLoad %double %338 Aligned 8
%340 = OpBitcast %_ptr_Workgroup_uchar %130
%341 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %340 %ulong_344
%342 = OpBitcast %_ptr_Workgroup_double %341
%343 = OpLoad %double %342 Aligned 8
%344 = OpBitcast %_ptr_Workgroup_uchar %130
%345 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %344 %ulong_352
%346 = OpBitcast %_ptr_Workgroup_double %345
%347 = OpLoad %double %346 Aligned 8
%348 = OpBitcast %_ptr_Workgroup_uchar %130
%349 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %348 %ulong_360
%350 = OpBitcast %_ptr_Workgroup_double %349
%351 = OpLoad %double %350 Aligned 8
%352 = OpBitcast %_ptr_Workgroup_uchar %130
%353 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %352 %ulong_368
%354 = OpBitcast %_ptr_Workgroup_double %353
%355 = OpLoad %double %354 Aligned 8
%356 = OpBitcast %_ptr_Workgroup_uchar %130
%357 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %356 %ulong_376
%358 = OpBitcast %_ptr_Workgroup_double %357
%359 = OpLoad %double %358 Aligned 8
%360 = OpBitcast %_ptr_Workgroup_uchar %130
%361 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %360 %ulong_384
%362 = OpBitcast %_ptr_Workgroup_double %361
%363 = OpLoad %double %362 Aligned 8
%364 = OpBitcast %_ptr_Workgroup_uchar %130
%365 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %364 %ulong_392
%366 = OpBitcast %_ptr_Workgroup_double %365
%367 = OpLoad %double %366 Aligned 8
%368 = OpBitcast %_ptr_Workgroup_uchar %130
%369 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %368 %ulong_400
%370 = OpBitcast %_ptr_Workgroup_double %369
%371 = OpLoad %double %370 Aligned 8
%372 = OpBitcast %_ptr_Workgroup_uchar %130
%373 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %372 %ulong_408
%374 = OpBitcast %_ptr_Workgroup_double %373
%375 = OpLoad %double %374 Aligned 8
%376 = OpBitcast %_ptr_Workgroup_uchar %130
%377 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %376 %ulong_416
%378 = OpBitcast %_ptr_Workgroup_double %377
%379 = OpLoad %double %378 Aligned 8
%380 = OpBitcast %_ptr_Workgroup_uchar %130
%381 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %380 %ulong_424
%382 = OpBitcast %_ptr_Workgroup_double %381
%383 = OpLoad %double %382 Aligned 8
%384 = OpBitcast %_ptr_Workgroup_uchar %130
%385 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %384 %ulong_432
%386 = OpBitcast %_ptr_Workgroup_double %385
%387 = OpLoad %double %386 Aligned 8
%388 = OpBitcast %_ptr_Workgroup_uchar %130
%389 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %388 %ulong_440
%390 = OpBitcast %_ptr_Workgroup_double %389
%391 = OpLoad %double %390 Aligned 8
%392 = OpBitcast %_ptr_Workgroup_uchar %130
%393 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %392 %ulong_448
%394 = OpBitcast %_ptr_Workgroup_double %393
%395 = OpLoad %double %394 Aligned 8
%396 = OpBitcast %_ptr_Workgroup_uchar %130
%397 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %396 %ulong_456
%398 = OpBitcast %_ptr_Workgroup_double %397
%399 = OpLoad %double %398 Aligned 8
%400 = OpBitcast %_ptr_Workgroup_uchar %130
%401 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %400 %ulong_464
%402 = OpBitcast %_ptr_Workgroup_double %401
%403 = OpLoad %double %402 Aligned 8
%404 = OpBitcast %_ptr_Workgroup_uchar %130
%405 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %404 %ulong_472
%406 = OpBitcast %_ptr_Workgroup_double %405
%407 = OpLoad %double %406 Aligned 8
%408 = OpBitcast %_ptr_Workgroup_uchar %130
%409 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %408 %ulong_480
%410 = OpBitcast %_ptr_Workgroup_double %409
%411 = OpLoad %double %410 Aligned 8
%412 = OpBitcast %_ptr_Workgroup_uchar %130
%413 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %412 %ulong_488
%414 = OpBitcast %_ptr_Workgroup_double %413
%415 = OpLoad %double %414 Aligned 8
%416 = OpBitcast %_ptr_Workgroup_uchar %130
%417 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %416 %ulong_496
%418 = OpBitcast %_ptr_Workgroup_double %417
%419 = OpLoad %double %418 Aligned 8
%420 = OpBitcast %_ptr_Workgroup_uchar %130
%421 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %420 %ulong_504
%422 = OpBitcast %_ptr_Workgroup_double %421
%423 = OpLoad %double %422 Aligned 8
%424 = OpBitcast %_ptr_Workgroup_uchar %130
%425 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %424 %ulong_512
%426 = OpBitcast %_ptr_Workgroup_double %425
%427 = OpLoad %double %426 Aligned 8
%428 = OpBitcast %_ptr_Workgroup_uchar %130
%429 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %428 %ulong_520
%430 = OpBitcast %_ptr_Workgroup_double %429
%431 = OpLoad %double %430 Aligned 8
%432 = OpBitcast %_ptr_Workgroup_uchar %130
%433 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %432 %ulong_528
%434 = OpBitcast %_ptr_Workgroup_double %433
%435 = OpLoad %double %434 Aligned 8
%436 = OpBitcast %_ptr_Workgroup_uchar %130
%437 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %436 %ulong_536
%438 = OpBitcast %_ptr_Workgroup_double %437
%439 = OpLoad %double %438 Aligned 8
%440 = OpBitcast %_ptr_Workgroup_uchar %130
%441 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %440 %ulong_544
%442 = OpBitcast %_ptr_Workgroup_double %441
%443 = OpLoad %double %442 Aligned 8
%444 = OpBitcast %_ptr_Workgroup_uchar %130
%445 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %444 %ulong_552
%446 = OpBitcast %_ptr_Workgroup_double %445
%447 = OpLoad %double %446 Aligned 8
%448 = OpBitcast %_ptr_Workgroup_uchar %130
%449 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %448 %ulong_560
%450 = OpBitcast %_ptr_Workgroup_double %449
%451 = OpLoad %double %450 Aligned 8
%452 = OpBitcast %_ptr_Workgroup_uchar %130
%453 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %452 %ulong_568
%454 = OpBitcast %_ptr_Workgroup_double %453
%455 = OpLoad %double %454 Aligned 8
%456 = OpBitcast %_ptr_Workgroup_uchar %130
%457 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %456 %ulong_576
%458 = OpBitcast %_ptr_Workgroup_double %457
%459 = OpLoad %double %458 Aligned 8
%460 = OpBitcast %_ptr_Workgroup_uchar %130
%461 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %460 %ulong_584
%462 = OpBitcast %_ptr_Workgroup_double %461
%463 = OpLoad %double %462 Aligned 8
%464 = OpBitcast %_ptr_Workgroup_uchar %130
%465 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %464 %ulong_592
%466 = OpBitcast %_ptr_Workgroup_double %465
%467 = OpLoad %double %466 Aligned 8
%468 = OpBitcast %_ptr_Workgroup_uchar %130
%469 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %468 %ulong_600
%470 = OpBitcast %_ptr_Workgroup_double %469
%471 = OpLoad %double %470 Aligned 8
%472 = OpBitcast %_ptr_Workgroup_uchar %130
%473 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %472 %ulong_608
%474 = OpBitcast %_ptr_Workgroup_double %473
%475 = OpLoad %double %474 Aligned 8
%476 = OpBitcast %_ptr_Workgroup_uchar %130
%477 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %476 %ulong_616
%478 = OpBitcast %_ptr_Workgroup_double %477
%479 = OpLoad %double %478 Aligned 8
%480 = OpBitcast %_ptr_Workgroup_uchar %130
%481 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %480 %ulong_624
%482 = OpBitcast %_ptr_Workgroup_double %481
%483 = OpLoad %double %482 Aligned 8
%484 = OpBitcast %_ptr_Workgroup_uchar %130
%485 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %484 %ulong_632
%486 = OpBitcast %_ptr_Workgroup_double %485
%487 = OpLoad %double %486 Aligned 8
%488 = OpBitcast %_ptr_Workgroup_uchar %130
%489 = OpInBoundsPtrAccessChain %_ptr_Workgroup_uchar %488 %ulong_640
%490 = OpBitcast %_ptr_Workgroup_double %489
%491 = OpLoad %double %490 Aligned 8
%492 = OpFAdd %double %141 %141
%493 = OpFMul %double %141 %492
%494 = OpFAdd %double %493 %double_1
%495 = OpFMul %double %141 %494
%496 = OpFAdd %double %495 %492
%497 = OpFMul %double %141 %496
%498 = OpFAdd %double %497 %494
%499 = OpFMul %double %141 %498
%500 = OpFAdd %double %499 %496
%501 = OpFMul %double %141 %500
%502 = OpFAdd %double %501 %498
%503 = OpFMul %double %141 %502
%504 = OpFAdd %double %503 %500
%505 = OpSelect %double %142 %170 %156
%506 = OpSelect %double %142 %168 %154
%507 = OpSelect %double %142 %166 %152
%508 = OpSelect %double %142 %164 %150
%509 = OpSelect %double %142 %162 %148
%510 = OpSelect %double %142 %160 %146
%511 = OpSelect %double %142 %158 %144
%512 = OpSelect %double %142 %143 %double_1
%513 = OpSelect %double %142 %double_1 %137
%514 = OpFMul %double %513 %171
%515 = OpFAdd %double %514 %double_0
%516 = OpFMul %double %512 %175
%517 = OpFAdd %double %515 %516
%518 = OpFMul %double %511 %179
%519 = OpFAdd %double %517 %518
%520 = OpFMul %double %510 %183
%521 = OpFAdd %double %519 %520
%522 = OpFMul %double %509 %187
%523 = OpFAdd %double %521 %522
%524 = OpFMul %double %508 %191
%525 = OpFAdd %double %523 %524
%526 = OpFMul %double %507 %195
%527 = OpFAdd %double %525 %526
%528 = OpFMul %double %506 %199
%529 = OpFAdd %double %527 %528
%530 = OpFMul %double %505 %203
%531 = OpFAdd %double %529 %530
%532 = OpFMul %double %513 %207
%533 = OpFAdd %double %532 %double_0
%534 = OpFMul %double %512 %211
%535 = OpFAdd %double %533 %534
%536 = OpFMul %double %511 %215
%537 = OpFAdd %double %535 %536
%538 = OpFMul %double %510 %219
%539 = OpFAdd %double %537 %538
%540 = OpFMul %double %509 %223
%541 = OpFAdd %double %539 %540
%542 = OpFMul %double %508 %227
%543 = OpFAdd %double %541 %542
%544 = OpFMul %double %507 %231
%545 = OpFAdd %double %543 %544
%546 = OpFMul %double %506 %235
%547 = OpFAdd %double %545 %546
%548 = OpFMul %double %505 %239
%549 = OpFAdd %double %547 %548
%550 = OpFMul %double %513 %243
%551 = OpFAdd %double %550 %double_0
%552 = OpFMul %double %512 %247
%553 = OpFAdd %double %551 %552
%554 = OpFMul %double %511 %251
%555 = OpFAdd %double %553 %554
%556 = OpFMul %double %510 %255
%557 = OpFAdd %double %555 %556
%558 = OpFMul %double %509 %259
%559 = OpFAdd %double %557 %558
%560 = OpFMul %double %508 %263
%561 = OpFAdd %double %559 %560
%562 = OpFMul %double %507 %267
%563 = OpFAdd %double %561 %562
%564 = OpFMul %double %506 %271
%565 = OpFAdd %double %563 %564
%566 = OpFMul %double %505 %275
%567 = OpFAdd %double %565 %566
%568 = OpFMul %double %513 %279
%569 = OpFAdd %double %568 %double_0
%570 = OpFMul %double %512 %283
%571 = OpFAdd %double %569 %570
%572 = OpFMul %double %511 %287
%573 = OpFAdd %double %571 %572
%574 = OpFMul %double %510 %291
%575 = OpFAdd %double %573 %574
%576 = OpFMul %double %509 %295
%577 = OpFAdd %double %575 %576
%578 = OpFMul %double %508 %299
%579 = OpFAdd %double %577 %578
%580 = OpFMul %double %507 %303
%581 = OpFAdd %double %579 %580
%582 = OpFMul %double %506 %307
%583 = OpFAdd %double %581 %582
%584 = OpFMul %double %505 %311
%585 = OpFAdd %double %583 %584
%586 = OpFMul %double %513 %315
%587 = OpFAdd %double %586 %double_0
%588 = OpFMul %double %512 %319
%589 = OpFAdd %double %587 %588
%590 = OpFMul %double %511 %323
%591 = OpFAdd %double %589 %590
%592 = OpFMul %double %510 %327
%593 = OpFAdd %double %591 %592
%594 = OpFMul %double %509 %331
%595 = OpFAdd %double %593 %594
%596 = OpFMul %double %508 %335
%597 = OpFAdd %double %595 %596
%598 = OpFMul %double %507 %339
%599 = OpFAdd %double %597 %598
%600 = OpFMul %double %506 %343
%601 = OpFAdd %double %599 %600
%602 = OpFMul %double %505 %347
%603 = OpFAdd %double %601 %602
%604 = OpFMul %double %513 %351
%605 = OpFAdd %double %604 %double_0
%606 = OpFMul %double %512 %355
%607 = OpFAdd %double %605 %606
%608 = OpFMul %double %511 %359
%609 = OpFAdd %double %607 %608
%610 = OpFMul %double %510 %363
%611 = OpFAdd %double %609 %610
%612 = OpFMul %double %509 %367
%613 = OpFAdd %double %611 %612
%614 = OpFMul %double %508 %371
%615 = OpFAdd %double %613 %614
%616 = OpFMul %double %507 %375
%617 = OpFAdd %double %615 %616
%618 = OpFMul %double %506 %379
%619 = OpFAdd %double %617 %618
%620 = OpFMul %double %505 %383
%621 = OpFAdd %double %619 %620
%622 = OpFMul %double %513 %387
%623 = OpFAdd %double %622 %double_0
%624 = OpFMul %double %512 %391
%625 = OpFAdd %double %623 %624
%626 = OpFMul %double %511 %395
%627 = OpFAdd %double %625 %626
%628 = OpFMul %double %510 %399
%629 = OpFAdd %double %627 %628
%630 = OpFMul %double %509 %403
%631 = OpFAdd %double %629 %630
%632 = OpFMul %double %508 %407
%633 = OpFAdd %double %631 %632
%634 = OpFMul %double %507 %411
%635 = OpFAdd %double %633 %634
%636 = OpFMul %double %506 %415
%637 = OpFAdd %double %635 %636
%638 = OpFMul %double %505 %419
%639 = OpFAdd %double %637 %638
%640 = OpFMul %double %513 %423
%641 = OpFAdd %double %640 %double_0
%642 = OpFMul %double %512 %427
%643 = OpFAdd %double %641 %642
%644 = OpFMul %double %511 %431
%645 = OpFAdd %double %643 %644
%646 = OpFMul %double %510 %435
%647 = OpFAdd %double %645 %646
%648 = OpFMul %double %509 %439
%649 = OpFAdd %double %647 %648
%650 = OpFMul %double %508 %443
%651 = OpFAdd %double %649 %650
%652 = OpFMul %double %507 %447
%653 = OpFAdd %double %651 %652
%654 = OpFMul %double %506 %451
%655 = OpFAdd %double %653 %654
%656 = OpFMul %double %505 %455
%657 = OpFAdd %double %655 %656
%658 = OpFMul %double %513 %459
%659 = OpFAdd %double %658 %double_0
%660 = OpFMul %double %512 %463
%661 = OpFAdd %double %659 %660
%662 = OpFMul %double %511 %467
%663 = OpFAdd %double %661 %662
%664 = OpFMul %double %510 %471
%665 = OpFAdd %double %663 %664
%666 = OpFMul %double %509 %475
%667 = OpFAdd %double %665 %666
%668 = OpFMul %double %508 %479
%669 = OpFAdd %double %667 %668
%670 = OpFMul %double %507 %483
%671 = OpFAdd %double %669 %670
%672 = OpFMul %double %506 %487
%673 = OpFAdd %double %671 %672
%674 = OpFMul %double %505 %491
%675 = OpFAdd %double %673 %674
%676 = OpFMul %double %141 %531
%677 = OpFMul %double %492 %567
%678 = OpFMul %double %494 %585
%679 = OpFMul %double %496 %603
%680 = OpFMul %double %498 %621
%681 = OpFMul %double %500 %639
%682 = OpFMul %double %502 %657
%683 = OpFMul %double %504 %675
OpBranch %684
%684 = OpLabel
%685 = OpPhi %uint %uint_0 %121 %686 %684
%687 = OpPhi %double %double_0 %121 %688 %684
%689 = OpFAdd %double %687 %676
%690 = OpFAdd %double %689 %549
%691 = OpFAdd %double %690 %677
%692 = OpFAdd %double %691 %678
%693 = OpFAdd %double %692 %679
%694 = OpFAdd %double %693 %680
%695 = OpFAdd %double %694 %681
%696 = OpFAdd %double %695 %682
%688 = OpFAdd %double %696 %683
%686 = OpIAdd %uint %685 %uint_1
%697 = OpULessThan %bool %685 %uint_2
OpBranchConditional %697 %684 %698
%698 = OpLabel
%699 = OpConvertPtrToU %ulong %8
%700 = OpConvertUToPtr %_ptr_Generic_double %699
%701 = OpInBoundsPtrAccessChain %_ptr_Generic_double %700 %135
OpStore %701 %688 Aligned 8
%702 = OpInBoundsPtrAccessChain %_ptr_Generic_double %700 %139
OpStore %702 %double_0 Aligned 8
OpReturn
OpFunctionEnd
%2 = OpFunction %void None %108
%9 = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
%10 = OpFunctionParameter %_ptr_CrossWorkgroup_uchar
%703 = OpFunctionParameter %_ptr_Workgroup_double
%704 = OpLabel
%705 = OpFunctionCall %void %6 %9 %10 %703
OpReturn
OpFunctionEnd
Re-assemble with spirv-as trigger.spvasm -o trigger.spv.
Host (pure Level Zero, no HIP)
See repro.cpp in the reproducer repo (104 LOC, lze_loader the only
runtime dep). Core loop:
ze_module_desc_t md = {ZE_STRUCTURE_TYPE_MODULE_DESC, nullptr ,
ZE_MODULE_FORMAT_IL_SPIRV,
spv_size, (const uint8_t *)spv.data (),
build_flags /* "" or "-cl-opt-disable" */ , nullptr };
zeModuleCreate (ctx, dev, &md, &module , &log);
zeModuleGetKernelNames (module , &kc, names); // <-- GradAtPoints not in names
Ask
Confirm this is the same failure class as SIMD32: lookback_set_op_kernel (Lb1E) variants dropped from native object after RetryManager; ocloc still succeeds #403 (RetryManager exhausting
all SIMD widths and silently dropping the kernel rather than emitting a
compile error).
A finer-grained workaround than -cl-opt-disable. Ideally an IGC env var
that disables only the function-inlining pass that produces the
unregister-allocatable vISA at Q_1D = 9.
A real fix in IGC.
Happy to bisect further, rebuild IGC from source for pass-level logging, or
test patches.
Summary
IGC silently drops a
__global__kernel from the compiled module at defaultoptimization. The kernel is declared as
OpEntryPoint Kernelin the SPIR-Vhanded to
zeModuleCreate, so the SPIR-V is well formed; the IGC backendjust stops exposing it to
zeModuleGetKernelNames/zeKernelCreate.clCreateKernel/zeKernelCreatereturnsCL_INVALID_KERNEL_NAME/ZE_RESULT_ERROR_INVALID_KERNEL_NAMEfor the missing name.Building the same SPIR-V with
-cl-opt-disable(passed viaze_module_desc_t::pBuildFlags) recovers the kernel. No finer-grained IGCenv var works; I tried ~40 of them. Details below.
Environment
from the SPIR-V alone; chipStar is only the producer)
hip-shared-basis-tensor-at-points-templates.h(
GradAtPoints2d,Q_1D = 9)Reproducing
Self-contained pure-Level-Zero reproducer (no HIP / chipStar / OpenCL runtime needed). All source inlined below; re-assemble the SPIR-V with
spirv-asand link the host against-lze_loader.Trigger
All of the following are required; removing any one makes the drop disappear:
forloop with trip count ≥ 2 containing anif/elsecalling twodifferent
__device__ __forceinline__helpers that both write to the samelocal
double[QN]array (x).x[]againstextern __shared__ doubleindexedby
threadIdx.z * QN * QN(SLM offset that depends onthreadIdx.zatruntime).
x[].r_V.QN == 9— exact. Tested 3, 4, 5, 6, 7, 8, 10, 11, 12, 16. Nonereproduces.
doubleprecision.IGC shader-dump evidence (
IGC_ShaderDumpEnable=1)The dropped
GradAtPointskernel is present in every LLVM stage:…but no corresponding
entry_*.asm/entry_*.visaasmis produced for itat any SIMD width. With
-cl-opt-disable,GradAtPointscompiles as SIMD8with 9 inlined sub-functions (
_f0..f8) and a valid VISA/native entry isemitted.
This points at a late vISA-emit stage failure:
IsValidShader()returns false(
m_programSize == 0) for all SIMD widths, andOpenCLKernelCodeGen.cpp::GatherDataForDriversilently skips the kernel. TheRetryManagerpath exhausts SIMD32 → SIMD16 → SIMD8 without producing a validbinary, and the kernel is dropped rather than surfacing the error.
The SIMD8 compile of the same SPIR-V with
-cl-opt-disablesucceeds with 9sub-function splits — evidence that the default IGC pipeline's more aggressive
function inlining for
Q_1D == 9produces vISA that register allocation can'tsatisfy at any SIMD width.
IGC flags tried that do NOT help
Non-exhaustive list (none produces
GradAtPoints):IGC_FunctionControl=0,IGC_ForceInlineAll=0,IGC_EnableFunctionCloning=0,IGC_ForceFunctionsNoinline=1,IGC_EnableSubroutine=1,IGC_EnableFunctionPointer=1,IGC_DisableDeadFunctionsEliminationPass=1,IGC_DisableEmptyFunctionEraser=1,IGC_DisableInternalization=1,IGC_SIMD{8,16,32}_SpillThreshold=100,IGC_ForceAllowSmallSpill=1,IGC_DisableSubroutines=1,IGC_FunctionSplittingThreshold={0,100000},IGC_EnableFunctionSplitting={0,1},IGC_RetryRegAlloc=1,IGC_ExtraRetrySIMD16=1,IGC_EnableSIMD8CompileAttemptFirst=1,IGC_AllowStackCallRetry={0,1,2},IGC_DisableLoopUnroll=1,IGC_DisableRegAllocOpt=1,IGC_DisableRegAlloc=1,IGC_DisableCompaction=1,IGC_forceGlobalRA=1,IGC_KeepAllVariables=1.Also tried as build flags via
ze_module_desc_t::pBuildFlags:-O0,-O1,-O2,-cl-opt-level=0— no effect (ignored?)-cl-fast-relaxed-math,-cl-no-signed-zeros,-cl-uniform-work-group-size— no effectOnly
-cl-opt-disableand-ze-opt-disablework, and they disable all IGCoptimization. That's a ~10× perf hit on the compute-bound kernels this pattern
appears in (libCEED FEM basis evaluation), so it's not a viable shipping
workaround — it only serves as a diagnostic fence.
Related previously-reported issues
— same failure class (kernels silently omitted from final native object
after
RetryManagerexhausts SIMD widths). Different trigger (rocThrustlookback template filter at link step). Open.
— same surface symptom against the same codebase (CHIP-SPV / libCEED
CeedKernel*missing from module,zeKernelCreatefails by name).Reporter diagnosed "register spills + user local memory allocation usage
exceeds the hardware SLM size", matching this fingerprint. Intel triager
requested a zebin, reporter didn't respond, bot auto-closed. This is that
bug with the zebin-and-then-some.
Not the same as #403 (different trigger) nor as compute-runtime#683 (wrong
repo — failure is in IGC codegen, not NEO). Filing fresh here with the
zebin-equivalent evidence Intel asked for in 2023.
The kernel (HIP source, 52 LOC)
SPIR-V (718 LOC, result of
clang -O2+llvm-spirv+spirv-opt --eliminate-dead-*+ line-bisection)Click to expand SPIR-V assembly
Re-assemble with
spirv-as trigger.spvasm -o trigger.spv.Host (pure Level Zero, no HIP)
See
repro.cppin the reproducer repo (104 LOC,lze_loaderthe onlyruntime dep). Core loop:
Ask
all SIMD widths and silently dropping the kernel rather than emitting a
compile error).
-cl-opt-disable. Ideally an IGC env varthat disables only the function-inlining pass that produces the
unregister-allocatable vISA at
Q_1D = 9.Happy to bisect further, rebuild IGC from source for pass-level logging, or
test patches.