Mesa (master): nir: Take call instruction into account in copy_prop_vars

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Oct 16 00:35:04 UTC 2018


Module: Mesa
Branch: master
Commit: dc349f07b5f9c257f68ecf0cbb89f9722a42233a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=dc349f07b5f9c257f68ecf0cbb89f9722a42233a

Author: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Date:   Fri Sep 14 18:17:51 2018 -0700

nir: Take call instruction into account in copy_prop_vars

Calls are not used yet (functions are inlined), but since new code is
already taking them into account, do it here too.  The convention here
and in other places is that no writable memory is assumed to remain
unchanged, as well as global variables.

Also, explicitly state the modes affected (instead of using the
reverse logic) in one of the apply_for_barrier_modes calls.

Suggested by Jason.

v2: Consider local vars used by a call to be conservative, SPIR-V has
    such cases. (Jason)

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

---

 src/compiler/nir/nir_opt_copy_prop_vars.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/compiler/nir/nir_opt_copy_prop_vars.c b/src/compiler/nir/nir_opt_copy_prop_vars.c
index 5276aa176d..b3f4e86bab 100644
--- a/src/compiler/nir/nir_opt_copy_prop_vars.c
+++ b/src/compiler/nir/nir_opt_copy_prop_vars.c
@@ -404,6 +404,15 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
       copy_entry_remove(state, iter);
 
    nir_foreach_instr_safe(instr, block) {
+      if (instr->type == nir_instr_type_call) {
+         apply_barrier_for_modes(copies, nir_var_shader_out |
+                                         nir_var_global |
+                                         nir_var_local |
+                                         nir_var_shader_storage |
+                                         nir_var_shared);
+         continue;
+      }
+
       if (instr->type != nir_instr_type_intrinsic)
          continue;
 
@@ -411,12 +420,9 @@ copy_prop_vars_block(struct copy_prop_var_state *state,
       switch (intrin->intrinsic) {
       case nir_intrinsic_barrier:
       case nir_intrinsic_memory_barrier:
-         /* If we hit a barrier, we need to trash everything that may possibly
-          * be accessible to another thread.  Locals, globals, and things of
-          * the like are safe, however.
-          */
-         apply_barrier_for_modes(state, ~(nir_var_local | nir_var_global |
-                                          nir_var_shader_in | nir_var_uniform));
+         apply_barrier_for_modes(copies, nir_var_shader_out |
+                                         nir_var_shader_storage |
+                                         nir_var_shared);
          break;
 
       case nir_intrinsic_emit_vertex:




More information about the mesa-commit mailing list