Source: mesa
Followup-For: Bug #1151491
X-Debbugs-Cc: [email protected]

I've now confirmed a fix with 1 revert and 2 cherry-picks from upstream:

I started from Salsa's debian/25.0.7-2, added 25.0.7-2+deb13u1 NMU
changes on top, and then used:

git revert 2d525d5e3401555d97fe827f8db5bfed8887dc33       # radeonsi: always 
lower alu bit sizes
git cherry-pick f034aa9cd31ea4aa367f8ed58bd270026abf748e  # radv: don't use 
bit_sizes_int to skip nir_lower_bit_size
git cherry-pick 33b5d8b2ec26904ec1c331dd64ee04e351fd8e0e  # radeonsi: always 
lower alu bit sizes

After confirming these fix the issue I converted them to debian/patches
and am including a debdiff here.
diff -Nru mesa-25.0.7/debian/changelog mesa-25.0.7/debian/changelog
--- mesa-25.0.7/debian/changelog        2026-06-19 19:20:06.000000000 +0000
+++ mesa-25.0.7/debian/changelog        2026-10-20 21:31:47.000000000 +0000
@@ -1,3 +1,9 @@
+mesa (25.0.7-2+deb13u1.1) trixie; urgency=medium
+
+  * Fix: Crash: Unsupported opcode v_lshlrev_b16 (closes #1151491)
+
+ -- Tj <[email protected]>  Tue, 20 Oct 2026 21:31:47 +0000
+
 mesa (25.0.7-2+deb13u1) trixie; urgency=high
 
   * Non-maintainer upload by the LTS Team.
diff -Nru 
mesa-25.0.7/debian/patches/radeonsi_always_lower_alu_bit_sizes_v2.patch 
mesa-25.0.7/debian/patches/radeonsi_always_lower_alu_bit_sizes_v2.patch
--- mesa-25.0.7/debian/patches/radeonsi_always_lower_alu_bit_sizes_v2.patch     
1970-01-01 00:00:00.000000000 +0000
+++ mesa-25.0.7/debian/patches/radeonsi_always_lower_alu_bit_sizes_v2.patch     
2026-10-20 21:31:47.000000000 +0000
@@ -0,0 +1,44 @@
+Description: radeonsi: always lower alu bit sizes
+Origin: 
https://gitlab.freedesktop.org/mesa/mesa/-/commit/33b5d8b2ec26904ec1c331dd64ee04e351fd8e0e
+Author: Georg Lehmann <[email protected]>
+Date:   Sun May 11 15:01:05 2025 +0200
+
+    radeonsi: always lower alu bit sizes
+    
+    Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13072
+    
+    load_vs_input_from_vertex_buffer can create unsupported 16bit shifts on 
GFX6/7.
+    
+    Reviewed-by: Marek Olšák <[email protected]>
+    Reviewed-by: Qiang Yu <[email protected]>
+    
+    Cc: mesa-stable
+    Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34946>
+
+diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
+index 0c054f44bf3..4307d33cedc 100644
+--- a/src/gallium/drivers/radeonsi/si_shader.c
++++ b/src/gallium/drivers/radeonsi/si_shader.c
+@@ -2553,16 +2553,15 @@ static void 
run_late_optimization_and_lowering_passes(struct si_nir_shader_ctx *
+    NIR_PASS(progress, nir, ac_nir_lower_mem_access_bit_sizes,
+             sel->screen->info.gfx_level, !nir->info.use_aco_amd);
+ 
+-   if (nir->info.stage == MESA_SHADER_KERNEL) {
++   if (nir->info.stage == MESA_SHADER_KERNEL)
+       NIR_PASS(progress, nir, ac_nir_lower_global_access);
+ 
+-      if (nir->info.bit_sizes_int & (8 | 16)) {
+-         if (sel->screen->info.gfx_level >= GFX8)
+-            nir_divergence_analysis(nir);
++   if (ac_nir_might_lower_bit_size(nir)) {
++      if (sel->screen->info.gfx_level >= GFX8)
++         nir_divergence_analysis(nir);
+ 
+-         NIR_PASS(progress, nir, nir_lower_bit_size, 
ac_nir_lower_bit_size_callback,
+-                  &sel->screen->info.gfx_level);
+-      }
++      NIR_PASS(progress, nir, nir_lower_bit_size, 
ac_nir_lower_bit_size_callback,
++               &sel->screen->info.gfx_level);
+    }
+ 
+    /* This must be after lowering resources to descriptor loads and before 
lowering intrinsics
diff -Nru 
mesa-25.0.7/debian/patches/radv-do-not-use-bit_sizes_int-to-skip-nir_lower_bit_size.patch
 
mesa-25.0.7/debian/patches/radv-do-not-use-bit_sizes_int-to-skip-nir_lower_bit_size.patch
--- 
mesa-25.0.7/debian/patches/radv-do-not-use-bit_sizes_int-to-skip-nir_lower_bit_size.patch
   1970-01-01 00:00:00.000000000 +0000
+++ 
mesa-25.0.7/debian/patches/radv-do-not-use-bit_sizes_int-to-skip-nir_lower_bit_size.patch
   2026-10-20 21:31:47.000000000 +0000
@@ -0,0 +1,117 @@
+Description: radv: don't use bit_sizes_int to skip nir_lower_bit_size
+Origin: 
https://gitlab.freedesktop.org/mesa/mesa/-/commit/f034aa9cd31ea4aa367f8ed58bd270026abf748e
+Author: Rhys Perry <[email protected]>
+Date:   Mon Feb 3 16:33:46 2025 +0000
+
+    radv: don't use bit_sizes_int to skip nir_lower_bit_size
+    
+    Signed-off-by: Rhys Perry <[email protected]>
+    Reviewed-by: Georg Lehmann <[email protected]>
+    Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29242>
+
+diff --git a/src/amd/common/nir/ac_nir.c b/src/amd/common/nir/ac_nir.c
+index 76114ffe436..7df173a76d2 100644
+--- a/src/amd/common/nir/ac_nir.c
++++ b/src/amd/common/nir/ac_nir.c
+@@ -340,11 +340,9 @@ ac_nir_optimize_uniform_atomics(nir_shader *nir)
+    return progress;
+ }
+ 
+-unsigned
+-ac_nir_lower_bit_size_callback(const nir_instr *instr, void *data)
++static unsigned
++lower_bit_size_callback(const nir_instr *instr, enum amd_gfx_level chip, bool 
divergence_known)
+ {
+-   enum amd_gfx_level chip = *(enum amd_gfx_level *)data;
+-
+    if (instr->type != nir_instr_type_alu)
+       return 0;
+    nir_alu_instr *alu = nir_instr_as_alu(instr);
+@@ -374,10 +372,10 @@ ac_nir_lower_bit_size_callback(const nir_instr *instr, 
void *data)
+       case nir_op_isign:
+       case nir_op_uadd_sat:
+       case nir_op_usub_sat:
+-         return (bit_size == 8 || !(chip >= GFX8 && alu->def.divergent)) ? 32 
: 0;
++         return (!divergence_known || bit_size == 8 || !(chip >= GFX8 && 
alu->def.divergent)) ? 32 : 0;
+       case nir_op_iadd_sat:
+       case nir_op_isub_sat:
+-         return bit_size == 8 || !alu->def.divergent ? 32 : 0;
++         return !divergence_known || bit_size == 8 || !alu->def.divergent ? 
32 : 0;
+ 
+       default:
+          return 0;
+@@ -399,7 +397,7 @@ ac_nir_lower_bit_size_callback(const nir_instr *instr, 
void *data)
+       case nir_op_uge:
+       case nir_op_bitz:
+       case nir_op_bitnz:
+-         return (bit_size == 8 || !(chip >= GFX8 && alu->def.divergent)) ? 32 
: 0;
++         return (!divergence_known || bit_size == 8 || !(chip >= GFX8 && 
alu->def.divergent)) ? 32 : 0;
+       default:
+          return 0;
+       }
+@@ -408,6 +406,28 @@ ac_nir_lower_bit_size_callback(const nir_instr *instr, 
void *data)
+    return 0;
+ }
+ 
++unsigned
++ac_nir_lower_bit_size_callback(const nir_instr *instr, void *data)
++{
++   enum amd_gfx_level chip = *(enum amd_gfx_level *)data;
++   return lower_bit_size_callback(instr, chip, true);
++}
++
++bool
++ac_nir_might_lower_bit_size(const nir_shader *shader)
++{
++   nir_foreach_function_impl(impl, shader) {
++      nir_foreach_block(block, impl) {
++         nir_foreach_instr(instr, block) {
++            if (lower_bit_size_callback(instr, CLASS_UNKNOWN, false))
++               return true;
++         }
++      }
++   }
++
++   return false;
++}
++
+ static unsigned
+ align_load_store_size(enum amd_gfx_level gfx_level, unsigned size, bool 
uses_smem, bool is_shared)
+ {
+diff --git a/src/amd/common/nir/ac_nir.h b/src/amd/common/nir/ac_nir.h
+index 6020015e1a1..567b8cae46a 100644
+--- a/src/amd/common/nir/ac_nir.h
++++ b/src/amd/common/nir/ac_nir.h
+@@ -396,6 +396,9 @@ ac_nir_optimize_uniform_atomics(nir_shader *nir);
+ unsigned
+ ac_nir_lower_bit_size_callback(const nir_instr *instr, void *data);
+ 
++bool
++ac_nir_might_lower_bit_size(const nir_shader *shader);
++
+ bool
+ ac_nir_mem_vectorize_callback(unsigned align_mul, unsigned align_offset, 
unsigned bit_size,
+                               unsigned num_components, int64_t hole_size,
+diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
+index 46ffc0ceb06..90e7083cc61 100644
+--- a/src/amd/vulkan/radv_pipeline.c
++++ b/src/amd/vulkan/radv_pipeline.c
+@@ -352,9 +352,6 @@ radv_postprocess_nir(struct radv_device *device, const 
struct radv_graphics_stat
+          NIR_PASS(_, stage->nir, nir_opt_shrink_stores, 
!instance->drirc.disable_shrink_image_store);
+ 
+          constant_fold_for_push_const = true;
+-
+-         /* Gather info again, to update whether 8/16-bit are used. */
+-         nir_shader_gather_info(stage->nir, 
nir_shader_get_entrypoint(stage->nir));
+       }
+    }
+ 
+@@ -533,7 +530,7 @@ radv_postprocess_nir(struct radv_device *device, const 
struct radv_graphics_stat
+ 
+    NIR_PASS(_, stage->nir, nir_lower_fp16_casts, nir_lower_fp16_split_fp64);
+ 
+-   if (stage->nir->info.bit_sizes_int & (8 | 16)) {
++   if (ac_nir_might_lower_bit_size(stage->nir)) {
+       if (gfx_level >= GFX8)
+          nir_divergence_analysis(stage->nir);
+ 
diff -Nru 
mesa-25.0.7/debian/patches/Revert-radeonsi_always_lower_alu_bit_sizes.patch 
mesa-25.0.7/debian/patches/Revert-radeonsi_always_lower_alu_bit_sizes.patch
--- mesa-25.0.7/debian/patches/Revert-radeonsi_always_lower_alu_bit_sizes.patch 
1970-01-01 00:00:00.000000000 +0000
+++ mesa-25.0.7/debian/patches/Revert-radeonsi_always_lower_alu_bit_sizes.patch 
2026-10-20 21:31:47.000000000 +0000
@@ -0,0 +1,48 @@
+Description: Revert radeonsi: always lower alu bit sizes
+Author: Tj <[email protected]>
+Date:   Tue Oct 20 20:45:53 2026 +0000
+
+    Revert "radeonsi: always lower alu bit sizes"
+    
+    This reverts commit 2d525d5e3401555d97fe827f8db5bfed8887dc33.
+
+diff --git a/.pick_status.json b/.pick_status.json
+index dae6a46eb87..d82c06d0a66 100644
+--- a/.pick_status.json
++++ b/.pick_status.json
+@@ -5834,7 +5834,7 @@
+         "description": "radeonsi: always lower alu bit sizes",
+         "nominated": true,
+         "nomination_type": 1,
+-        "resolution": 1,
++        "resolution": 0,
+         "main_sha": null,
+         "because_sha": null,
+         "notes": null
+diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
+index 0a700863197..0c054f44bf3 100644
+--- a/src/gallium/drivers/radeonsi/si_shader.c
++++ b/src/gallium/drivers/radeonsi/si_shader.c
+@@ -2553,15 +2553,16 @@ static void 
run_late_optimization_and_lowering_passes(struct si_nir_shader_ctx *
+    NIR_PASS(progress, nir, ac_nir_lower_mem_access_bit_sizes,
+             sel->screen->info.gfx_level, !nir->info.use_aco_amd);
+ 
+-   if (nir->info.stage == MESA_SHADER_KERNEL)
++   if (nir->info.stage == MESA_SHADER_KERNEL) {
+       NIR_PASS(progress, nir, ac_nir_lower_global_access);
+ 
+-   if (nir->info.bit_sizes_int & (8 | 16)) {
+-      if (sel->screen->info.gfx_level >= GFX8)
+-         nir_divergence_analysis(nir);
++      if (nir->info.bit_sizes_int & (8 | 16)) {
++         if (sel->screen->info.gfx_level >= GFX8)
++            nir_divergence_analysis(nir);
+ 
+-      NIR_PASS(progress, nir, nir_lower_bit_size, 
ac_nir_lower_bit_size_callback,
+-               &sel->screen->info.gfx_level);
++         NIR_PASS(progress, nir, nir_lower_bit_size, 
ac_nir_lower_bit_size_callback,
++                  &sel->screen->info.gfx_level);
++      }
+    }
+ 
+    /* This must be after lowering resources to descriptor loads and before 
lowering intrinsics
diff -Nru mesa-25.0.7/debian/patches/series mesa-25.0.7/debian/patches/series
--- mesa-25.0.7/debian/patches/series   2026-06-19 19:20:06.000000000 +0000
+++ mesa-25.0.7/debian/patches/series   2026-10-20 21:31:47.000000000 +0000
@@ -7,3 +7,6 @@
 backport_STACK_ARRAY.patch
 CVE-2026-40393-part1.patch
 CVE-2026-40393-part2.patch
+Revert-radeonsi_always_lower_alu_bit_sizes.patch
+radv-do-not-use-bit_sizes_int-to-skip-nir_lower_bit_size.patch
+radeonsi_always_lower_alu_bit_sizes_v2.patch

Reply via email to