On 15/2/19 4:12 pm, Jason Ekstrand wrote:
I think the primary issue we had with dead ifs before is that we were running dce and dead_cf but maybe not peephole_select because it didn't seem applicable.  In principle, I think I like dead_cf being able to handle if statements as well because it seems like a thing it should do.  However, it's obviously very expensive so I'm happy for us to drop it for now.  One day, maybe we can make the pass less expensive so it doesn't walk the list of instructions nearly as many times and making it handle ifs will be more practical.  For now, however, I think this is the right thing to do.

As far as I understand it all it (and peephole) is really doing is removing:

if (cond) {

} else {

}

Because DCE already removes the dead instructions.

This pass is looking at the instructions in every if it sees. If we don't want to depend on peephole we can add a simple check in nir_opt_if to look for empty branches. That would be much cheaper.



Reviewed-by: Jason Ekstrand <[email protected] <mailto:[email protected]>>

On Wed, Feb 13, 2019 at 7:38 PM Timothy Arceri <[email protected] <mailto:[email protected]>> wrote:

    This was probably useful when it was first written, however it
    looks to be no longer necessary.

    As far as I can tell these days dce is smart enough to remove useless
    instructions from if branches. Once this is done
    nir_opt_peephole_select() will end up removing the empty if.

    Removing this support reduces the dolphin uber shader compilation
    time by around 60%. Compile time is reduced due to no longer having
    to compute the live ssa defs metadata so much.

    No shader-db changes on i965 or radeonsi.
    ---
      src/compiler/nir/nir_opt_dead_cf.c | 9 ++-------
      1 file changed, 2 insertions(+), 7 deletions(-)

    diff --git a/src/compiler/nir/nir_opt_dead_cf.c
    b/src/compiler/nir/nir_opt_dead_cf.c
    index 14986732096..053c5743527 100644
    --- a/src/compiler/nir/nir_opt_dead_cf.c
    +++ b/src/compiler/nir/nir_opt_dead_cf.c
    @@ -180,7 +180,7 @@ def_not_live_out(nir_ssa_def *def, void *state)
      }

      /*
    - * Test if a loop node or if node is dead. Such nodes are dead if:
    + * Test if a loop node is dead. Such nodes are dead if:
       *
       * 1) It has no side effects (i.e. intrinsics which could possibly
    affect the
       * state of the program aside from producing an SSA value,
    indicated by a lack
    @@ -198,7 +198,7 @@ def_not_live_out(nir_ssa_def *def, void *state)
      static bool
      node_is_dead(nir_cf_node *node)
      {
    -   assert(node->type == nir_cf_node_loop || node->type ==
    nir_cf_node_if);
    +   assert(node->type == nir_cf_node_loop);

         nir_block *before = nir_cf_node_as_block(nir_cf_node_prev(node));
         nir_block *after = nir_cf_node_as_block(nir_cf_node_next(node));
    @@ -230,11 +230,6 @@ dead_cf_block(nir_block *block)
      {
         nir_if *following_if = nir_block_get_following_if(block);
         if (following_if) {
    -      if (node_is_dead(&following_if->cf_node)) {
    -         nir_cf_node_remove(&following_if->cf_node);
    -         return true;
    -      }
    -
            if (!nir_src_is_const(following_if->condition))
               return false;

-- 2.20.1

    _______________________________________________
    mesa-dev mailing list
    [email protected] <mailto:[email protected]>
    https://lists.freedesktop.org/mailman/listinfo/mesa-dev

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to