[Mesa-dev] [PATCH] r600/sb: insert the else clause when we might depart from a loop

Gert Wollny gw.fossdev at gmail.com
Tue Jan 30 07:22:17 UTC 2018


Great job, this fixes the piglit, shows no regressions there, and
doesn't add an else branch when it is optimized away. You might want to
add that this fixes shaders at ssa@fs-if-def-else-break and  
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101442

Since the other piglits that fail with sb and pass without it are
differnt issues I'll open separate bugs for these, so that this one can
savely be closes when the patch lands.

Tested-By: Gert Wollny <gw.fossdev at gmail.com>  

Best, 
Gert 

Am Dienstag, den 30.01.2018, 16:40 +1000 schrieb Dave Airlie:
> From: Dave Airlie <airlied at 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 <airlied at 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);


More information about the mesa-dev mailing list