From: Dave Airlie Date: Tue, 30 Jan 2018 06:38:51 +0000 (+1000) Subject: r600/sb: insert the else clause when we might depart from a loop X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8d633f067b8a3d74e3f39faea0773a229d4b93b3;p=mesa.git 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 Cc: Reviewed-by: Roland Scheidegger Signed-off-by: Dave Airlie --- 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(repdep1); + if (dep1->target != r && dep1->target->is_loop()) + has_else = true; + } + + if (repdep1->is_repeat()) { + repeat_node *rep1 = static_cast(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);