[Mesa-dev] [PATCH 15/21] nir: Add a function for comparing cursors

Jason Ekstrand jason at jlekstrand.net
Tue Mar 8 18:34:32 UTC 2016


On Wed, Feb 24, 2016 at 10:45 PM, Connor Abbott <cwabbott0 at gmail.com> wrote:

> On Sat, Feb 13, 2016 at 9:14 PM, Jason Ekstrand <jason at jlekstrand.net>
> wrote:
> > ---
> >  src/compiler/nir/nir.c | 63
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> >  src/compiler/nir/nir.h |  2 ++
> >  2 files changed, 65 insertions(+)
> >
> > diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
> > index cd78475..468065a 100644
> > --- a/src/compiler/nir/nir.c
> > +++ b/src/compiler/nir/nir.c
> > @@ -716,6 +716,69 @@ nir_cf_node_get_function(nir_cf_node *node)
> >     return nir_cf_node_as_function(node);
> >  }
> >
> > +/* Reduces a cursor by trying to convert everything to after and trying
> to
> > + * go up to block granularity when possible.
> > + */
> > +static nir_cursor
> > +reduce_cursor(nir_cursor cursor)
> > +{
> > +   switch (cursor.option) {
> > +   case nir_cursor_before_block:
> > +      if (exec_list_is_empty(&cursor.block->instr_list)) {
> > +         /* Empty block.  After is as good as before. */
> > +         cursor.option = nir_cursor_after_block;
> > +      } else {
> > +         /* Try to switch to after the previous block if there is one.
> > +          * (This isn't likely, but it can happen.)
> > +          */
> > +         nir_cf_node *prev_node =
> nir_cf_node_prev(&cursor.block->cf_node);
> > +         if (prev_node && prev_node->type == nir_cf_node_block) {
>
> How can the current node and the previous node both be blocks? It's an
> invariant of the control-flow modification code that no two blocks
> ever wind up next to each other.
>

I can replace it with an assert if you'd like.
--Jason


>
> > +            cursor.block = nir_cf_node_as_block(prev_node);
> > +            cursor.option = nir_cursor_after_block;
> > +         }
> > +      }
> > +      return cursor;
> > +
> > +   case nir_cursor_after_block:
> > +      return cursor;
> > +
> > +   case nir_cursor_before_instr: {
> > +      nir_instr *prev_instr = nir_instr_prev(cursor.instr);
> > +      if (prev_instr) {
> > +         /* Before this instruction is after the previous */
> > +         cursor.instr = prev_instr;
> > +         cursor.option = nir_cursor_after_instr;
> > +      } else {
> > +         /* No previous instruction.  Switch to before block */
> > +         cursor.block = cursor.instr->block;
> > +         cursor.option = nir_cursor_before_block;
> > +      }
> > +      return reduce_cursor(cursor);
> > +   }
> > +
> > +   case nir_cursor_after_instr:
> > +      if (nir_instr_next(cursor.instr) == NULL) {
> > +         /* This is the last instruction, switch to after block */
> > +         cursor.option = nir_cursor_after_block;
> > +         cursor.block = cursor.instr->block;
> > +      }
> > +      return cursor;
> > +
> > +   default:
> > +      unreachable("Inavlid cursor option");
> > +   }
> > +}
> > +
> > +bool
> > +nir_cursors_equal(nir_cursor a, nir_cursor b)
> > +{
> > +   /* Reduced cursors should be unique */
> > +   a = reduce_cursor(a);
> > +   b = reduce_cursor(b);
> > +
> > +   return a.block == b.block && a.option == b.option;
> > +}
> > +
> >  static bool
> >  add_use_cb(nir_src *src, void *state)
> >  {
> > diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
> > index 4c6c22f..c856b83 100644
> > --- a/src/compiler/nir/nir.h
> > +++ b/src/compiler/nir/nir.h
> > @@ -1803,6 +1803,8 @@ typedef struct {
> >     };
> >  } nir_cursor;
> >
> > +bool nir_cursors_equal(nir_cursor a, nir_cursor b);
> > +
> >  static inline nir_cursor
> >  nir_before_block(nir_block *block)
> >  {
> > --
> > 2.5.0.400.gff86faf
> >
> > _______________________________________________
> > 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/20160308/0b02d44c/attachment.html>


More information about the mesa-dev mailing list