<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 6, 2016 at 5:12 PM, Eric Anholt <span dir="ltr"><<a href="mailto:eric@anholt.net" target="_blank">eric@anholt.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Due to the rampant dead code elimination in coordinate shaders for vc4, we<br>
often end up with IFs that do nothing on either side.  In the<br>
loops-enabled build, shader-db gives:<br>
<br>
total instructions in shared programs: 125192 -> 119693 (-4.39%)<br>
instructions in affected programs:     30649 -> 25150 (-17.94%)<br>
total uniforms in shared programs: 38436 -> 37632 (-2.09%)<br>
uniforms in affected programs:     6168 -> 5364 (-13.04%)<br>
---<br>
 src/compiler/nir/nir_opt_dead_cf.c | 41 ++++++++++++++++++++++++++++++++++----<br>
 1 file changed, 37 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir_opt_dead_cf.c b/src/compiler/nir/nir_opt_dead_cf.c<br>
index 81c1b650da96..eb98dc9507fb 100644<br>
--- a/src/compiler/nir/nir_opt_dead_cf.c<br>
+++ b/src/compiler/nir/nir_opt_dead_cf.c<br>
@@ -60,6 +60,12 @@<br>
  * }<br>
  * ...<br>
  *<br>
+ * We also delete IF statements with no instructions in either body:<br>
+ *<br>
+ * if (...) {<br>
+ * } else {<br>
+ * }<br></blockquote><div><br></div><div>We already have a NIR pass that does exactly this called opt_peephole_select.  From what I see with your pass, it doesn't properly handle phi nodes that may occur after the if statement which is exactly what the peephole_select pass is for.  Maybe that pass should just be rolled into dead_cf?<br><br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ *<br>
  * Finally, we also handle removing useless loops, i.e. loops with no side<br>
  * effects and without any definitions that are used elsewhere. This case is a<br>
  * little different from the first two in that the code is actually run (it<br>
@@ -134,6 +140,32 @@ opt_constant_if(nir_if *if_stmt, bool condition)<br>
    nir_cf_node_remove(&if_stmt->cf_node);<br>
 }<br>
<br>
+/* If the nir_if has no instructions on either side, then we can delete the<br>
+ * IF, and therefore also its use of the condition variable.<br>
+ */<br>
+static bool<br>
+opt_empty_if(nir_if *if_stmt)<br>
+{<br>
+   nir_cf_node *then_node = nir_if_first_then_node(if_stmt);<br>
+   nir_cf_node *else_node = nir_if_first_else_node(if_stmt);<br>
+<br>
+   /* We can only have one block in each side, with no instructions in them */<br>
+   if (nir_if_last_then_node(if_stmt) != then_node)<br>
+      return false;<br>
+   if (nir_if_last_else_node(if_stmt) != else_node)<br>
+      return false;<br>
+   nir_block *then_block = nir_cf_node_as_block(then_node);<br>
+   nir_block *else_block = nir_cf_node_as_block(else_node);<br>
+   if (!exec_list_is_empty(&then_block->instr_list))<br>
+      return false;<br>
+   if (!exec_list_is_empty(&else_block->instr_list))<br>
+      return false;<br>
+<br>
+   nir_cf_node_remove(&if_stmt->cf_node);<br>
+<br>
+   return true;<br>
+}<br>
+<br>
 static bool<br>
 cf_node_has_side_effects(nir_cf_node *node)<br>
 {<br>
@@ -224,11 +256,12 @@ dead_cf_block(nir_block *block)<br>
       nir_const_value *const_value =<br>
          nir_src_as_const_value(following_if->condition);<br>
<br>
-      if (!const_value)<br>
-         return false;<br>
+      if (const_value) {<br>
+         opt_constant_if(following_if, const_value->u32[0] != 0);<br>
+         return true;<br>
+      }<br>
<br>
-      opt_constant_if(following_if, const_value->u32[0] != 0);<br>
-      return true;<br>
+      return opt_empty_if(following_if);<br>
    }<br>
<br>
    nir_loop *following_loop = nir_block_get_following_loop(block);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.8.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>