Mesa (glsl2): linker: Do post-link lowering and optimization

Ian Romanick idr at kemper.freedesktop.org
Wed Jul 21 00:52:48 UTC 2010


Module: Mesa
Branch: glsl2
Commit: a7ba9a7919110fd619b0e792368aa1f3534080fe
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a7ba9a7919110fd619b0e792368aa1f3534080fe

Author: Ian Romanick <ian.d.romanick at intel.com>
Date:   Tue Jul 20 13:36:32 2010 -0700

linker: Do post-link lowering and optimization

The lowering code should probably be moved elsewhere.

---

 src/glsl/linker.cpp |   38 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index eb4eb9d..640e6ee 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -80,6 +80,7 @@ extern "C" {
 #include "hash_table.h"
 #include "shader_api.h"
 #include "linker.h"
+#include "ir_optimization.h"
 
 /**
  * Visitor that determines whether or not a variable is ever written.
@@ -1223,6 +1224,43 @@ link_shaders(struct gl_shader_program *prog)
    }
 
    /* FINISHME: Perform whole-program optimization here. */
+   for (unsigned i = 0; i < prog->_NumLinkedShaders; i++) {
+      /* Optimization passes */
+      bool progress;
+      exec_list *ir = prog->_LinkedShaders[i]->ir;
+
+      /* Lowering */
+      do_mat_op_to_vec(ir);
+      do_mod_to_fract(ir);
+      do_div_to_mul_rcp(ir);
+
+      do {
+	 progress = false;
+
+	 progress = do_function_inlining(ir) || progress;
+	 progress = do_if_simplification(ir) || progress;
+	 progress = do_copy_propagation(ir) || progress;
+	 progress = do_dead_code_local(ir) || progress;
+#if 0
+	 progress = do_dead_code_unlinked(state, ir) || progress;
+#endif
+	 progress = do_constant_variable_unlinked(ir) || progress;
+	 progress = do_constant_folding(ir) || progress;
+	 progress = do_if_return(ir) || progress;
+#if 0
+	 if (ctx->Shader.EmitNoIfs)
+	    progress = do_if_to_cond_assign(ir) || progress;
+#endif
+
+	 progress = do_vec_index_to_swizzle(ir) || progress;
+	 /* Do this one after the previous to let the easier pass handle
+	  * constant vector indexing.
+	  */
+	 progress = do_vec_index_to_cond_assign(ir) || progress;
+
+	 progress = do_swizzle_swizzle(ir) || progress;
+      } while (progress);
+   }
 
    assign_uniform_locations(prog);
 




More information about the mesa-commit mailing list