freedreno: crash in emit_intrinsic due to use of nir_intrinsic_load_global_ir3 on a5xx
I get a crash while trying to run clFFT-client on a Dragonboard 820c with Mesa 22.2.1:
(gdb) bt
#0 0x0000000000000000 in ?? ()
#1 0x0000ffffb063ed3c in emit_intrinsic (ctx=ctx@entry=0xffffa00022c0,
intr=intr@entry=0xffffa0059d00) at ../src/freedreno/ir3/ir3_compiler_nir.c:2154
#2 0x0000ffffb0640930 in emit_instr (instr=0xffffa0059d00, ctx=0xffffa00022c0)
at ../src/freedreno/ir3/ir3_compiler_nir.c:3495
#3 emit_block (ctx=ctx@entry=0xffffa00022c0, nblock=nblock@entry=0xffffa00016a0)
at ../src/freedreno/ir3/ir3_compiler_nir.c:3596
#4 0x0000ffffb0642b84 in emit_cf_list (ctx=ctx@entry=0xffffa00022c0, list=0xffffa0002ba0)
at ../src/freedreno/ir3/ir3_compiler_nir.c:3717
#5 0x0000ffffb064363c in emit_function (impl=0xffffa0002b70, ctx=0xffffa00022c0)
at ../src/freedreno/ir3/ir3_compiler_nir.c:3876
#6 emit_instructions (ctx=0xffffa00022c0) at ../src/freedreno/ir3/ir3_compiler_nir.c:4416
#7 ir3_compile_shader_nir (compiler=<optimized out>, shader=shader@entry=0xaaaaaabd3bf0,
so=so@entry=0xffffa0000ba0) at ../src/freedreno/ir3/ir3_compiler_nir.c:4617
#8 0x0000ffffb062dc78 in compile_variant (shader=shader@entry=0xaaaaaabd3bf0,
v=v@entry=0xffffa0000ba0) at ../src/freedreno/ir3/ir3_shader.c:293
#9 0x0000ffffb062e324 in create_variant (shader=shader@entry=0xaaaaaabd3bf0,
key=key@entry=0xffffaf63d5d0, write_disasm=write_disasm@entry=false,
mem_ctx=mem_ctx@entry=0xaaaaaabd3bf0) at ../src/freedreno/ir3/ir3_shader.c:432
#10 0x0000ffffb062e424 in ir3_shader_get_variant (shader=shader@entry=0xaaaaaabd3bf0,
key=key@entry=0xffffaf63d5d0, binning_pass=false, write_disasm=write_disasm@entry=false,
created=created@entry=0xffffaf63d5a7) at ../src/freedreno/ir3/ir3_shader.c:477
#11 0x0000ffffb05a7354 in ir3_shader_variant (shader=shader@entry=0xaaaaaabd3bf0, key=...,
binning_pass=binning_pass@entry=false, debug=debug@entry=0xffffaf63d620)
at ../src/gallium/drivers/freedreno/ir3/ir3_gallium.c:132
#12 0x0000ffffb05a7610 in create_initial_compute_variants_async (job=job@entry=0xaaaaaad1fa00,
gdata=gdata@entry=0x0, thread_index=thread_index@entry=0)
at ../src/gallium/drivers/freedreno/ir3/ir3_gallium.c:261
#13 0x0000ffffb055b014 in util_queue_thread_func (input=input@entry=0xaaaaaabd2220)
at ../src/util/u_queue.c:306
#14 0x0000ffffb05a196c in impl_thrd_routine (p=<optimized out>)
at ../src/c11/impl/threads_posix.c:67
#15 0x0000ffffbf0bce84 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442
#16 0x0000ffffbf12555c in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:79
It crashes on this line of code:
(gdb) up
#1 0x0000ffffb063ed3c in emit_intrinsic (ctx=ctx@entry=0xffffa00022c0,
intr=intr@entry=0xffffa0059d00) at ../src/freedreno/ir3/ir3_compiler_nir.c:2154
2154 ctx->funcs->emit_intrinsic_load_global_ir3(ctx, intr, dst);
emit_intrinsic_load_global_ir3
is NULL, since ir3_a4xx_funcs
sets that and emit_intrinsic_store_global_ir3
to NULL. Looks like this intrinsic shouldn't be generated on pre-a6xx, according to the comments on !11431 (merged) .
This intrinsic seems to be generated in ir3_nir_lower_64b.c in the lower_64b_global function. This was added in !13300 (fd2eeaa1) .
/cc @robclark