intel/fs/cse: Make HALT instruction act as CSE barrier.
Found by inspection. This seems particularly likely to cause problems with instructions dependent on the current execution mask like SHADER_OPCODE_FIND_LIVE_CHANNEL or the FS_OPCODE_LOAD_LIVE_CHANNELS instruction I'm about to introduce, but one could imagine it leading to data corruption if CSE ever managed to combine two instructions before and after the FS_OPCODE_PLACEHOLDER_HALT, since the one before may not be executed for some channels. Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com> Cc: 20.0 <mesa-stable@lists.freedesktop.org>
This commit is contained in:
@@ -317,6 +317,16 @@ fs_visitor::opt_cse_local(bblock_t *block, int &ip)
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 == FS_OPCODE_DISCARD_JUMP ||
|
||||
inst->opcode == FS_OPCODE_PLACEHOLDER_HALT)
|
||||
aeb.make_empty();
|
||||
|
||||
foreach_in_list_safe(aeb_entry, entry, &aeb) {
|
||||
/* Kill all AEB entries that write a different value to or read from
|
||||
* the flag register if we just wrote it.
|
||||
|
Reference in New Issue
Block a user