nir: Report progress from nir_lower_locals_to_regs().
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 17 Sep 2015 19:29:49 +0000 (12:29 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Sep 2015 20:46:57 +0000 (13:46 -0700)
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/nir/nir.h
src/glsl/nir/nir_lower_locals_to_regs.c

index 5be5bfa2ab8f604a168d5a9da9290f5d91c1504f..26b3c75c1405875d6e90094bd38254687cd58a9d 100644 (file)
@@ -1811,7 +1811,7 @@ void nir_lower_var_copies(nir_shader *shader);
 
 bool nir_lower_global_vars_to_local(nir_shader *shader);
 
-void nir_lower_locals_to_regs(nir_shader *shader);
+bool nir_lower_locals_to_regs(nir_shader *shader);
 
 void nir_lower_outputs_to_temporaries(nir_shader *shader);
 
index 87d2498dd79ecc04a2fa95275c799f14d95148ea..17b53ca36f3006dc5850c7233131bc476c937eae 100644 (file)
@@ -40,6 +40,8 @@ struct locals_to_regs_state {
     * used to make adding register initialization code deterministic.
     */
    nir_array derefs_array;
+
+   bool progress;
 };
 
 /* The following two functions implement a hash and equality check for
@@ -228,6 +230,7 @@ lower_locals_to_regs_block(nir_block *block, void *void_state)
          nir_instr_insert_before(&intrin->instr, &mov->instr);
 
          nir_instr_remove(&intrin->instr);
+         state->progress = true;
          break;
       }
 
@@ -249,6 +252,7 @@ lower_locals_to_regs_block(nir_block *block, void *void_state)
          nir_instr_insert_before(&intrin->instr, &mov->instr);
 
          nir_instr_remove(&intrin->instr);
+         state->progress = true;
          break;
       }
 
@@ -336,15 +340,17 @@ insert_constant_initializer(nir_deref_var *deref_head, nir_deref *deref_tail,
    mov->dest.dest.reg.indirect = reg_src.reg.indirect;
 
    nir_instr_insert_after(&load->instr, &mov->instr);
+   state->progress = true;
 }
 
-static void
+static bool
 nir_lower_locals_to_regs_impl(nir_function_impl *impl)
 {
    struct locals_to_regs_state state;
 
    state.shader = impl->overload->function->shader;
    state.impl = impl;
+   state.progress = false;
    state.regs_table = _mesa_hash_table_create(NULL, hash_deref, derefs_equal);
    nir_array_init(&state.derefs_array, NULL);
 
@@ -372,13 +378,19 @@ nir_lower_locals_to_regs_impl(nir_function_impl *impl)
 
    nir_array_fini(&state.derefs_array);
    _mesa_hash_table_destroy(state.regs_table, NULL);
+
+   return state.progress;
 }
 
-void
+bool
 nir_lower_locals_to_regs(nir_shader *shader)
 {
+   bool progress = false;
+
    nir_foreach_overload(shader, overload) {
       if (overload->impl)
-         nir_lower_locals_to_regs_impl(overload->impl);
+         progress = nir_lower_locals_to_regs_impl(overload->impl) || progress;
    }
+
+   return progress;
 }