[Mesa-dev] [PATCH] glsl: Handle empty if statement encountered during loop analysis.

Kenneth Graunke kenneth at whitecape.org
Wed Jul 24 10:05:31 PDT 2013


On 07/24/2013 08:17 AM, Paul Berry wrote:
> The is_loop_terminator() function was asserting that the following
> kind of if statement could never occur:
>
>      if (...) { } else { }
>
> (presumably based on the assumption that such an if statement would be
> eliminated by previous optimization stages).  But that isn't the
> case--it's possible that previous optimization stages might simplify
> more complex code down to this empty if statement, in which case it
> won't be eliminated until the next time through the optimization loop.
>
> So is_loop_terminator() needs to handle it.  Fortunately it's easy to
> handle--it's not a loop terminator because it does nothing.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=64330
> CC: mesa-stable at lists.freedesktop.org
> ---
>   src/glsl/loop_analysis.cpp | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/loop_analysis.cpp b/src/glsl/loop_analysis.cpp
> index 191e92d..40897bb 100644
> --- a/src/glsl/loop_analysis.cpp
> +++ b/src/glsl/loop_analysis.cpp
> @@ -503,7 +503,8 @@ is_loop_terminator(ir_if *ir)
>
>      ir_instruction *const inst =
>         (ir_instruction *) ir->then_instructions.get_head();
> -   assert(inst != NULL);
> +   if (inst == NULL)
> +      return false;
>
>      if (inst->ir_type != ir_type_loop_jump)
>         return false;
>

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

This would have been a bit more obvious if 'diff' had included a few 
more lines of context.  Immediately above this hunk, there is:

    if (!ir->else_instructions.is_empty())
       return false;

which already guarantees the else block is empty, so it really is just 
the noop "if (...) {} {}" statement.

--Ken


More information about the mesa-dev mailing list