nir: clone instruction set rather than removing individual entries
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 20 Feb 2019 03:03:37 +0000 (14:03 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 21 Feb 2019 21:36:36 +0000 (08:36 +1100)
This reduces the time spent in nir_opt_cse() by almost a half.

The massif tool from callgrind reported no change in peak
memory use with the large doliphin uber shaders I used for
testing.

Reviewed-by: Thomas Helland<thomashelland90@gmail.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_opt_cse.c

index bf42a6a33dc5bb170749fc66114f0d0076f1a909..3c3617d852a7b7845c9b08f27caa47e89f012de9 100644 (file)
  */
 
 static bool
-cse_block(nir_block *block, struct set *instr_set)
+cse_block(nir_block *block, struct set *dominance_set)
 {
    bool progress = false;
+   struct set *instr_set = _mesa_set_clone(dominance_set, NULL);
 
    nir_foreach_instr_safe(instr, block) {
       if (nir_instr_set_add_or_rewrite(instr_set, instr)) {
@@ -55,8 +56,7 @@ cse_block(nir_block *block, struct set *instr_set)
       progress |= cse_block(child, instr_set);
    }
 
-   nir_foreach_instr(instr, block)
-     nir_instr_set_remove(instr_set, instr);
+   _mesa_set_destroy(instr_set, NULL);
 
    return progress;
 }