summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2020-01-23 22:01:00 -0800
committerFrancisco Jerez <currojerez@riseup.net>2020-02-14 14:31:48 -0800
commitc9e33e5cbf6b8b953932f283e1f0abcb6c77eb1f (patch)
tree362830c8f99883031acba87c673dbad5a56d794f
parentfe1b0b7c500af7c489d8dffe72bdb2fadd7cf2ab (diff)
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>
-rw-r--r--src/intel/compiler/brw_fs_cse.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/intel/compiler/brw_fs_cse.cpp b/src/intel/compiler/brw_fs_cse.cpp
index b7c32f3907f..4751e11bcfe 100644
--- a/src/intel/compiler/brw_fs_cse.cpp
+++ b/src/intel/compiler/brw_fs_cse.cpp
@@ -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.