mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 10:18:05 +02:00
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 <gw.fossdev@gmail.com> Cc: <mesa-stable@lists.freedesktop.org> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
1a9aa69ae8
commit
8d633f067b
1 changed files with 17 additions and 0 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue