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: 646621c66d
"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
This commit is contained in:
@@ -519,7 +519,7 @@ loop_unroll_visitor::visit_leave(ir_loop *ir)
|
|||||||
* isn't any additional unknown terminators, or any other jumps nested
|
* isn't any additional unknown terminators, or any other jumps nested
|
||||||
* inside futher ifs.
|
* inside futher ifs.
|
||||||
*/
|
*/
|
||||||
if (ls->num_loop_jumps != 2)
|
if (ls->num_loop_jumps != 2 || ls->terminators.length() != 2)
|
||||||
return visit_continue;
|
return visit_continue;
|
||||||
|
|
||||||
ir_instruction *first_ir =
|
ir_instruction *first_ir =
|
||||||
|
Reference in New Issue
Block a user