|
|
@@ -47,6 +47,7 @@ struct assignment_entry { |
|
|
|
class ir_constant_variable_visitor : public ir_hierarchical_visitor { |
|
|
|
public: |
|
|
|
virtual ir_visitor_status visit_enter(ir_assignment *); |
|
|
|
virtual ir_visitor_status visit_enter(ir_call *); |
|
|
|
|
|
|
|
exec_list list; |
|
|
|
}; |
|
|
@@ -107,6 +108,28 @@ ir_constant_variable_visitor::visit_enter(ir_assignment *ir) |
|
|
|
return visit_continue; |
|
|
|
} |
|
|
|
|
|
|
|
ir_visitor_status |
|
|
|
ir_constant_variable_visitor::visit_enter(ir_call *ir) |
|
|
|
{ |
|
|
|
exec_list_iterator sig_iter = ir->get_callee()->parameters.iterator(); |
|
|
|
foreach_iter(exec_list_iterator, iter, *ir) { |
|
|
|
ir_rvalue *param_rval = (ir_rvalue *)iter.get(); |
|
|
|
ir_variable *param = (ir_variable *)sig_iter.get(); |
|
|
|
|
|
|
|
if (param->mode == ir_var_out || |
|
|
|
param->mode == ir_var_inout) { |
|
|
|
ir_variable *var = param_rval->variable_referenced(); |
|
|
|
struct assignment_entry *entry; |
|
|
|
|
|
|
|
assert(var); |
|
|
|
entry = get_assignment_entry(var, &this->list); |
|
|
|
entry->assignment_count++; |
|
|
|
} |
|
|
|
sig_iter.next(); |
|
|
|
} |
|
|
|
return visit_continue; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Does a copy propagation pass on the code present in the instruction stream. |
|
|
|
*/ |