nv50/ir: make sure cfg iterator always hits all blocks

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
This commit is contained in:
Ilia Mirkin 2016-08-19 00:41:59 -04:00
parent 7bdccd104b
commit 092f994a03
1 changed files with 4 additions and 4 deletions

View 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);
}
}