<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 24, 2016 at 10:45 PM, Connor Abbott <span dir="ltr"><<a href="mailto:cwabbott0@gmail.com" target="_blank">cwabbott0@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Sat, Feb 13, 2016 at 9:14 PM, Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>> wrote:<br>
> ---<br>
>  src/compiler/nir/nir.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++<br>
>  src/compiler/nir/nir.h |  2 ++<br>
>  2 files changed, 65 insertions(+)<br>
><br>
> diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c<br>
> index cd78475..468065a 100644<br>
> --- a/src/compiler/nir/nir.c<br>
> +++ b/src/compiler/nir/nir.c<br>
> @@ -716,6 +716,69 @@ nir_cf_node_get_function(nir_cf_node *node)<br>
>     return nir_cf_node_as_function(node);<br>
>  }<br>
><br>
> +/* Reduces a cursor by trying to convert everything to after and trying to<br>
> + * go up to block granularity when possible.<br>
> + */<br>
> +static nir_cursor<br>
> +reduce_cursor(nir_cursor cursor)<br>
> +{<br>
> +   switch (cursor.option) {<br>
> +   case nir_cursor_before_block:<br>
> +      if (exec_list_is_empty(&cursor.block->instr_list)) {<br>
> +         /* Empty block.  After is as good as before. */<br>
> +         cursor.option = nir_cursor_after_block;<br>
> +      } else {<br>
> +         /* Try to switch to after the previous block if there is one.<br>
> +          * (This isn't likely, but it can happen.)<br>
> +          */<br>
> +         nir_cf_node *prev_node = nir_cf_node_prev(&cursor.block->cf_node);<br>
> +         if (prev_node && prev_node->type == nir_cf_node_block) {<br>
<br>
</div></div>How can the current node and the previous node both be blocks? It's an<br>
invariant of the control-flow modification code that no two blocks<br>
ever wind up next to each other.<br></blockquote><div><br></div><div>I can replace it with an assert if you'd like.<br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5"><br>
> +            cursor.block = nir_cf_node_as_block(prev_node);<br>
> +            cursor.option = nir_cursor_after_block;<br>
> +         }<br>
> +      }<br>
> +      return cursor;<br>
> +<br>
> +   case nir_cursor_after_block:<br>
> +      return cursor;<br>
> +<br>
> +   case nir_cursor_before_instr: {<br>
> +      nir_instr *prev_instr = nir_instr_prev(cursor.instr);<br>
> +      if (prev_instr) {<br>
> +         /* Before this instruction is after the previous */<br>
> +         cursor.instr = prev_instr;<br>
> +         cursor.option = nir_cursor_after_instr;<br>
> +      } else {<br>
> +         /* No previous instruction.  Switch to before block */<br>
> +         cursor.block = cursor.instr->block;<br>
> +         cursor.option = nir_cursor_before_block;<br>
> +      }<br>
> +      return reduce_cursor(cursor);<br>
> +   }<br>
> +<br>
> +   case nir_cursor_after_instr:<br>
> +      if (nir_instr_next(cursor.instr) == NULL) {<br>
> +         /* This is the last instruction, switch to after block */<br>
> +         cursor.option = nir_cursor_after_block;<br>
> +         cursor.block = cursor.instr->block;<br>
> +      }<br>
> +      return cursor;<br>
> +<br>
> +   default:<br>
> +      unreachable("Inavlid cursor option");<br>
> +   }<br>
> +}<br>
> +<br>
> +bool<br>
> +nir_cursors_equal(nir_cursor a, nir_cursor b)<br>
> +{<br>
> +   /* Reduced cursors should be unique */<br>
> +   a = reduce_cursor(a);<br>
> +   b = reduce_cursor(b);<br>
> +<br>
> +   return a.block == b.block && a.option == b.option;<br>
> +}<br>
> +<br>
>  static bool<br>
>  add_use_cb(nir_src *src, void *state)<br>
>  {<br>
> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h<br>
> index 4c6c22f..c856b83 100644<br>
> --- a/src/compiler/nir/nir.h<br>
> +++ b/src/compiler/nir/nir.h<br>
> @@ -1803,6 +1803,8 @@ typedef struct {<br>
>     };<br>
>  } nir_cursor;<br>
><br>
> +bool nir_cursors_equal(nir_cursor a, nir_cursor b);<br>
> +<br>
>  static inline nir_cursor<br>
>  nir_before_block(nir_block *block)<br>
>  {<br>
> --<br>
> 2.5.0.400.gff86faf<br>
><br>
</div></div>> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br></div></div>