From: Eric Anholt Date: Thu, 1 Sep 2011 23:40:07 +0000 (-0700) Subject: i965/vs: Clear tracked copy propagation values whose source gets overwritten. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6d0c018776977219e355c534eaafec53a30d993b;p=mesa.git i965/vs: Clear tracked copy propagation values whose source gets overwritten. This only occurs for GRFs, and hasn't mattered until now because we only copy propagated non-GRFs. --- diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp index 4b33df1f105..7862d78ab33 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp @@ -289,9 +289,6 @@ vec4_visitor::opt_copy_propagation() /* For any updated channels, clear tracking of them as a source * or destination. - * - * FINISHME: Sources aren't handled, which will need to be done - * for copy propagation. */ if (inst->dst.file == GRF) { if (inst->dst.reladdr) @@ -303,6 +300,18 @@ vec4_visitor::opt_copy_propagation() if (inst->dst.writemask & (1 << i)) cur_value[reg][i] = NULL; } + + for (int i = 0; i < virtual_grf_reg_count; i++) { + for (int j = 0; j < 4; j++) { + if (inst->dst.writemask & (1 << i) && + cur_value[i][j] && + cur_value[i][j]->file == GRF && + cur_value[i][j]->reg == inst->dst.reg && + cur_value[i][j]->reg == inst->dst.reg) { + cur_value[i][j] = NULL; + } + } + } } } }