[Mesa-dev] [PATCH 05/11] nir: Separate dead write removal into its own pass

Caio Marcelo de Oliveira Filho caio.oliveira at intel.com
Mon Oct 15 17:37:08 UTC 2018


Hi,

> > +{
> > +   bool progress = false;
> > +
> > +   /* Find writes that are unused and can be removed. */
> > +   util_dynarray_foreach_reverse(unused_writes, struct write_entry,
> > entry) {
> > +      nir_deref_compare_result comp = nir_compare_derefs(dst, entry->dst);
> > +      if (comp & nir_derefs_a_contains_b_bit) {
> >
> 
> Mind throwing an assert in here:
> 
> assert((comp & nir_derefs_equal_bit) || mask == ~(nir_component_mask_t)0);

We can assert that.  We can have an entry for a copy between arrays a
and b, and see a store a[1].x that will invalidate the 'x' component
of the copy.

(...)

> > +      case nir_intrinsic_copy_deref: {
> > +         nir_deref_instr *src = nir_src_as_deref(intrin->src[1]);
> > +         nir_deref_instr *dst = nir_src_as_deref(intrin->src[0]);
> > +
> > +         /* Self-copy is removed. */
> > +         if (nir_compare_derefs(src, dst) & nir_derefs_equal_bit) {
> > +            nir_instr_remove(instr);
> > +            progress = true;
> > +            break;
> > +         }
> > +
> > +         uintptr_t mask = ~(1 << NIR_MAX_VEC_COMPONENTS);
> >
> 
> I don't think this does quite what you want.  Perhaps
> 
> nir_component_mask_t mask = ~(nir_component_mask_t)0;

I'm going with

nir_component_mask_t mask = (1 << glsl_get_vector_elements(dst->type)) - 1;


The idea is that we only fill bits that are valid, so we can detect
the condition that no bits are set and remove the entry.  Sounds good?


> 
> All of the comments were fairly trivial and nit-picky.  Assuming you're ok
> with the changes,
> 
> Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>



Caio


More information about the mesa-dev mailing list