[Mesa-dev] [PATCH 1/5] nir: Don't insert a fake link if unnecessary.

Kenneth Graunke kenneth at whitecape.org
Fri Sep 4 23:31:00 PDT 2015


On Friday, September 04, 2015 11:56:29 AM Connor Abbott wrote:
> On Thu, Sep 3, 2015 at 2:32 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> > Prevents regressions in ~128 tests when fixing unlink_block_successors
> > in the next commit.
> >
> > XXX: Zero thought has been put into whether this is the right solution

FYI, here are the Piglit tests that break (from nir/cf: Fix
unlink_block_successors to actually unlink the second one.)

glslparsertest/shaders/correctfull.frag
shaders/dead-code-break-interaction
shaders/glsl-link-bug30552
shaders/loopfunc
spec/glsl-1.30/compiler/switch-statement/switch-case-const-int-expression.vert
spec/glsl-1.30/compiler/switch-statement/switch-case-const-int.vert
spec/glsl-1.30/compiler/switch-statement/switch-case-fallthrough.vert
spec/glsl-1.30/compiler/switch-statement/switch-case-statement.vert
spec/glsl-1.30/compiler/switch-statement/switch-default.vert
spec/glsl-1.30/compiler/switch-statement/switch-expression-const-int.vert
spec/glsl-1.30/compiler/switch-statement/switch-expression-in-int.vert
spec/glsl-1.30/compiler/switch-statement/switch-expression-uniform-int.vert
spec/glsl-1.30/compiler/switch-statement/switch-expression-var-int.vert
spec/glsl-1.30/compiler/switch-statement/switch-nested-break.vert
spec/glsl-1.30/compiler/switch-statement/switch-nested-loop.vert
spec/glsl-1.30/compiler/switch-statement/switch-nested-switch.vert

> I'm confused as to how this can happen. The fake link is only for the
> situation where we have an infinite loop:
> 
> while(true) {
>    ...
>    if (false)
>       break;
> }
> 
> Say that we're doing dead control flow elimination, and we want to
> remove the break. Now, we're left with an infinite loop:
> 
> while (true) {
>    ...
> }
> 
> But now, the code after the loop is unreachable, and the blocks after
> it get bogus dominance tree information, which causes some piglit
> parser tests to crash. The hack I added was to create a "fake" link
> from the last block in the loop to the block after the loop. Now,
> dominance analysis (and whatever else) thinks there's a way to get out
> of the loop, which keeps stuff like to-SSA from crashing.
> block->successors[0] should still point to the first block in the
> loop, and block->successors[1] should point to the block after the
> loop, so they shouldn't be the same. Maybe there's another bug that
> this is hiding?
> 
> P.S. now that we have dead control flow elimination, maybe we can
> simply mark all code after an infinite loop as unreachable, and make
> sure that we run it before we try to use to-SSA or anything else that
> depends on the dominance tree. After all, there's a similar situation
> with
> 
> if (foo)
>    break;
> else
>    continue;
> 
> and there, we were relying on GLSL IR to optimize away everything after the if.
> 
> >
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> >  src/glsl/nir/nir_control_flow.c | 8 +++++---
> >  1 file changed, 5 insertions(+), 3 deletions(-)
> >
> > The problem is that this fake link causes the same block to be
> > block->successors[0] and block->successors[1]...
> >
> > diff --git a/src/glsl/nir/nir_control_flow.c b/src/glsl/nir/nir_control_flow.c
> > index 5c03375..d0b2a10 100644
> > --- a/src/glsl/nir/nir_control_flow.c
> > +++ b/src/glsl/nir/nir_control_flow.c
> > @@ -542,13 +542,15 @@ void unlink_jump(nir_block *block, nir_jump_type type)
> >           nir_loop *loop =
> >              nir_cf_node_as_loop(nir_cf_node_prev(&next->cf_node));
> >
> > -         /* insert fake link */
> > +         /* insert fake link if necessary */
> >           nir_cf_node *last = nir_loop_last_cf_node(loop);
> >           assert(last->type == nir_cf_node_block);
> >           nir_block *last_block = nir_cf_node_as_block(last);
> >
> > -         last_block->successors[1] = next;
> > -         block_add_pred(next, last_block);
> > +         if (last_block->successors[0] != next) {
> > +            last_block->successors[1] = next;
> > +            block_add_pred(next, last_block);
> > +         }
> >        }
> >     }
> >
> > --
> > 2.5.0
> >
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150904/4ddf0327/attachment.sig>


More information about the mesa-dev mailing list