Refactor whole-variable assigment checking into member function

This commit is contained in:
Ian Romanick
2010-05-26 11:32:52 -07:00
parent 36ea28646c
commit b067db2e25
3 changed files with 33 additions and 15 deletions
+26
View File
@@ -95,6 +95,21 @@ public:
return NULL;
}
/**
* If an r-value is a reference to a whole variable, get that variable
*
* \return
* Pointer to a variable that is completely dereferenced by the r-value. If
* the r-value is not a dereference or the dereference does not access the
* entire variable (i.e., it's just one array element, struct field), \c NULL
* is returned.
*/
virtual ir_variable *whole_variable_referenced()
{
return NULL;
}
protected:
ir_rvalue()
{
@@ -827,6 +842,17 @@ public:
return this->var;
}
virtual ir_variable *whole_variable_referenced()
{
/* ir_dereference_variable objects always dereference the entire
* variable. However, if this dereference is dereferenced by anything
* else, the complete deferefernce chain is not a whole-variable
* dereference. This method should only be called on the top most
* ir_rvalue in a dereference chain.
*/
return this->var;
}
virtual void accept(ir_visitor *v)
{
v->visit(this);
+6 -11
View File
@@ -267,18 +267,13 @@ add_copy(ir_assignment *ir, exec_list *acp)
return;
}
ir_dereference *lhs_deref = ir->lhs->as_dereference();
if (!lhs_deref || lhs_deref->mode != ir_dereference::ir_reference_variable)
return;
ir_variable *lhs_var = lhs_deref->variable_referenced();
ir_variable *lhs_var = ir->lhs->whole_variable_referenced();
ir_variable *rhs_var = ir->rhs->whole_variable_referenced();
ir_dereference *rhs_deref = ir->rhs->as_dereference();
if (!rhs_deref || rhs_deref->mode != ir_dereference::ir_reference_variable)
return;
ir_variable *rhs_var = rhs_deref->variable_referenced();
entry = new acp_entry(lhs_var, rhs_var);
acp->push_tail(entry);
if ((lhs_var != NULL) && (rhs_var != NULL)) {
entry = new acp_entry(lhs_var, rhs_var);
acp->push_tail(entry);
}
}
static void
+1 -4
View File
@@ -139,10 +139,7 @@ process_assignment(ir_assignment *ir, exec_list *assignments)
}
/* Now, check if we did a whole-variable assignment. */
ir_dereference *lhs_deref = ir->lhs->as_dereference();
if (always_assign &&
lhs_deref &&
lhs_deref->mode == ir_dereference::ir_reference_variable) {
if (always_assign && (ir->lhs->whole_variable_referenced() != NULL)) {
/* We did a whole-variable assignment. So, any instruction in
* the assignment list with the same LHS is dead.
*/