diff options
author | Eric Anholt <[email protected]> | 2013-05-03 13:17:56 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2013-05-05 13:20:42 -0700 |
commit | 739b88330c26457834c5e7e1b2e16cc3655d3fac (patch) | |
tree | ca81d4c3f812bcbfd5ad11f5e0be91bafb14623c /src/glsl/opt_if_simplification.cpp | |
parent | 008346273c2cbc386f52efacac3d3228e566e8ac (diff) |
glsl: Flip around "if" statements with empty "then" blocks.
This cleans up some funny-looking code in some unigine shaders I was
looking at. Also slightly helps on planeshift and a few shaders in an
upcoming Valve release.
total instructions in shared programs: 1653715 -> 1653587 (-0.01%)
instructions in affected programs: 16550 -> 16422 (-0.77%)
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/glsl/opt_if_simplification.cpp')
-rw-r--r-- | src/glsl/opt_if_simplification.cpp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/glsl/opt_if_simplification.cpp b/src/glsl/opt_if_simplification.cpp index e1a23d94a98..db59b131dbc 100644 --- a/src/glsl/opt_if_simplification.cpp +++ b/src/glsl/opt_if_simplification.cpp @@ -25,7 +25,8 @@ * \file opt_if_simplification.cpp * * Moves constant branches of if statements out to the surrounding - * instruction stream. + * instruction stream, and inverts if conditionals to avoid empty + * "then" blocks. */ #include "ir.h" @@ -101,6 +102,30 @@ ir_if_simplification_visitor::visit_leave(ir_if *ir) } ir->remove(); this->made_progress = true; + return visit_continue; + } + + /* Turn: + * + * if (cond) { + * } else { + * do_work(); + * } + * + * into : + * + * if (!cond) + * do_work(); + * + * which avoids control flow for "else" (which is usually more + * expensive than normal operations), and the "not" can usually be + * folded into the generation of "cond" anyway. + */ + if (ir->then_instructions.is_empty()) { + ir->condition = new(ralloc_parent(ir->condition)) + ir_expression(ir_unop_logic_not, ir->condition); + ir->else_instructions.move_nodes_to(&ir->then_instructions); + this->made_progress = true; } return visit_continue; |