glsl: Move 'foo = foo;' optimization to opt_dead_code_local
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 21 Sep 2017 00:51:39 +0000 (19:51 -0500)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 2 Oct 2017 21:46:11 +0000 (14:46 -0700)
The optimization as done in opt_copy_propagation would have to be
removed in the next patch.  If we just eliminate that optimization
altogether, shader-db results, even on platforms that use NIR, are hurt
quite substantially.  I have not investigated why NIR isn't picking up
the slack here.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Cc: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/glsl/opt_copy_propagation.cpp
src/compiler/glsl/opt_dead_code_local.cpp

index b72ae5a5e11a8ebed5dcd54b5d71d2db0e2d5ecc..b8ef0de0a301317f3c26105444ec7a8a1dd4c7af 100644 (file)
@@ -348,18 +348,13 @@ ir_copy_propagation_visitor::add_copy(ir_assignment *ir)
    ir_variable *lhs_var = ir->whole_variable_written();
    ir_variable *rhs_var = ir->rhs->whole_variable_referenced();
 
-   if ((lhs_var != NULL) && (rhs_var != NULL)) {
-      if (lhs_var == rhs_var) {
-        /* This is a dumb assignment, but we've conveniently noticed
-         * it here.  Removing it now would mess up the loop iteration
-         * calling us.  Just flag it to not execute, and someone else
-         * will clean up the mess.
-         */
-        ir->condition = new(ralloc_parent(ir)) ir_constant(false);
-        this->progress = true;
-      } else if (lhs_var->data.mode != ir_var_shader_storage &&
-                 lhs_var->data.mode != ir_var_shader_shared &&
-                 lhs_var->data.precise == rhs_var->data.precise) {
+   /* Don't try to remove a dumb assignment of a variable to itself.  Removing
+    * it now would mess up the loop iteration calling us.
+    */
+   if (lhs_var != NULL && rhs_var != NULL && lhs_var != rhs_var) {
+      if (lhs_var->data.mode != ir_var_shader_storage &&
+          lhs_var->data.mode != ir_var_shader_shared &&
+          lhs_var->data.precise == rhs_var->data.precise) {
          assert(lhs_var);
          assert(rhs_var);
          _mesa_hash_table_insert(acp, lhs_var, rhs_var);
index a4038794c6bfed8451501f35778844f443075678..3cbc441ac9c0cd3d7dfd9457f6ffcd99ad0f919a 100644 (file)
@@ -173,6 +173,17 @@ process_assignment(void *lin_ctx, ir_assignment *ir, exec_list *assignments)
    bool progress = false;
    kill_for_derefs_visitor v(assignments);
 
+   if (ir->condition == NULL) {
+      /* If this is an assignment of the form "foo = foo;", remove the whole
+       * instruction and be done with it.
+       */
+      const ir_variable *const lhs_var = ir->whole_variable_written();
+      if (lhs_var != NULL && lhs_var == ir->rhs->whole_variable_referenced()) {
+         ir->remove();
+         return true;
+      }
+   }
+
    /* Kill assignment entries for things used to produce this assignment. */
    ir->rhs->accept(&v);
    if (ir->condition) {