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:
@@ -25,7 +25,8 @@
|
|||||||
* \file opt_if_simplification.cpp
|
* \file opt_if_simplification.cpp
|
||||||
*
|
*
|
||||||
* Moves constant branches of if statements out to the surrounding
|
* 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"
|
#include "ir.h"
|
||||||
@@ -101,6 +102,30 @@ ir_if_simplification_visitor::visit_leave(ir_if *ir)
|
|||||||
}
|
}
|
||||||
ir->remove();
|
ir->remove();
|
||||||
this->made_progress = true;
|
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;
|
return visit_continue;
|
||||||
|
Reference in New Issue
Block a user