glsl: always call do_lower_jumps() after loop unrolling
This fixes a bug in radeonsi where LLVM cannot handle the case where
a break exists but its not the last instruction in the block.
LLVM would fail with:
Terminator found in the middle of a basic block!
LLVM ERROR: Broken function found, compilation aborted!
Fixes: 96fe8834f5
"glsl_to_tgsi: do fewer optimizations with GLSLOptimizeConservatively"
Reviewed-by: Matt Turner <mattst88@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105317
This commit is contained in:
@@ -2242,6 +2242,24 @@ do_common_optimization(exec_list *ir, bool linked,
|
||||
loop_progress = false;
|
||||
loop_progress |= do_constant_propagation(ir);
|
||||
loop_progress |= do_if_simplification(ir);
|
||||
|
||||
/* Some drivers only call do_common_optimization() once rather
|
||||
* than in a loop. So we must call do_lower_jumps() after
|
||||
* unrolling a loop because for drivers that use LLVM validation
|
||||
* will fail if a jump is not the last instruction in the block.
|
||||
* For example the following will fail LLVM validation:
|
||||
*
|
||||
* (loop (
|
||||
* ...
|
||||
* break
|
||||
* (assign (x) (var_ref v124) (expression int + (var_ref v124)
|
||||
* (constant int (1)) ) )
|
||||
* ))
|
||||
*/
|
||||
loop_progress |= do_lower_jumps(ir, true, true,
|
||||
options->EmitNoMainReturn,
|
||||
options->EmitNoCont,
|
||||
options->EmitNoLoops);
|
||||
}
|
||||
progress |= loop_progress;
|
||||
}
|
||||
|
Reference in New Issue
Block a user