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 <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Eric Anholt 2013-05-03 13:17:56 -07:00
parent 008346273c
commit 739b88330c
1 changed files with 26 additions and 1 deletions

View File

@ -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;