mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
glsl: Delete dead discard conditions in constant folding.
opt_constant_folding() already detects conditional assignments where the condition is constant, and either deletes the assignment or the condition. Make it handle discards in the same fashion. Spotted happening in the wild in Tropico 5 shaders. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Connor Abbott <cwabbott0@gmail.com> Reviewed-by: Matt Turner <mattst88@gmail.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
d77b186871
commit
23d42b46e3
1 changed files with 24 additions and 0 deletions
|
|
@ -50,6 +50,7 @@ public:
|
|||
/* empty */
|
||||
}
|
||||
|
||||
virtual ir_visitor_status visit_enter(ir_discard *ir);
|
||||
virtual ir_visitor_status visit_enter(ir_assignment *ir);
|
||||
virtual ir_visitor_status visit_enter(ir_call *ir);
|
||||
|
||||
|
|
@ -93,6 +94,29 @@ ir_constant_folding_visitor::handle_rvalue(ir_rvalue **rvalue)
|
|||
}
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_constant_folding_visitor::visit_enter(ir_discard *ir)
|
||||
{
|
||||
if (ir->condition) {
|
||||
ir->condition->accept(this);
|
||||
handle_rvalue(&ir->condition);
|
||||
|
||||
ir_constant *const_val = ir->condition->as_constant();
|
||||
/* If the condition is constant, either remove the condition or
|
||||
* remove the never-executed assignment.
|
||||
*/
|
||||
if (const_val) {
|
||||
if (const_val->value.b[0])
|
||||
ir->condition = NULL;
|
||||
else
|
||||
ir->remove();
|
||||
this->progress = true;
|
||||
}
|
||||
}
|
||||
|
||||
return visit_continue_with_parent;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_constant_folding_visitor::visit_enter(ir_assignment *ir)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue