<p dir="ltr">Before you push this, of like to register my official skepticism as to whether or not this is the right fix. Given that the end block is special, anyone who depends on iterating over it should know that and handle it specially anyway.  I'm pretty sure that block numbering is the only thing that actually uses it and fixing that is a 1-line change.</p>
<p dir="ltr">Not a NAK just a thought.</p>
<div class="gmail_quote">On May 5, 2016 11:41 AM, "Rob Clark" <<a href="mailto:robdclark@gmail.com">robdclark@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Rob Clark <<a href="mailto:robclark@freedesktop.org">robclark@freedesktop.org</a>><br>
<br>
With the switch to new block iterator macro, we silently stopped<br>
iterating over the end-block.  Which caused nir_index_blocks() to not<br>
index the end-block.  Resulting in funny looking nir_print's like:<br>
<br>
impl main {<br>
        block block_0:<br>
        /* preds: */<br>
        intrinsic copy_var () (gl_FragColor@out-temp, gl_Color) ()<br>
        intrinsic copy_var () (gl_FragColor, gl_FragColor@out-temp) ()<br>
        /* succs: block_0 */<br>
        block block_0:<br>
}<br>
<br>
I don't *think* there are any more serious consequences of not iterating<br>
the end_block, but it's probably also a good idea to not subtly change<br>
behavior compared to the old fxn-callback based iterator.<br>
<br>
Signed-off-by: Rob Clark <<a href="mailto:robclark@freedesktop.org">robclark@freedesktop.org</a>><br>
---<br>
 src/compiler/nir/nir.c | 19 ++++++++++++++-----<br>
 1 file changed, 14 insertions(+), 5 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c<br>
index 867a43c..1f51b31 100644<br>
--- a/src/compiler/nir/nir.c<br>
+++ b/src/compiler/nir/nir.c<br>
@@ -1512,12 +1512,18 @@ nir_block_cf_tree_next(nir_block *block)<br>
       return NULL;<br>
    }<br>
<br>
-   nir_cf_node *cf_next = nir_cf_node_next(&block->cf_node);<br>
+   nir_cf_node *parent = block->cf_node.parent;<br>
+   nir_cf_node *cf_next;<br>
+<br>
+   if ((parent->type == nir_cf_node_function) &&<br>
+       (block == nir_cf_node_as_function(parent)->end_block))<br>
+      cf_next = NULL;<br>
+   else<br>
+      cf_next = nir_cf_node_next(&block->cf_node);<br>
+<br>
    if (cf_next)<br>
       return nir_cf_node_cf_tree_first(cf_next);<br>
<br>
-   nir_cf_node *parent = block->cf_node.parent;<br>
-<br>
    switch (parent->type) {<br>
    case nir_cf_node_if: {<br>
       /* Are we at the end of the if? Go to the beginning of the else */<br>
@@ -1532,9 +1538,12 @@ nir_block_cf_tree_next(nir_block *block)<br>
    case nir_cf_node_loop:<br>
       return nir_cf_node_as_block(nir_cf_node_next(parent));<br>
<br>
-   case nir_cf_node_function:<br>
+   case nir_cf_node_function: {<br>
+      nir_function_impl *func = nir_cf_node_as_function(parent);<br>
+      if (func->end_block != block)<br>
+         return func->end_block;<br>
       return NULL;<br>
-<br>
+   }<br>
    default:<br>
       unreachable("unknown cf node type");<br>
    }<br>
--<br>
2.5.5<br>
<br>
</blockquote></div>