[Mesa-dev] [PATCH] i965: Don't emit an empty then-branch

Ian Romanick idr at freedesktop.org
Wed Feb 24 18:43:16 UTC 2016


From: Ian Romanick <ian.d.romanick at intel.com>

Invert the condition and just emit the non-empty else-branch.

total instructions in shared programs: 8448571 -> 8448373 (-0.00%)
instructions in affected programs: 20880 -> 20682 (-0.95%)
helped: 114
HURT: 0

Jason suggested that there were several places that tried to determine
that a flow control path had no instructions and the code should be
refactored.  Using 'grep -r is_empty' in src/mesa/drivers/dri/i965 and
src/compiler/nir, I could not find any such locations.  As a result, I
just open coded the check.  Did I just miss the other occurrences?

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
index db20c71..06e8aff 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
@@ -417,13 +417,21 @@ fs_visitor::nir_emit_if(nir_if *if_stmt)
                                    BRW_REGISTER_TYPE_D));
    inst->conditional_mod = BRW_CONDITIONAL_NZ;
 
-   bld.IF(BRW_PREDICATE_NORMAL);
+   fs_inst *if_inst = bld.IF(BRW_PREDICATE_NORMAL);
 
-   nir_emit_cf_list(&if_stmt->then_list);
+   const nir_cf_node *const cf = nir_if_first_then_node(if_stmt);
+   const nir_block *const block = nir_cf_node_as_block(cf);
 
-   /* note: if the else is empty, dead CF elimination will remove it */
-   bld.emit(BRW_OPCODE_ELSE);
+   /* If the then-list has no instructions, don't emit it. */
+   if (nir_cf_node_is_last(cf) && block->instr_list.is_empty()) {
+      if_inst->predicate_inverse = true;
+   } else {
+      nir_emit_cf_list(&if_stmt->then_list);
 
+      bld.emit(BRW_OPCODE_ELSE);
+   }
+
+   /* note: if the else is empty, dead CF elimination will remove it */
    nir_emit_cf_list(&if_stmt->else_list);
 
    bld.emit(BRW_OPCODE_ENDIF);
-- 
2.5.0



More information about the mesa-dev mailing list