From d041a43c0f3e01c9d6f81244cbf1c85d4f3a17d5 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Wed, 18 Mar 2015 19:46:54 +0200 Subject: [PATCH] i965/vec4: Fix handling of multiple register reads and writes during copy propagation. Reviewed-by: Matt Turner --- src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 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 a603dd65b98..e897be299ba 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp @@ -74,9 +74,8 @@ is_channel_updated(vec4_instruction *inst, src_reg *values[4], int ch) 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))); + return (src->in_range(inst->dst, inst->regs_written) && + inst->dst.writemask & (1 << BRW_GET_SWZ(src->swizzle, ch))); } static unsigned @@ -397,6 +396,10 @@ vec4_visitor::opt_copy_propagation(bool do_constant_prop) inst->src[i].reladdr) continue; + /* We only handle single-register copies. */ + if (inst->regs_read(i) != 1) + continue; + int reg = (alloc.offsets[inst->src[i].reg] + inst->src[i].reg_offset); -- 2.30.2