summaryrefslogtreecommitdiffstats
path: root/src/glsl/opt_constant_folding.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2015-02-24 01:00:22 -0800
committerKenneth Graunke <[email protected]>2015-02-24 15:24:52 -0800
commit23d42b46e306d4104e534842f6dec3500d331cae (patch)
tree8d69a06dd7973bdf68cd63eff26565c34243b758 /src/glsl/opt_constant_folding.cpp
parentd77b186871389be10a68546da0e3ada8134ae539 (diff)
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 <[email protected]> Reviewed-by: Ian Romanick <[email protected]> Reviewed-by: Connor Abbott <[email protected]> Reviewed-by: Matt Turner <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/glsl/opt_constant_folding.cpp')
-rw-r--r--src/glsl/opt_constant_folding.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/glsl/opt_constant_folding.cpp b/src/glsl/opt_constant_folding.cpp
index 74b855e5e94..4aae3f0ddf2 100644
--- a/src/glsl/opt_constant_folding.cpp
+++ b/src/glsl/opt_constant_folding.cpp
@@ -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);
@@ -94,6 +95,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)
{
ir->rhs->accept(this);