nir/lower_shader_calls: Remat derefs before lowering resumes
authorKonstantin Seurer <konstantin.seurer@gmail.com>
Tue, 20 Dec 2022 17:26:34 +0000 (18:26 +0100)
committerMarge Bot <emma+marge@anholt.net>
Fri, 24 Mar 2023 14:55:37 +0000 (14:55 +0000)
Closes: #7923
cc: mesa-stable

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20399>

src/compiler/nir/nir_lower_shader_calls.c

index 03a924f..d0144ea 100644 (file)
@@ -1184,6 +1184,13 @@ lower_resume(nir_shader *shader, int call_idx)
    nir_function_impl *impl = nir_shader_get_entrypoint(shader);
    nir_instr *resume_instr = find_resume_instr(impl, call_idx);
 
+   /* Deref chains contain metadata information that is needed by other passes
+    * after this one. If we don't rematerialize the derefs in the blocks where
+    * they're used here, the following lowerings will insert phis which can
+    * prevent other passes from chasing deref chains.
+    */
+   nir_rematerialize_derefs_in_use_blocks_impl(impl);
+
    if (duplicate_loop_bodies(impl, resume_instr)) {
       nir_validate_shader(shader, "after duplicate_loop_bodies in "
                                   "nir_lower_shader_calls");