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

Roland Scheidegger sroland at vmware.com
Tue Jan 30 14:44:13 UTC 2018


Makes sense to me, albeit I don't really quite understand sb...
Reviewed-by: Roland Scheidegger <sroland at vmware.com>

Am 30.01.2018 um 07:40 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