nir/opt_if: Re-materialize derefs in use blocks before peeling loops
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 11 Sep 2018 17:55:45 +0000 (12:55 -0500)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 19 Sep 2018 07:00:49 +0000 (02:00 -0500)
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107879
Cc: "18.2" <mesa-stable@lists.freedesktop.org>
src/compiler/nir/nir_opt_if.c

index 5780ae3794bf061aeddaf4187561a08e0f0c3e17..0c94aa170b585c98a087854e2773427881811419 100644 (file)
@@ -181,6 +181,13 @@ opt_peel_loop_initial_if(nir_loop *loop)
       }
    }
 
+   /* We're about to re-arrange a bunch of blocks so make sure that we don't
+    * have deref uses which cross block boundaries.  We don't want a deref
+    * accidentally ending up in a phi.
+    */
+   nir_rematerialize_derefs_in_use_blocks_impl(
+      nir_cf_node_get_function(&loop->cf_node));
+
    /* Before we do anything, convert the loop to LCSSA.  We're about to
     * replace a bunch of SSA defs with registers and this will prevent any of
     * it from leaking outside the loop.
@@ -659,12 +666,6 @@ nir_opt_if(nir_shader *shader)
           */
          nir_lower_regs_to_ssa_impl(function->impl);
 
-         /* Calling nir_convert_loop_to_lcssa() in opt_peel_loop_initial_if()
-          * adds extra phi nodes which may not be valid if they're used for
-          * something such as a deref.  Remove any unneeded phis.
-          */
-         nir_opt_remove_phis_impl(function->impl);
-
          progress = true;
       }
    }