brw: make HALT instruction act as barrier in new CSE pass

This brings back c9e33e5cbf ("intel/fs/cse: Make HALT instruction act
as CSE barrier."), from the old CSE pass into the new one.

Fixes new CTS test: dEQP-VK.subgroups.shader_quad_control.terminated_invocation

Fixes: 9690bd369d ("intel/brw: Delete old local common subexpression elimination pass")
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34643>
(cherry picked from commit 29d7b90cfc)
This commit is contained in:
Iván Briano 2025-04-18 16:46:04 -07:00 committed by Eric Engestrom
parent d0627d243d
commit b939de025d
2 changed files with 19 additions and 1 deletions

View file

@ -54,7 +54,7 @@
"description": "brw: make HALT instruction act as barrier in new CSE pass",
"nominated": true,
"nomination_type": 2,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "9690bd369d5a6739142eeb23f92d34429b75855d",
"notes": null

View file

@ -418,6 +418,24 @@ brw_opt_cse_defs(brw_shader &s)
last_flag_write = last;
last = inst;
/* Discard jumps aren't represented in the CFG unfortunately, so we need
* to make sure that they behave as a CSE barrier, since we lack global
* dataflow information. This is particularly likely to cause problems
* with instructions dependent on the current execution mask like
* SHADER_OPCODE_FIND_LIVE_CHANNEL.
*/
if (inst->opcode == BRW_OPCODE_HALT ||
inst->opcode == SHADER_OPCODE_HALT_TARGET) {
/* Treat each side of the HALT separately for local_only
* expressions as it's altering the channel enables.
*/
set_foreach(set, e) {
brw_inst *match = (brw_inst *) e->key;
if (match->block == block && local_only(match))
_mesa_set_remove(set, e);
}
}
if (inst->dst.is_null()) {
bool ignored;
if (last_flag_write && !inst->writes_accumulator &&