[Mesa-dev] [PATCH] nir: allow propagation of if evaluation for bcsel

Jason Ekstrand jason at jlekstrand.net
Thu Nov 1 22:10:49 UTC 2018


On Thu, Nov 1, 2018 at 4:53 PM Timothy Arceri <tarceri at itsqueeze.com> wrote:

> Cc: Jason Ekstrand <jason at jlekstrand.net>
> ---
>  src/compiler/nir/nir_opt_if.c | 26 +++++++++++++++++---------
>  1 file changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/src/compiler/nir/nir_opt_if.c b/src/compiler/nir/nir_opt_if.c
> index 1fe95e53766..50e8947eaa1 100644
> --- a/src/compiler/nir/nir_opt_if.c
> +++ b/src/compiler/nir/nir_opt_if.c
> @@ -448,7 +448,7 @@ propagate_condition_eval(nir_builder *b, nir_if *nif,
> nir_src *use_src,
>     if (!evaluate_if_condition(nif, b->cursor, &bool_value))
>        return false;
>
> -   nir_ssa_def *def[2] = {0};
> +   nir_ssa_def *def[4] = {0};
>     for (unsigned i = 0; i < nir_op_infos[alu->op].num_inputs; i++) {
>        if (alu->src[i].src.ssa == use_src->ssa) {
>           def[i] = nir_imm_bool(b, bool_value);
> @@ -456,7 +456,7 @@ 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], NULL,
> NULL);
> +   nir_ssa_def *nalu = nir_build_alu(b, alu->op, def[0], def[1], def[2],
> def[3]);
>
>     /* Rewrite use to use new alu instruction */
>     nir_src new_src = nir_src_for_ssa(nalu);
> @@ -472,14 +472,22 @@ propagate_condition_eval(nir_builder *b, nir_if
> *nif, nir_src *use_src,
>  static bool
>  can_propagate_through_alu(nir_src *src)
>  {
> -   if (src->parent_instr->type == nir_instr_type_alu &&
> -       (nir_instr_as_alu(src->parent_instr)->op == nir_op_ior ||
> -        nir_instr_as_alu(src->parent_instr)->op == nir_op_iand ||
> -        nir_instr_as_alu(src->parent_instr)->op == nir_op_inot ||
> -        nir_instr_as_alu(src->parent_instr)->op == nir_op_b2i))
> -      return true;
> +   if (src->parent_instr->type != nir_instr_type_alu)
> +      return false;
>

We can do "nir_alu_instr *alu = nir_instr_as_alu(src->parent_instr)" here
and simplify the code below.


> -   return false;
> +   switch (nir_instr_as_alu(src->parent_instr)->op) {
> +      case nir_op_ior:
> +      case nir_op_iand:
> +      case nir_op_inot:
> +      case nir_op_b2i:
> +         return true;
> +      case nir_op_bcsel:
> +         if (src == &nir_instr_as_alu(src->parent_instr)->src[0].src)
> +            return true;
> +         /* fall through */
>

There's no good reason for the fall-through.  Just return false here.  Or,
better yet, "return src == &alu->src[0].src"

With those changes,

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>


> +      default:
> +         return false;
> +   }
>  }
>
>  static bool
> --
> 2.19.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181101/35dcad72/attachment-0001.html>


More information about the mesa-dev mailing list