summaryrefslogtreecommitdiffstats
path: root/src/glsl/opt_function_inlining.cpp
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2013-11-28 22:12:08 -0800
committerPaul Berry <[email protected]>2013-12-09 10:54:59 -0800
commite734c9f677ef3e9e2e4f207e4e794651ea6643b4 (patch)
tree9e9c1f04d86bb1994b36121829a989eedc4fbaac /src/glsl/opt_function_inlining.cpp
parentffc29120c402551fe9a7fa36e8ee5476bad27738 (diff)
glsl/loops: Simplify loop unrolling logic by breaking into functions.
The old logic of loop_unroll_visitor::visit_leave(ir_loop *) was: heuristics to skip unrolling in various circumstances; if (loop contains more than one jump) return; else if (loop contains one jump) { if (the jump is an unconditional "break" at the end of the loop) { remove the break and set iteration count to 1; fall through to simple loop unrolling code; } else { for (each "if" statement in the loop body) see if the jump is a "break" at the end of one of its forks; if (the "break" wasn't found) return; splice the remainder of the loop into the other fork of the "if"; remove the "break"; complex loop unrolling code; return; } } simple loop unrolling code; return; These tasks have been moved to their own functions: - splice the remainder of the loop into the other fork of the "if" - simple loop unrolling code - complex loop unrolling code And the logic has been flattened to: heuristics to skip unrolling in various circumstances; if (loop contains more than one jump) return; if (loop contains no jumps) { simple loop unroll; return; } if (the jump is an unconditional "break" at the end of the loop) { remove the break; simple loop unroll with iteration count of 1; return; } for (each "if" statement in the loop body) { if (the jump is a "break" at the end of one of its forks) { splice the remainder of the loop into the other fork of the "if"; remove the "break"; complex loop unroll; return; } } This will make it easier to modify the loop unrolling algorithm in a future patch. Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl/opt_function_inlining.cpp')
0 files changed, 0 insertions, 0 deletions