aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2018-01-30 16:38:51 +1000
committerDave Airlie <[email protected]>2018-01-31 04:47:29 +1000
commit8d633f067b8a3d74e3f39faea0773a229d4b93b3 (patch)
treef0286c53c95fac21048dd05ec22f133af6206b7c /src/gallium/drivers
parent1a9aa69ae85d7eb1baae1f2ee6af84d6fbd22de7 (diff)
r600/sb: insert the else clause when we might depart from a loop
If there is a break inside the else clause and this means we are breaking from a loop, the loop finalise will want to insert the LOOP_BREAK/CONTINUE instruction, however if we don't emit the else there is no where for these to end up, so they will end up in the wrong place. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101442 Tested-By: Gert Wollny <[email protected]> Cc: <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/r600/sb/sb_bc_finalize.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
index 099b295f18f..d3fab800204 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
@@ -208,8 +208,25 @@ void bc_finalizer::finalize_if(region_node* r) {
r->push_front(if_jump);
r->push_back(if_pop);
+ /* the depart/repeat 1 is actually part of the "else" code.
+ * if it's a depart for an outer loop region it will want to
+ * insert a LOOP_BREAK or LOOP_CONTINUE in here, so we need
+ * to emit the else clause.
+ */
bool has_else = n_if->next;
+ if (repdep1->is_depart()) {
+ depart_node *dep1 = static_cast<depart_node*>(repdep1);
+ if (dep1->target != r && dep1->target->is_loop())
+ has_else = true;
+ }
+
+ if (repdep1->is_repeat()) {
+ repeat_node *rep1 = static_cast<repeat_node*>(repdep1);
+ if (rep1->target != r && rep1->target->is_loop())
+ has_else = true;
+ }
+
if (has_else) {
cf_node *nelse = sh.create_cf(CF_OP_ELSE);
n_if->insert_after(nelse);