[Mesa-dev] [PATCH] Revert "nir: Make nir_opt_remove_phis see through moves."

Connor Abbott cwabbott0 at gmail.com
Fri Sep 2 22:41:16 UTC 2016


I think we can just fix this by emitting another move with the right
swizzle. Then DCE should clean up the original moves, so it should
still be a win. Let me send a patch.

On Fri, Sep 2, 2016 at 4:50 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> This reverts commit 144cbf89879103c45f79b7c5b923ebad63f08c55.
>
> It doesn't work.  Given a phi after if/else blocks where both phi
> sources are identical MOVs, it rewrites the phi destination to use
> the first def it encounters...namely the result of the mov in the
> then block.  This results in the else branch's value being thrown
> out entirely, which is quite bogus.
>
> Fixes 12 CTS tests:
> ES31-CTS.functional.tessellation.invariance.outer_edge_symmetry.quads*
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/compiler/nir/nir_opt_remove_phis.c | 24 +-----------------------
>  1 file changed, 1 insertion(+), 23 deletions(-)
>
> diff --git a/src/compiler/nir/nir_opt_remove_phis.c b/src/compiler/nir/nir_opt_remove_phis.c
> index ee92fbe..f1e7bb0 100644
> --- a/src/compiler/nir/nir_opt_remove_phis.c
> +++ b/src/compiler/nir/nir_opt_remove_phis.c
> @@ -27,26 +27,6 @@
>
>  #include "nir.h"
>
> -static nir_alu_instr *
> -get_parent_mov(nir_ssa_def *ssa)
> -{
> -   if (ssa->parent_instr->type != nir_instr_type_alu)
> -      return NULL;
> -
> -   nir_alu_instr *alu = nir_instr_as_alu(ssa->parent_instr);
> -   return (alu->op == nir_op_imov || alu->op == nir_op_fmov) ? alu : NULL;
> -}
> -
> -static bool
> -matching_mov(nir_alu_instr *mov1, nir_ssa_def *ssa)
> -{
> -   if (!mov1)
> -      return false;
> -
> -   nir_alu_instr *mov2 = get_parent_mov(ssa);
> -   return mov2 && nir_alu_srcs_equal(mov1, mov2, 0, 0);
> -}
> -
>  /*
>   * This is a pass for removing phi nodes that look like:
>   * a = phi(b, b, b, ...)
> @@ -74,7 +54,6 @@ remove_phis_block(nir_block *block)
>        nir_phi_instr *phi = nir_instr_as_phi(instr);
>
>        nir_ssa_def *def = NULL;
> -      nir_alu_instr *mov = NULL;
>        bool srcs_same = true;
>
>        nir_foreach_phi_src(src, phi) {
> @@ -96,9 +75,8 @@ remove_phis_block(nir_block *block)
>
>           if (def == NULL) {
>              def  = src->src.ssa;
> -            mov = get_parent_mov(def);
>           } else {
> -            if (src->src.ssa != def && !matching_mov(mov, src->src.ssa)) {
> +            if (src->src.ssa != def) {
>                 srcs_same = false;
>                 break;
>              }
> --
> 2.9.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list