[Mesa-dev] [PATCH 1/3] nir: handle no variable in derefs in some places

Jason Ekstrand jason at jlekstrand.net
Mon Jul 9 04:57:28 UTC 2018


On Tue, Jul 3, 2018 at 11:25 PM Dave Airlie <airlied at gmail.com> wrote:

> From: Dave Airlie <airlied at redhat.com>
>
> ---
>  src/compiler/nir/nir_gather_info.c           | 2 ++
>  src/compiler/nir/nir_lower_indirect_derefs.c | 4 ++++
>  src/compiler/nir/nir_lower_vars_to_ssa.c     | 4 ++++
>  3 files changed, 10 insertions(+)
>
> diff --git a/src/compiler/nir/nir_gather_info.c
> b/src/compiler/nir/nir_gather_info.c
> index 2b431e343e9..4bbdd967c2b 100644
> --- a/src/compiler/nir/nir_gather_info.c
> +++ b/src/compiler/nir/nir_gather_info.c
> @@ -233,6 +233,8 @@ gather_intrinsic_info(nir_intrinsic_instr *instr,
> nir_shader *shader,
>        nir_deref_instr *deref = nir_src_as_deref(instr->src[0]);
>        nir_variable *var = nir_deref_instr_get_variable(deref);
>
> +      if (!var)
> +         break;
>

You should be able to change the if below to

if (deref->mode == nir_var_shader_in || deref->mode == nir_var_shader_out)

and then pull the nir_deref_instr_get_variable inside the if.


>        if (var->data.mode == nir_var_shader_in ||
>            var->data.mode == nir_var_shader_out) {
>           bool is_output_read = false;
> diff --git a/src/compiler/nir/nir_lower_indirect_derefs.c
> b/src/compiler/nir/nir_lower_indirect_derefs.c
> index d85c1704222..be39e1098ed 100644
> --- a/src/compiler/nir/nir_lower_indirect_derefs.c
> +++ b/src/compiler/nir/nir_lower_indirect_derefs.c
> @@ -131,6 +131,8 @@ lower_indirect_derefs_block(nir_block *block,
> nir_builder *b,
>           continue;
>
>        nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]);
> +      if (!deref)
> +         continue;
>

Is this a real problem?  intrin->src[0] should always point at a deref even
if that deref is just a cast.


>        /* Walk the deref chain back to the base and look for indirects */
>        bool has_indirect = false;
> @@ -141,6 +143,8 @@ lower_indirect_derefs_block(nir_block *block,
> nir_builder *b,
>              has_indirect = true;
>
>           base = nir_deref_instr_parent(base);
> +         if (!base)
> +            break;
>

This isn't sufficient.  You need to make some case below continue if base
== NULL.


>        }
>
>        if (!has_indirect)
> diff --git a/src/compiler/nir/nir_lower_vars_to_ssa.c
> b/src/compiler/nir/nir_lower_vars_to_ssa.c
> index 3f37acaed33..dcef9b8e221 100644
> --- a/src/compiler/nir/nir_lower_vars_to_ssa.c
> +++ b/src/compiler/nir/nir_lower_vars_to_ssa.c
> @@ -142,6 +142,8 @@ static struct deref_node *
>  get_deref_node_recur(nir_deref_instr *deref,
>                       struct lower_variables_state *state)
>  {
> +   if (!deref)
> +      return NULL;
>     if (deref->deref_type == nir_deref_type_var)
>        return get_deref_node_for_var(deref->var, state);
>
> @@ -198,6 +200,8 @@ get_deref_node_recur(nir_deref_instr *deref,
>
>        return parent->wildcard;
>
> +   case nir_deref_type_cast:
> +      return NULL;
>

I think the better thing to do here would be to just look at the deref mode
and bail if it's not a nir_var_local.  I just sent an untested patch that
does just that.


>     default:
>        unreachable("Invalid deref type");
>     }
> --
> 2.17.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/20180708/626d0ef7/attachment.html>


More information about the mesa-dev mailing list