summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimothy Arceri <tarceri@itsqueeze.com>2018-03-26 10:31:26 +1100
committerJuan A. Suarez Romero <jasuarez@igalia.com>2018-03-28 16:51:21 +0200
commit880b548417376c42b38f7d8fff6990ec73c517e8 (patch)
treeed59c1fb86dae4a7f7877a765637c83c38b1601b
parent4ccaf9b8fe5609315f9edfc840e2d6d8330cb68e (diff)
glsl: fix infinite loop caused by bug in loop unrolling pass
Just checking for 2 jumps is not enough to be sure we can do a complex loop unroll. We need to make sure we also have also found 2 loop terminators. Without this we were attempting to unroll a loop where the second jump was nested inside multiple ifs which loop analysis is unable to detect as a terminator. We ended up splicing out the first terminator but failed to actually unroll the loop, this resulted in the creation of a possible infinite loop. Fixes: 646621c66da9 "glsl: make loop unrolling more like the nir unrolling path" Tested-by: Gert Wollny <gw.fossdev@gmail.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105670 (cherry picked from commit 56b867395dee1a48594b27987d3bf68a4e745dda)
-rw-r--r--src/compiler/glsl/loop_unroll.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/compiler/glsl/loop_unroll.cpp b/src/compiler/glsl/loop_unroll.cpp
index 6e06a30fb91..f6efe6475a0 100644
--- a/src/compiler/glsl/loop_unroll.cpp
+++ b/src/compiler/glsl/loop_unroll.cpp
@@ -519,7 +519,7 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
* isn't any additional unknown terminators, or any other jumps nested
* inside futher ifs.
*/
- if (ls->num_loop_jumps != 2)
+ if (ls->num_loop_jumps != 2 || ls->terminators.length() != 2)
return visit_continue;
ir_instruction *first_ir =