summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/nouveau
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2016-08-19 00:41:59 -0400
committerIlia Mirkin <[email protected]>2016-08-23 18:30:12 -0400
commit092f994a034b718f6170c631655ccaba8d2aa768 (patch)
tree6ed4ee2a4ea9d4301419ec5055c899b4cea885a3 /src/gallium/drivers/nouveau
parent7bdccd104bf49861adfd891ea35884f2197e1c44 (diff)
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 <[email protected]> Reviewed-by: Samuel Pitoiset <[email protected]> Cc: [email protected]
Diffstat (limited to 'src/gallium/drivers/nouveau')
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_graph.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_graph.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_graph.cpp
index 23414d54ab1..b1076cf4129 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_graph.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_graph.cpp
@@ -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);
}
}