[Mesa-dev] [PATCH] nir/remove_phis: handle trivial back-edges

Jason Ekstrand jason at jlekstrand.net
Thu May 21 22:16:23 PDT 2015


This looks totally sane to me.

Reviewed-by: Jason Ekstrand <jason.ekstrand at intel.com>

I'll try and get some shader-db numbers for you tomorrow.
--Jason

On May 21, 2015 5:07 PM, "Connor Abbott" <cwabbott0 at gmail.com> wrote:
>
> Some loops may have phi nodes that look like:
>
> foo = ...
> loop {
>     bar = phi(foo, bar)
>     ...
> }
>
> in which case we can remove the phi node and replace all uses of 'bar'
> with 'foo'. In particular, there are some L4D2 vertex shaders with loops
> that, after optimization, look like:
>
>         /* succs: block_1 */
>         loop {
>                 block block_1:
>                 /* preds: block_0 block_4 */
>                 vec1 ssa_2195 = phi block_0: ssa_2136, block_4: ssa_994
>                 vec1 ssa_7321 = phi block_0: ssa_8195, block_4: ssa_7321
>                 vec1 ssa_7324 = phi block_0: ssa_8198, block_4: ssa_7324
>                 vec1 ssa_7327 = phi block_0: ssa_8174, block_4: ssa_7327
>                 vec1 ssa_8139 = intrinsic load_uniform () () (232)
>                 vec1 ssa_588 = ige ssa_2195, ssa_8139
>                 /* succs: block_2 block_3 */
>                 if ssa_588 {
>                         block block_2:
>                         /* preds: block_1 */
>                         break
>                         /* succs: block_5 */
>                 } else {
>                         block block_3:
>                         /* preds: block_1 */
>                         /* succs: block_4 */
>                 }
>                 block block_4:
>                 /* preds: block_3 */
>                 vec1 ssa_994 = iadd ssa_2195, ssa_2150
>                 /* succs: block_1 */
>         }
>
> where after removing the second, third, and fourth phi nodes, the loop
> becomes entirely dead, and this patch combined with my nir-dead-cf-v4
> branch will cause the loop to be deleted entirely.
>
> No piglit regressions.
>
> Signed-off-by: Connor Abbott <cwabbott0 at gmail.com>
> ---
>  src/glsl/nir/nir_opt_remove_phis.c | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/src/glsl/nir/nir_opt_remove_phis.c
b/src/glsl/nir/nir_opt_remove_phis.c
> index 7896584..3660413 100644
> --- a/src/glsl/nir/nir_opt_remove_phis.c
> +++ b/src/glsl/nir/nir_opt_remove_phis.c
> @@ -60,6 +60,21 @@ remove_phis_block(nir_block *block, void *state)
>
>        nir_foreach_phi_src(phi, src) {
>           assert(src->src.is_ssa);
> +
> +         /* For phi nodes at the beginning of loops, we may encounter
some
> +          * sources from backedges that point back to the destination of
the
> +          * same phi, i.e. something like:
> +          *
> +          * a = phi(a, b, ...)
> +          *
> +          * We can safely ignore these sources, since if all of the
normal
> +          * sources point to the same definition, then that definition
must
> +          * still dominate the phi node, and the phi will still always
take
> +          * the value of that definition.
> +          */
> +
> +         if (src->src.ssa == &phi->dest.ssa)
> +            continue;
>
>           if (def == NULL) {
>              def  = src->src.ssa;
> @@ -74,6 +89,11 @@ remove_phis_block(nir_block *block, void *state)
>        if (!srcs_same)
>           continue;
>
> +      /* We must have found at least one definition, since there must be
at
> +       * least one forward edge.
> +       */
> +      assert(def != NULL);
> +
>        assert(phi->dest.is_ssa);
>        nir_ssa_def_rewrite_uses(&phi->dest.ssa, nir_src_for_ssa(def),
>                                 mem_ctx);
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150521/a2c8d590/attachment.html>


More information about the mesa-dev mailing list