mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 12:08:06 +02:00
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 (cherry picked from commitb42633db8e)
This commit is contained in:
parent
f1604f69c2
commit
1ec9166598
1 changed files with 18 additions and 0 deletions
|
|
@ -2239,6 +2239,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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue