i965/fs: Fix compute-to-mrf VGRF region coverage condition.
authorFrancisco Jerez <currojerez@riseup.net>
Fri, 27 May 2016 23:41:35 +0000 (16:41 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Tue, 31 May 2016 22:57:40 +0000 (15:57 -0700)
Compute-to-mrf was checking whether the destination of scan_inst is
more than one component (making assumptions about the instruction data
type) in order to find out whether the result is being fully copied
into the MRF destination, which is rather inaccurate in cases where a
single-component instruction is only partially contained in the source
region, or when the execution size of the copy and scan_inst
instructions differ.  Instead check whether the destination region of
the instruction is really contained within the bounds of the source
region of the copy.

Cc: "12.0" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_fs.cpp

index 172182a3b6235777bdc29be727599f69ef875c32..b521f905e1c73739f374cd3443a9383de6c90d98 100644 (file)
@@ -2816,10 +2816,13 @@ fs_visitor::compute_to_mrf()
            if (scan_inst->is_partial_write())
               break;
 
-            /* Things returning more than one register would need us to
-             * understand coalescing out more than one MOV at a time.
+            /* Handling things not fully contained in the source of the copy
+             * would need us to understand coalescing out more than one MOV at
+             * a time.
              */
-            if (scan_inst->regs_written > scan_inst->exec_size / 8)
+            if (scan_inst->dst.reg_offset < inst->src[0].reg_offset ||
+                scan_inst->dst.reg_offset + scan_inst->regs_written >
+                inst->src[0].reg_offset + inst->regs_read(0))
                break;
 
            /* SEND instructions can't have MRF as a destination. */