nv50/ir: make sure cfg iterator always hits all blocks
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 19 Aug 2016 04:41:59 +0000 (00:41 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 23 Aug 2016 22:30:12 +0000 (18:30 -0400)
In some very specially-crafted cases, we could attempt to visit a node
that has already been visited, and then run out of bb's to visit, while
there were still cross blocks on the list. Make sure that those get
moved over in that case.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96274
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Cc: mesa-stable@lists.freedesktop.org
src/gallium/drivers/nouveau/codegen/nv50_ir_graph.cpp

index 23414d54ab1cd2f3d917d0182aef30bf3ba5c5f2..b1076cf4129a2a48479d3c18ef43e4a88c9ed2ca 100644 (file)
@@ -287,7 +287,10 @@ private:
 
       bb.push(node);
 
-      while (bb.getSize()) {
+      while (bb.getSize() || cross.getSize()) {
+         if (bb.getSize() == 0)
+            cross.moveTo(bb);
+
          node = reinterpret_cast<Graph::Node *>(bb.pop().u.p);
          assert(node);
          if (!node->visit(sequence))
@@ -314,9 +317,6 @@ private:
             }
          }
          nodes[count++] = node;
-
-         if (bb.getSize() == 0)
-            cross.moveTo(bb);
       }
    }