nir: Split nir_index_vars into two functions
authorJason Ekstrand <jason@jlekstrand.net>
Mon, 20 Jul 2020 21:49:46 +0000 (16:49 -0500)
committerMarge Bot <eric+marge@anholt.net>
Wed, 29 Jul 2020 17:38:58 +0000 (17:38 +0000)
We also very slightly change the semantics.  It no longer is one index
per list for global variables and is a single index over-all.

Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5966>

src/compiler/nir/nir.c
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_large_constants.c
src/compiler/nir/nir_opt_load_store_vectorize.c

index 3d0fd42b316c6f7689841f4114aa725855a0f5d8..a9fe16f4069a10ed068f38258d1a2569968535dc 100644 (file)
@@ -1821,36 +1821,43 @@ nir_index_instrs(nir_function_impl *impl)
 }
 
 static void
-index_var_list(struct exec_list *list)
+index_var_list(struct exec_list *list, unsigned *count)
 {
-   unsigned next_index = 0;
    nir_foreach_variable(var, list)
-      var->index = next_index++;
+      var->index = (*count)++;
 }
 
-void
-nir_index_vars(nir_shader *shader, nir_function_impl *impl, nir_variable_mode modes)
+unsigned
+nir_shader_index_vars(nir_shader *shader, nir_variable_mode modes)
 {
-   if ((modes & nir_var_function_temp) && impl)
-      index_var_list(&impl->locals);
-
+   unsigned count = 0;
    if (modes & nir_var_shader_temp)
-      index_var_list(&shader->globals);
+      index_var_list(&shader->globals, &count);
 
    if (modes & nir_var_shader_in)
-      index_var_list(&shader->inputs);
+      index_var_list(&shader->inputs, &count);
 
    if (modes & nir_var_shader_out)
-      index_var_list(&shader->outputs);
+      index_var_list(&shader->outputs, &count);
 
    if (modes & (nir_var_uniform | nir_var_mem_ubo | nir_var_mem_ssbo))
-      index_var_list(&shader->uniforms);
+      index_var_list(&shader->uniforms, &count);
 
    if (modes & nir_var_mem_shared)
-      index_var_list(&shader->shared);
+      index_var_list(&shader->shared, &count);
 
    if (modes & nir_var_system_value)
-      index_var_list(&shader->system_values);
+      index_var_list(&shader->system_values, &count);
+
+   return count;
+}
+
+unsigned
+nir_function_impl_index_vars(nir_function_impl *impl)
+{
+   unsigned count = 0;
+   index_var_list(&impl->locals, &count);
+   return count;
 }
 
 static nir_instr *
index dca19596632f4b65256e28aa8b2ea6e2b230f094..f131e0b3f244a88bb40fe6c25778e1c2bdccd558 100644 (file)
@@ -3737,7 +3737,8 @@ unsigned nir_index_instrs(nir_function_impl *impl);
 
 void nir_index_blocks(nir_function_impl *impl);
 
-void nir_index_vars(nir_shader *shader, nir_function_impl *impl, nir_variable_mode modes);
+unsigned nir_shader_index_vars(nir_shader *shader, nir_variable_mode modes);
+unsigned nir_function_impl_index_vars(nir_function_impl *impl);
 
 void nir_print_shader(nir_shader *shader, FILE *fp);
 void nir_print_shader_annotated(nir_shader *shader, FILE *fp, struct hash_table *errors);
index 2575407ca0b5b4e3bb72b745a1a1e2f30e364cd2..25c402920332d0c20875be3ec33ae8601b58d889 100644 (file)
@@ -176,8 +176,7 @@ nir_opt_large_constants(nir_shader *shader,
    /* This pass can only be run once */
    assert(shader->constant_data == NULL && shader->constant_data_size == 0);
 
-   unsigned num_locals = exec_list_length(&impl->locals);
-   nir_index_vars(shader, impl, nir_var_function_temp);
+   unsigned num_locals = nir_function_impl_index_vars(impl);
 
    if (num_locals == 0) {
       nir_shader_preserve_all_metadata(shader);
index 7777a63c5aeec659cf4f4286bff6f39b8f3bb0ca..f9b6774aa4e32c14e6530c4f5aa790e988b3bae1 100644 (file)
@@ -1359,12 +1359,12 @@ nir_opt_load_store_vectorize(nir_shader *shader, nir_variable_mode modes,
    ctx->callback = callback;
    ctx->robust_modes = robust_modes;
 
-   nir_index_vars(shader, NULL, modes);
+   nir_shader_index_vars(shader, modes);
 
    nir_foreach_function(function, shader) {
       if (function->impl) {
          if (modes & nir_var_function_temp)
-            nir_index_vars(shader, function->impl, nir_var_function_temp);
+            nir_function_impl_index_vars(function->impl);
 
          nir_foreach_block(block, function->impl)
             progress |= process_block(function->impl, ctx, block);