[Mesa-dev] [PATCH 05/11] i965/vec4: Fix handling of multiple register reads and writes during copy propagation.

Francisco Jerez currojerez at riseup.net
Fri Mar 20 07:50:40 PDT 2015


---
 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 c4120b4..97dfe2a 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
@@ -398,6 +397,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.1.3



More information about the mesa-dev mailing list