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

Samuel Pitoiset samuel.pitoiset at gmail.com
Fri Nov 2 09:21:45 UTC 2018


This change breaks:

dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_frag,Fail
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_geom,Fail
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_tessc,Fail
dEQP-VK.spirv_assembly.instruction.graphics.selection_block_order.out_of_order_vert,Fail

On 11/1/18 10:53 PM, Timothy Arceri 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;
>   
> -   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 */
> +      default:
> +         return false;
> +   }
>   }
>   
>   static bool
> 


More information about the mesa-dev mailing list