<div dir="ltr">I think we can just move it up a couple of loops to the place where we do the final lowering and call gather_info.  Other than that, this seems like a good idea to me.  NIR passes are pretty sloppy about memory and assume nir_sweep gets called.  Hanging on to linked shaders with all that garbage floating around is a bad plan.<br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jul 10, 2018 at 1:53 AM Danylo Piliaiev <<a href="mailto:danylo.piliaiev@gmail.com">danylo.piliaiev@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">After optimization passes and many trasfromations most of memory<br>
NIR holds is a garbage which was being freed only after shader deletion.<br>
Freeing it at the end of linking will save memory which would be useful<br>
in case there are a lot of complex shaders being compiled.<br>
The common case for this issue is 32bit game running under Wine.<br>
<br>
The cost of the optimization is around ~3-5% of compilation speed<br>
with complex shaders.<br>
<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=103274" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/show_bug.cgi?id=103274</a><br>
<br>
Signed-off-by: Danylo Piliaiev <<a href="mailto:danylo.piliaiev@globallogic.com" target="_blank">danylo.piliaiev@globallogic.com</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_link.cpp | 9 +++++++++<br>
 1 file changed, 9 insertions(+)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp<br>
index 1071056f14..8f34a58ce7 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_link.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_link.cpp<br>
@@ -359,6 +359,15 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)<br>
       }<br>
    }<br>
<br>
+   for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) {<br>
+      struct gl_linked_shader *shader = shProg->_LinkedShaders[stage];<br>
+      if (!shader)<br>
+         continue;<br>
+<br>
+      struct gl_program *prog = shader->Program;<br>
+      nir_sweep(prog->nir);<br>
+   }<br>
+<br>
    if (brw->ctx.Cache) {<br>
       for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) {<br>
          struct gl_linked_shader *shader = shProg->_LinkedShaders[stage];<br>
-- <br>
2.17.1<br>
<br>
</blockquote></div>