nir/loop_unroll: Re-materialize derefs in use blocks before unrolling
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 11 Sep 2018 17:51:09 +0000 (12:51 -0500)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 19 Sep 2018 06:59:40 +0000 (01:59 -0500)
When we're about to re-arrange a bunch of blocks, it's a good idea to
make sure that we don't have deref uses crossing block boundaries.
Otherwise we may end up with a deref going through a phi and that would
be bad.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Cc: "18.2" <mesa-stable@lists.freedesktop.org>
src/compiler/nir/nir_opt_loop_unroll.c

index 0ba150f126453296850035552a6a20761f14161e..ea2012e292a4f65564115f3bd90124dc1e3683e3 100644 (file)
@@ -49,6 +49,9 @@
 static void
 loop_prepare_for_unroll(nir_loop *loop)
 {
+   nir_rematerialize_derefs_in_use_blocks_impl(
+      nir_cf_node_get_function(&loop->cf_node));
+
    nir_convert_loop_to_lcssa(loop);
 
    /* Lower phis at the top level of the loop body */
@@ -691,17 +694,9 @@ nir_opt_loop_unroll_impl(nir_function_impl *impl,
                                 &has_nested_loop);
    }
 
-   if (progress) {
+   if (progress)
       nir_lower_regs_to_ssa_impl(impl);
 
-      /* Calling nir_convert_loop_to_lcssa() adds extra phi nodes which may
-       * not be valid if they're used for something such as a deref.
-       *  Remove any unneeded phis.
-       */
-      nir_copy_prop(impl->function->shader);
-      nir_opt_remove_phis_impl(impl);
-   }
-
    return progress;
 }