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:
parent
008346273c
commit
739b88330c
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue