Makes sense to me, albeit I don't really quite understand sb... Reviewed-by: Roland Scheidegger <srol...@vmware.com>
Am 30.01.2018 um 07:40 schrieb Dave Airlie: > From: Dave Airlie <airl...@redhat.com> > > 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. > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/gallium/drivers/r600/sb/sb_bc_finalize.cpp | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp > b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp > index 099b295..d3fab80 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); > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev