On Fri, May 3, 2013 at 3:05 PM, Eric Anholt <e...@anholt.net> wrote: > 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%) > --- > src/glsl/opt_if_simplification.cpp | 27 ++++++++++++++++++++++++++- > 1 file changed, 26 insertions(+), 1 deletion(-) > > diff --git a/src/glsl/opt_if_simplification.cpp > b/src/glsl/opt_if_simplification.cpp > index e1a23d9..db59b13 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; > --
Reviewed-by: Matt Turner <matts...@gmail.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev