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

Lars Hamre chemecse at gmail.com
Tue Jun 7 01:21:32 UTC 2016


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);
+      }
+
       /* Don't try to unroll loops where the number of iterations is not known
        * at compile-time.
        */
--
2.5.5



More information about the mesa-dev mailing list