pan/nir: Fix 8 and 16 bool reduction lowering

OpenCL-CTS `test_relationals relational_any` fails on Panfrost with an
assertion:
```
src/panfrost/compiler/pan_nir_lower_bool_to_bitsize.c:296:
lower_alu_instr: Assertion `alu->def.bit_size > 1' failed.
```

Bool to bitsize pass handles 2, 3 and 4-wide boolean reduction, but does
not handle 8 and 16, which fall-through to the default case, producing
1-bit bools.

Fixes: 5de5987678 ("nir,panfrost: Move lower_bool_to_bitsize to
panfrost")

Signed-off-by: Ahmed Hesham <ahmed.hesham@arm.com>
Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Reviewed-by: Eric R. Smith <eric.smith@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41770>
This commit is contained in:
Ahmed Hesham 2026-05-23 21:51:32 +00:00 committed by Marge Bot
parent 5a9e40f028
commit 2757fd1c44

View file

@ -114,15 +114,23 @@ lower_alu_instr(nir_builder *b, nir_alu_instr *alu)
case nir_op_ball_fequal2:
case nir_op_ball_fequal3:
case nir_op_ball_fequal4:
case nir_op_ball_fequal8:
case nir_op_ball_fequal16:
case nir_op_bany_fnequal2:
case nir_op_bany_fnequal3:
case nir_op_bany_fnequal4:
case nir_op_bany_fnequal8:
case nir_op_bany_fnequal16:
case nir_op_ball_iequal2:
case nir_op_ball_iequal3:
case nir_op_ball_iequal4:
case nir_op_ball_iequal8:
case nir_op_ball_iequal16:
case nir_op_bany_inequal2:
case nir_op_bany_inequal3:
case nir_op_bany_inequal4:
case nir_op_bany_inequal8:
case nir_op_bany_inequal16:
case nir_op_ieq:
case nir_op_ine:
make_sources_canonical(b, alu, 0);
@ -237,6 +245,16 @@ lower_alu_instr(nir_builder *b, nir_alu_instr *alu)
: nir_op_b32all_fequal4;
break;
case nir_op_ball_fequal8:
opcode = bit_size == 8 ? nir_op_b8all_fequal8 : bit_size == 16 ? nir_op_b16all_fequal8
: nir_op_b32all_fequal8;
break;
case nir_op_ball_fequal16:
opcode = bit_size == 8 ? nir_op_b8all_fequal16 : bit_size == 16 ? nir_op_b16all_fequal16
: nir_op_b32all_fequal16;
break;
case nir_op_bany_fnequal2:
opcode = bit_size == 8 ? nir_op_b8any_fnequal2 : bit_size == 16 ? nir_op_b16any_fnequal2
: nir_op_b32any_fnequal2;
@ -252,6 +270,16 @@ lower_alu_instr(nir_builder *b, nir_alu_instr *alu)
: nir_op_b32any_fnequal4;
break;
case nir_op_bany_fnequal8:
opcode = bit_size == 8 ? nir_op_b8any_fnequal8 : bit_size == 16 ? nir_op_b16any_fnequal8
: nir_op_b32any_fnequal8;
break;
case nir_op_bany_fnequal16:
opcode = bit_size == 8 ? nir_op_b8any_fnequal16 : bit_size == 16 ? nir_op_b16any_fnequal16
: nir_op_b32any_fnequal16;
break;
case nir_op_ball_iequal2:
opcode = bit_size == 8 ? nir_op_b8all_iequal2 : bit_size == 16 ? nir_op_b16all_iequal2
: nir_op_b32all_iequal2;
@ -267,6 +295,16 @@ lower_alu_instr(nir_builder *b, nir_alu_instr *alu)
: nir_op_b32all_iequal4;
break;
case nir_op_ball_iequal8:
opcode = bit_size == 8 ? nir_op_b8all_iequal8 : bit_size == 16 ? nir_op_b16all_iequal8
: nir_op_b32all_iequal8;
break;
case nir_op_ball_iequal16:
opcode = bit_size == 8 ? nir_op_b8all_iequal16 : bit_size == 16 ? nir_op_b16all_iequal16
: nir_op_b32all_iequal16;
break;
case nir_op_bany_inequal2:
opcode = bit_size == 8 ? nir_op_b8any_inequal2 : bit_size == 16 ? nir_op_b16any_inequal2
: nir_op_b32any_inequal2;
@ -282,6 +320,16 @@ lower_alu_instr(nir_builder *b, nir_alu_instr *alu)
: nir_op_b32any_inequal4;
break;
case nir_op_bany_inequal8:
opcode = bit_size == 8 ? nir_op_b8any_inequal8 : bit_size == 16 ? nir_op_b16any_inequal8
: nir_op_b32any_inequal8;
break;
case nir_op_bany_inequal16:
opcode = bit_size == 8 ? nir_op_b8any_inequal16 : bit_size == 16 ? nir_op_b16any_inequal16
: nir_op_b32any_inequal16;
break;
case nir_op_bcsel:
opcode = bit_size == 8 ? nir_op_b8csel : bit_size == 16 ? nir_op_b16csel
: nir_op_b32csel;