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>
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user