glsl: Add an optimization pass to flatten simple nested if blocks.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 4 Apr 2013 06:56:57 +0000 (23:56 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 4 Apr 2013 22:38:19 +0000 (15:38 -0700)
commitedc52a8f280db8d9dc9a04314741319ea8b83e67
treeae9866c0c13ccfec896c5dd1ed433ad22956cced
parent967514ce680f7bf785ab544c6174786dd20425de
glsl: Add an optimization pass to flatten simple nested if blocks.

GLBenchmark 2.7's shaders contain conditional blocks like:

if (x) {
    if (y) {
        ...
    }
}

where the outer conditional's then clause contains exactly one statement
(the nested if) and there are no else clauses.  This can easily be
optimized into:

if (x && y) {
    ...
}

This saves a few instructions in GLBenchmark 2.7:

    total instructions in shared programs: 11833 -> 11649 (-1.55%)
    instructions in affected programs:     8234 -> 8050 (-2.23%)

It also helps CS:GO slightly (-0.05%/-0.22%).  More importantly,
however, it simplifies the control flow graph, which could enable other
optimizations.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/glsl/Makefile.sources
src/glsl/glsl_parser_extras.cpp
src/glsl/ir_optimization.h
src/glsl/opt_flatten_nested_if_blocks.cpp [new file with mode: 0644]