Ian Romanick <i...@freedesktop.org> writes: > From: Ian Romanick <ian.d.roman...@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.roman...@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 */
I guess it would make more sense to implement this optimization in an optimization pass (e.g. dead control flow elimination) rather than at translation time, that way you'd be able to remove if-branches that become empty after DCE and it would help the VEC4 back-end too. > nir_emit_cf_list(&if_stmt->else_list); > > bld.emit(BRW_OPCODE_ENDIF); > -- > 2.5.0 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev