Having the direct copy case short-circuit the loop doesn't make sense. In both cases, we need to update the destination's current value, as well as the current value of any register that pointed to our destination. The only difference is whether or not we know our destination's current value.
By removing the "continue", we can remove the duplicated block introduced in the previous commit and share code. Cc: Eric Anholt <e...@anholt.net> Cc: Matt Turner <matts...@gmail.com> Cc: Christopher James Halse Rogers <chalserog...@gmail.com> Signed-off-by: Kenneth Graunke <kenn...@whitecape.org> --- .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 40 +++++-------------- 1 files changed, 11 insertions(+), 29 deletions(-) Sorry this is hard to follow... 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 3e24903..08d8f5b 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp @@ -297,44 +297,26 @@ vec4_visitor::opt_copy_propagation() } /* Track available source registers. */ - if (is_direct_copy(inst)) { - int reg = virtual_grf_reg_map[inst->dst.reg] + inst->dst.reg_offset; - for (int i = 0; i < 4; i++) { - if (inst->dst.writemask & (1 << i)) { - cur_value[reg][i] = &inst->src[0]; - } - } + const int reg = virtual_grf_reg_map[inst->dst.reg] + inst->dst.reg_offset; - /* For any updated channels, clear tracking of them as a source. */ - for (int i = 0; i < virtual_grf_reg_count; i++) { - for (int j = 0; j < 4; j++) { - if (inst->dst.writemask & (1 << j) && - cur_value[i][j] && - cur_value[i][j]->file == GRF && - cur_value[i][j]->reg == inst->dst.reg && - cur_value[i][j]->reg_offset == inst->dst.reg_offset) { - cur_value[i][j] = NULL; - } - } + /* Update our destination's current channel values. For a direct copy, + * the value is the newly propagated source. Otherwise, we don't know + * the new value, so clear it. + */ + bool direct_copy = is_direct_copy(inst); + for (int i = 0; i < 4; i++) { + if (inst->dst.writemask & (1 << i)) { + cur_value[reg][i] = direct_copy ? &inst->src[0] : NULL; } - - continue; } - /* For any updated channels, clear tracking of them as a source - * or destination. + /* Clear the records for any registers whose current value came from + * our destination's updated channels, as the two are no longer equal. */ if (inst->dst.file == GRF) { if (inst->dst.reladdr) memset(cur_value, 0, sizeof(cur_value)); else { - int reg = virtual_grf_reg_map[inst->dst.reg] + inst->dst.reg_offset; - - for (int i = 0; i < 4; i++) { - 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 << j) && -- 1.7.7.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev