Module: Mesa Branch: main Commit: b16472fc97fc5ddbf4c35e4a74b17d7fa7215e1c URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b16472fc97fc5ddbf4c35e4a74b17d7fa7215e1c
Author: Danylo Piliaiev <dpilia...@igalia.com> Date: Thu Sep 7 13:33:30 2023 +0200 ir3/lower_tex_prefetch: Fix crash with lowered load_barycentric_at_offset ir3_nir_lower_tex_prefetch expects src0 of load_interpolated_input to be intrinsic, however this assumption broke when src0 is load_barycentric_at_offset and is lowered in series of alu instructions. 32x2 %1121 = @load_barycentric_at_offset (%1120) (interp_mode=0) 32x4 %1118 = @load_interpolated_input (%1121, %1116 (0x0)) ... 32x2 %32 = vec2 %1118.x, %1118.y 32x4 %37 = (float32)tex %36 (texture_handle), %34 (sampler_handle), %32 (coord), 0 (texture), 0 (sampler) is lowered into: [...] 32 %54 = ffma %46.y, %52, %50 32 %55 = ffma %46.y, %53, %51 32x2 %56 = vec2 %54, %55 32x4 %57 = @load_interpolated_input (%56, %25 (0x0)) [...] Crash backtrace: #5 in __GI___assert_fail (assertion=0x7ff6692328 "parent && parent->type == nir_instr_type_intrinsic", file=0x7ff66921c8 "nir.h", line=2536, function=0x7ff6692630 <__PRETTY_FUNCTION__.13> "nir_instr_as_intrinsic") at assert.c:101 #6 in nir_instr_as_intrinsic (parent=0x7fd4b648e8) at nir.h:2536 #7 in coord_offset (ssa=0x7fd4b649d0) at ir3_nir_lower_tex_prefetch.c:77 #8 in coord_offset (ssa=0x7fd4b64a90) at ir3_nir_lower_tex_prefetch.c:48 #9 in ir3_nir_coord_offset (ssa=0x7fd4b64a90) at ir3_nir_lower_tex_prefetch.c:104 #10 in lower_tex_prefetch_block (block=0x7fd482c100) at ir3_nir_lower_tex_prefetch.c:185 #11 in lower_tex_prefetch_func (impl=0x7fd4aa0890) at ir3_nir_lower_tex_prefetch.c:218 #12 in ir3_nir_lower_tex_prefetch (shader=0x7fd4942b10) at ir3_nir_lower_tex_prefetch.c:242 Cc: mesa-stable Signed-off-by: Danylo Piliaiev <dpilia...@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25096> --- src/freedreno/ir3/ir3_nir_lower_tex_prefetch.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/freedreno/ir3/ir3_nir_lower_tex_prefetch.c b/src/freedreno/ir3/ir3_nir_lower_tex_prefetch.c index 05855d8b598..271c46e91d5 100644 --- a/src/freedreno/ir3/ir3_nir_lower_tex_prefetch.c +++ b/src/freedreno/ir3/ir3_nir_lower_tex_prefetch.c @@ -73,6 +73,10 @@ coord_offset(nir_def *ssa) if (input->intrinsic != nir_intrinsic_load_interpolated_input) return -1; + /* Happens with lowered load_barycentric_at_offset */ + if (input->src[0].ssa->parent_instr->type != nir_instr_type_intrinsic) + return -1; + nir_intrinsic_instr *interp = nir_instr_as_intrinsic(input->src[0].ssa->parent_instr);