[Mesa-dev] [PATCH 07/11] glsl: Lower unconditional return statements.

Kenneth Graunke kenneth at whitecape.org
Thu Jul 7 01:13:54 PDT 2011


On 07/05/2011 03:07 PM, Paul Berry wrote:
> Previously, lower_jumps.cpp only lowered return statements that
> appeared inside of an if statement.
>
> Without this patch, lower_jumps.cpp might not lower certain return
> statements, causing some back-ends to fail (as in bug #36669).
>
> Fixes unit test test_lower_returns_1.
> ---
>   src/glsl/lower_jumps.cpp |   15 +++++++++++++++
>   1 files changed, 15 insertions(+), 0 deletions(-)
>
> diff --git a/src/glsl/lower_jumps.cpp b/src/glsl/lower_jumps.cpp
> index fa247c6..73b5d57 100644
> --- a/src/glsl/lower_jumps.cpp
> +++ b/src/glsl/lower_jumps.cpp
> @@ -851,6 +851,21 @@ lower_continue:
>          */
>         visit_block(&ir->body);
>
> +      /* If the body ended in an unconditional return of non-void,
> +       * then we don't need to lower it because an unconditional
> +       * return of non-void at the end of a function is what returns
> +       * get lowered to.

This comment doesn't make sense to me.  Are you trying to say that 
unconditional all non-void returns were already lowered to variable 
assignments and void returns?  Or...?

> +       *
> +       * If the body ended in a return of void, eliminate it because
> +       * it is redundant.
> +       */
> +      if (ir->return_type->is_void()&&
> +          get_jump_strength((ir_instruction *) ir->body.get_tail())) {
> +         ir_jump *jump = (ir_jump *) ir->body.get_tail();
> +         assert (jump->ir_type == ir_type_return);
> +         jump->remove();
> +      }
> +
>         if(this->function.return_value)
>            ir->body.push_tail(new(ir) ir_return(new (ir) ir_dereference_variable(this->function.return_value)));


More information about the mesa-dev mailing list