Module: Mesa
Branch: main
Commit: 200e551cbb36c201b0083c6a6ba8930c9077a6e8
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=200e551cbb36c201b0083c6a6ba8930c9077a6e8

Author: Konstantin Seurer <[email protected]>
Date:   Tue Dec 20 18:26:34 2022 +0100

nir/lower_shader_calls: Remat derefs before lowering resumes

Closes: #7923
cc: mesa-stable

Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20399>

---

 src/compiler/nir/nir_lower_shader_calls.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/src/compiler/nir/nir_lower_shader_calls.c 
b/src/compiler/nir/nir_lower_shader_calls.c
index 03a924f00e5..d0144eaf602 100644
--- a/src/compiler/nir/nir_lower_shader_calls.c
+++ b/src/compiler/nir/nir_lower_shader_calls.c
@@ -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");

Reply via email to