ir_visitor_status ir_constant_variable_visitor::visit(ir_variable *ir) { struct assignment_entry *entry = get_assignment_entry(ir, this->ht); entry->our_scope = true; return visit_continue; }
ir_visitor_status ir_constant_variable_visitor::visit_enter(ir_assignment *ir) { ir_constant *constval; struct assignment_entry *entry; entry = get_assignment_entry(ir->lhs->variable_referenced(), this->ht); assert(entry); entry->assignment_count++; /* If it's already constant, don't do the work. */ if (entry->var->constant_value) return visit_continue; /* OK, now find if we actually have all the right conditions for * this to be a constant value assigned to the var. */ if (ir->condition) return visit_continue; ir_variable *var = ir->whole_variable_written(); if (!var) return visit_continue; /* Ignore buffer variables, since the underlying storage is shared * and we can't be sure that this variable won't be written by another * thread. */ if (var->data.mode == ir_var_shader_storage || var->data.mode == ir_var_shader_shared) return visit_continue; constval = ir->rhs->constant_expression_value(); if (!constval) return visit_continue; /* Mark this entry as having a constant assignment (if the * assignment count doesn't go >1). do_constant_variable will fix * up the variable with the constant value later. */ entry->constval = constval; return visit_continue; }
ir_visitor_status ir_constant_variable_visitor::visit_enter(ir_assignment *ir) { ir_constant *constval; struct assignment_entry *entry; entry = get_assignment_entry(ir->lhs->variable_referenced(), &this->list); assert(entry); entry->assignment_count++; /* If it's already constant, don't do the work. */ if (entry->var->constant_value) return visit_continue; /* OK, now find if we actually have all the right conditions for * this to be a constant value assigned to the var. */ if (ir->condition) return visit_continue; ir_variable *var = ir->whole_variable_written(); if (!var) return visit_continue; constval = ir->rhs->constant_expression_value(); if (!constval) return visit_continue; /* Mark this entry as having a constant assignment (if the * assignment count doesn't go >1). do_constant_variable will fix * up the variable with the constant value later. */ entry->constval = constval; return visit_continue; }