From 478ad9b1791be37ac10d62cca5925bc2152d45e2 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Wed, 2 Apr 2014 15:12:49 +0800 Subject: [PATCH] i965/vec4: fix record clearing in copy propagation Given mov vgrf7.0:F, vgrf9.xyxz:F add vgrf9.0.xyz:F, vgrf4.xyzw:F, vgrf5.xyzw:F add vgrf10.0.x:F, vgrf6.xyzw:F, vgrf7.wwww:F the last instruction would be wrongly changed to add vgrf10.0.x:F, vgrf6.xyzw:F, vgrf9.zzzz:F during copy propagation. The issue is that when deciding if a record should be cleared, the old code checked for inst->dst.writemask & (1 << ch) instead of inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch)) --- .../drivers/dri/i965/brw_vec4_copy_propagation.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) 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 c8feff8..1711005 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp @@ -58,6 +58,21 @@ is_dominated_by_previous_instruction(vec4_instruction *inst) } static bool +is_channel_updated(vec4_instruction *inst, src_reg *values[4], int ch) +{ + const src_reg *src = values[ch]; + + /* consider GRF only */ + assert(inst->dst.file == GRF); + if (!src || src->file != GRF) + return false; + + return (src->reg == inst->dst.reg && + src->reg_offset == inst->dst.reg_offset && + inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch))); +} + +static bool try_constant_propagation(vec4_instruction *inst, int arg, src_reg *values[4]) { /* For constant propagation, we only handle the same constant @@ -353,11 +368,7 @@ vec4_visitor::opt_copy_propagation() else { 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) { + if (is_channel_updated(inst, cur_value[i], j)){ cur_value[i][j] = NULL; } } -- 1.8.3.1