summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2011-06-27 16:33:13 -0700
committerIan Romanick <ian.d.romanick@intel.com>2011-07-06 17:17:25 -0700
commitcb6dd6c399da30b9555a284bc51b1940686e6058 (patch)
tree1532b85df0e6cd1f08715d634a50b8d42a73f0f8 /src
parent85b965b462a27d537b7d9da6e26c43516a3e67fe (diff)
glsl: Track initial mask in constant propagation live set
The set of values initially available (before any kills) must be tracked with each constant in the set. Otherwise the wrong component can be selected after earlier components have been killed. NOTE: This is a candidate for the 7.10 and 7.11 branches. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=37383 Reviewed-by: Eric Anholt <eric@anholt.net> Cc: Kenneth Graunke <kenneth@whitecape.org> Cc: Matthias Bentrup <matthias.bentrup@googlemail.com> (cherry picked from commit 0eb97979584b73907327eebc547302e6b8d8976a)
Diffstat (limited to 'src')
-rw-r--r--src/glsl/opt_constant_propagation.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/glsl/opt_constant_propagation.cpp b/src/glsl/opt_constant_propagation.cpp
index e1f68892fbe..c1397683fbb 100644
--- a/src/glsl/opt_constant_propagation.cpp
+++ b/src/glsl/opt_constant_propagation.cpp
@@ -51,11 +51,23 @@ public:
this->var = var;
this->write_mask = write_mask;
this->constant = constant;
+ this->initial_values = write_mask;
+ }
+
+ acp_entry(const acp_entry *src)
+ {
+ this->var = src->var;
+ this->write_mask = src->write_mask;
+ this->constant = src->constant;
+ this->initial_values = src->initial_values;
}
ir_variable *var;
ir_constant *constant;
unsigned write_mask;
+
+ /** Mask of values initially available in the constant. */
+ unsigned initial_values;
};
@@ -172,7 +184,7 @@ ir_constant_propagation_visitor::handle_rvalue(ir_rvalue **rvalue)
for (int j = 0; j < 4; j++) {
if (j == channel)
break;
- if (found->write_mask & (1 << j))
+ if (found->initial_values & (1 << j))
rhs_channel++;
}
@@ -285,8 +297,7 @@ ir_constant_propagation_visitor::handle_if_block(exec_list *instructions)
/* Populate the initial acp with a constant of the original */
foreach_iter(exec_list_iterator, iter, *orig_acp) {
acp_entry *a = (acp_entry *)iter.get();
- this->acp->push_tail(new(this->mem_ctx) acp_entry(a->var, a->write_mask,
- a->constant));
+ this->acp->push_tail(new(this->mem_ctx) acp_entry(a));
}
visit_list_elements(this, instructions);