glsl: Move 'foo = foo;' optimization to opt_dead_code_local
The optimization as done in opt_copy_propagation would have to be removed in the next patch. If we just eliminate that optimization altogether, shader-db results, even on platforms that use NIR, are hurt quite substantially. I have not investigated why NIR isn't picking up the slack here. Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Cc: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -348,18 +348,13 @@ ir_copy_propagation_visitor::add_copy(ir_assignment *ir)
|
|||||||
ir_variable *lhs_var = ir->whole_variable_written();
|
ir_variable *lhs_var = ir->whole_variable_written();
|
||||||
ir_variable *rhs_var = ir->rhs->whole_variable_referenced();
|
ir_variable *rhs_var = ir->rhs->whole_variable_referenced();
|
||||||
|
|
||||||
if ((lhs_var != NULL) && (rhs_var != NULL)) {
|
/* Don't try to remove a dumb assignment of a variable to itself. Removing
|
||||||
if (lhs_var == rhs_var) {
|
* it now would mess up the loop iteration calling us.
|
||||||
/* This is a dumb assignment, but we've conveniently noticed
|
*/
|
||||||
* it here. Removing it now would mess up the loop iteration
|
if (lhs_var != NULL && rhs_var != NULL && lhs_var != rhs_var) {
|
||||||
* calling us. Just flag it to not execute, and someone else
|
if (lhs_var->data.mode != ir_var_shader_storage &&
|
||||||
* will clean up the mess.
|
lhs_var->data.mode != ir_var_shader_shared &&
|
||||||
*/
|
lhs_var->data.precise == rhs_var->data.precise) {
|
||||||
ir->condition = new(ralloc_parent(ir)) ir_constant(false);
|
|
||||||
this->progress = true;
|
|
||||||
} else if (lhs_var->data.mode != ir_var_shader_storage &&
|
|
||||||
lhs_var->data.mode != ir_var_shader_shared &&
|
|
||||||
lhs_var->data.precise == rhs_var->data.precise) {
|
|
||||||
assert(lhs_var);
|
assert(lhs_var);
|
||||||
assert(rhs_var);
|
assert(rhs_var);
|
||||||
_mesa_hash_table_insert(acp, lhs_var, rhs_var);
|
_mesa_hash_table_insert(acp, lhs_var, rhs_var);
|
||||||
|
@@ -173,6 +173,17 @@ process_assignment(void *lin_ctx, ir_assignment *ir, exec_list *assignments)
|
|||||||
bool progress = false;
|
bool progress = false;
|
||||||
kill_for_derefs_visitor v(assignments);
|
kill_for_derefs_visitor v(assignments);
|
||||||
|
|
||||||
|
if (ir->condition == NULL) {
|
||||||
|
/* If this is an assignment of the form "foo = foo;", remove the whole
|
||||||
|
* instruction and be done with it.
|
||||||
|
*/
|
||||||
|
const ir_variable *const lhs_var = ir->whole_variable_written();
|
||||||
|
if (lhs_var != NULL && lhs_var == ir->rhs->whole_variable_referenced()) {
|
||||||
|
ir->remove();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Kill assignment entries for things used to produce this assignment. */
|
/* Kill assignment entries for things used to produce this assignment. */
|
||||||
ir->rhs->accept(&v);
|
ir->rhs->accept(&v);
|
||||||
if (ir->condition) {
|
if (ir->condition) {
|
||||||
|
Reference in New Issue
Block a user