[Mesa-dev] [PATCH] glsl: handle unconditional returns inside a loop

Nicolai Hähnle nhaehnle at gmail.com
Tue Jun 7 14:10:25 UTC 2016


On 07.06.2016 03:21, Lars Hamre wrote:
> Unrolls the loop with a count of 1 if it contains an unconditional
> return statement.
>
> Fixes the following piglit test:
> /spec/glsl-1.10/execution/fs-loop-return
>
> from crashing at this assert:
> tgsi/tgsi_exec.c:5952:tgsi_exec_machine_run: Assertion `mach->ContStackTop == 0' failed.
>
>
> Signed-off-by: Lars Hamre <chemecse at gmail.com>
>
> ---
>
> NOTE: Someone with access will need to commit this after the
>        review process
>
>   src/compiler/glsl/loop_unroll.cpp | 7 +++++++
>   1 file changed, 7 insertions(+)
>
> diff --git a/src/compiler/glsl/loop_unroll.cpp b/src/compiler/glsl/loop_unroll.cpp
> index bc377df..b1674e4 100644
> --- a/src/compiler/glsl/loop_unroll.cpp
> +++ b/src/compiler/glsl/loop_unroll.cpp
> @@ -337,6 +337,13 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
>            simple_unroll(ir, 1);
>         }
>
> +      /* If the last instruction of the loop is a return statement,
> +       * unroll the loop with a count of 1.
> +       */
> +      if (last_ir->ir_type == ir_type_return) {
> +         simple_unroll(ir, 1);
> +      }

I think you need to guard this against last_ir == NULL (empty loop body).

Also, why is this a proper fix for an assertion in tgsi_exec? That feels 
like just hiding the real problem.

Cheers,
Nicolai

> +
>         /* Don't try to unroll loops where the number of iterations is not known
>          * at compile-time.
>          */
> --
> 2.5.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list