[Mesa-dev] [PATCH v2] nir: fix condition propagation when src has a swizzle

Jason Ekstrand jason at jlekstrand.net
Fri Nov 2 14:45:15 UTC 2018


LGTM

On Fri, Nov 2, 2018 at 8:37 AM Timothy Arceri <tarceri at itsqueeze.com> wrote:

> We cannot use nir_build_alu() to create the new alu as it has no
> way to know how many components of the src we will use. This
> results in it guessing the max number of components from one of
> its inputs.
>
> Fixes the following CTS tests:
>
>
> dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag
>
> dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom
>
> dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_tessc
>
> dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_vert
>
> V2: use nir_src_for_ssa() in clone
>
> Fixes: 2975422ceb6c ("nir: propagates if condition evaluation down some
> alu chains")
> ---
>  src/compiler/nir/nir_opt_if.c | 31 ++++++++++++++++++++++++++++++-
>  1 file changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c
> index ed93cac9ce9..8a971c43f24 100644
> --- a/src/compiler/nir/nir_opt_if.c
> +++ b/src/compiler/nir/nir_opt_if.c
> @@ -391,6 +391,34 @@ evaluate_if_condition(nir_if *nif, nir_cursor cursor,
> bool *value)
>     }
>  }
>
> +static nir_ssa_def *
> +clone_alu_and_replace_src_defs(nir_builder *b, const nir_alu_instr *alu,
> +                               nir_ssa_def **src_defs)
> +{
> +   nir_alu_instr *nalu = nir_alu_instr_create(b->shader, alu->op);
> +   nalu->exact = alu->exact;
> +
> +   nir_ssa_dest_init(&nalu->instr, &nalu->dest.dest,
> +                     alu->dest.dest.ssa.num_components,
> +                     alu->dest.dest.ssa.bit_size, alu->dest.dest.ssa.name
> );
> +
> +   nalu->dest.saturate = alu->dest.saturate;
> +   nalu->dest.write_mask = alu->dest.write_mask;
> +
> +   for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {
> +      assert(alu->src[i].src.is_ssa);
> +      nalu->src[i].src = nir_src_for_ssa(src_defs[i]);
> +      nalu->src[i].negate = alu->src[i].negate;
> +      nalu->src[i].abs = alu->src[i].abs;
> +      memcpy(nalu->src[i].swizzle, alu->src[i].swizzle,
> +             sizeof(nalu->src[i].swizzle));
> +   }
> +
> +   nir_builder_instr_insert(b, &nalu->instr);
> +
> +   return &nalu->dest.dest.ssa;;
> +}
> +
>  /*
>   * This propagates if condition evaluation down the chain of some alu
>   * instructions. For example by checking the use of some of the following
> alu
> @@ -456,7 +484,8 @@ propagate_condition_eval(nir_builder *b, nir_if *nif,
> nir_src *use_src,
>           def[i] = alu->src[i].src.ssa;
>        }
>     }
> -   nir_ssa_def *nalu = nir_build_alu(b, alu->op, def[0], def[1], def[2],
> def[3]);
> +
> +   nir_ssa_def *nalu = clone_alu_and_replace_src_defs(b, alu, def);
>
>     /* Rewrite use to use new alu instruction */
>     nir_src new_src = nir_src_for_ssa(nalu);
> --
> 2.19.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181102/8409aade/attachment.html>


More information about the mesa-dev mailing list