[Mesa-dev] [PATCH 1/3] nir/inline: Make the rewrite_param_derefs helper work on instructions

Connor Abbott cwabbott0 at gmail.com
Fri May 27 04:32:02 UTC 2016


On Wed, May 25, 2016 at 1:53 PM, Jason Ekstrand <jason at jlekstrand.net> wrote:
> Now that we have the better nir_foreach_block macro, there's no reason to
> use the archaic block version for everything.
> ---
>  src/compiler/nir/nir_inline_functions.c | 53 ++++++++++++++++-----------------
>  1 file changed, 25 insertions(+), 28 deletions(-)
>
> diff --git a/src/compiler/nir/nir_inline_functions.c b/src/compiler/nir/nir_inline_functions.c
> index 4641e8c..e124a77 100644
> --- a/src/compiler/nir/nir_inline_functions.c
> +++ b/src/compiler/nir/nir_inline_functions.c
> @@ -27,40 +27,36 @@
>
>  static bool inline_function_impl(nir_function_impl *impl, struct set *inlined);
>
> -static bool
> -rewrite_param_derefs_block(nir_block *block, nir_call_instr *call)
> +static void
> +rewrite_param_derefs(nir_instr *instr, nir_call_instr *call)
>  {
> -   nir_foreach_instr_safe(instr, block) {
> -      if (instr->type != nir_instr_type_intrinsic)
> -         continue;
> -
> -      nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
> +   if (instr->type != nir_instr_type_intrinsic)
> +      return;
>
> -      for (unsigned i = 0;
> -           i < nir_intrinsic_infos[intrin->intrinsic].num_variables; i++) {
> -         if (intrin->variables[i]->var->data.mode != nir_var_param)
> -            continue;
> +   nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
>
> -         int param_idx = intrin->variables[i]->var->data.location;
> +   for (unsigned i = 0;
> +        i < nir_intrinsic_infos[intrin->intrinsic].num_variables; i++) {
> +      if (intrin->variables[i]->var->data.mode != nir_var_param)
> +         continue;
>
> -         nir_deref_var *call_deref;
> -         if (param_idx >= 0) {
> -            assert(param_idx < call->callee->num_params);
> -            call_deref = call->params[param_idx];
> -         } else {
> -            call_deref = call->return_deref;
> -         }
> -         assert(call_deref);
> +      int param_idx = intrin->variables[i]->var->data.location;
>
> -         nir_deref_var *new_deref = nir_deref_as_var(nir_copy_deref(intrin, &call_deref->deref));
> -         nir_deref *new_tail = nir_deref_tail(&new_deref->deref);
> -         new_tail->child = intrin->variables[i]->deref.child;
> -         ralloc_steal(new_tail, new_tail->child);
> -         intrin->variables[i] = new_deref;
> +      nir_deref_var *call_deref;
> +      if (param_idx >= 0) {
> +         assert(param_idx < call->callee->num_params);
> +         call_deref = call->params[param_idx];
> +      } else {
> +         call_deref = call->return_deref;
>        }
> -   }
> +      assert(call_deref);
>
> -   return true;
> +      nir_deref_var *new_deref = nir_deref_as_var(nir_copy_deref(intrin, &call_deref->deref));
> +      nir_deref *new_tail = nir_deref_tail(&new_deref->deref);
> +      new_tail->child = intrin->variables[i]->deref.child;
> +      ralloc_steal(new_tail, new_tail->child);
> +      intrin->variables[i] = new_deref;
> +   }
>  }
>
>  static void
> @@ -184,7 +180,8 @@ inline_functions_block(nir_block *block, nir_builder *b,
>        }
>
>        nir_foreach_block(block, callee_copy) {
> -         rewrite_param_derefs_block(block, call);
> +         nir_foreach_instr_safe(instr, block)
> +            rewrite_param_derefs(instr, call);

I realize this was in the original, but I don't think we need the
_safe variant here, since we don't remove/add instructions.

>        }
>
>        /* Pluck the body out of the function and place it here */
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> 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