[Mesa-dev] [PATCH] glsl: Fix incorrect optimization of instructions before discard statements.

Kenneth Graunke kenneth at whitecape.org
Wed Jun 8 14:44:52 PDT 2011


On 06/08/2011 11:27 AM, Eric Anholt wrote:
> The function was named "find_unconditional_discard", but didn't
> actually check that the discard statement found was unconditional.
> Fixes piglit glsl-fs-discard-04.
> ---
>   src/glsl/opt_discard_simplification.cpp |   20 +++++++++++++++++---
>   1 files changed, 17 insertions(+), 3 deletions(-)

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
Please also mark this as a candidate for 7.9 and 7.10.

Thanks, this was clearly broken.  It really needs basic blocks analysis.
Though, I wonder if this optimization is actually worth doing.  It's 
really a pedantic case...might just be burning compile time for nothing.

> diff --git a/src/glsl/opt_discard_simplification.cpp b/src/glsl/opt_discard_simplification.cpp
> index 7c2928d..a19947d 100644
> --- a/src/glsl/opt_discard_simplification.cpp
> +++ b/src/glsl/opt_discard_simplification.cpp
> @@ -104,9 +104,23 @@ static ir_discard *
>   find_unconditional_discard(exec_list&instructions)
>   {
>      foreach_list(n,&instructions) {
> -      ir_discard *ir = ((ir_instruction *) n)->as_discard();
> -      if (ir != NULL&&  ir->condition == NULL)
> -	 return ir;
> +      ir_instruction *ir = (ir_instruction *)n;
> +
> +      if (ir->ir_type == ir_type_return ||
> +	  ir->ir_type == ir_type_loop_jump)
> +	 return NULL;
> +
> +      /* So far, this code doesn't know how to look inside of flow
> +       * control to see if a discard later on at this level is
> +       * unconditional.
> +       */
> +      if (ir->ir_type == ir_type_if ||
> +	  ir->ir_type == ir_type_loop)
> +	 return NULL;
> +
> +      ir_discard *discard = ir->as_discard();
> +      if (discard != NULL&&  discard->condition == NULL)
> +	 return discard;
>      }
>      return NULL;
>   }


More information about the mesa-dev mailing list