Mesa (master): intel/fs/gen8+: Fix r127 dst/src overlap RA workaround for EOT message payload.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 10 19:43:11 UTC 2020


Module: Mesa
Branch: master
Commit: 0703eab0120f20451e75ba8d4ce065350ad36fef
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0703eab0120f20451e75ba8d4ce065350ad36fef

Author: Francisco Jerez <currojerez at riseup.net>
Date:   Fri Dec 27 16:08:04 2019 -0800

intel/fs/gen8+: Fix r127 dst/src overlap RA workaround for EOT message payload.

The problem occured when the return payload of a SIMD8 SEND
instruction was re-used as source payload of an EOT SEND message.  In
such cases the interference edge added by that workaround between the
payload and grf127_send_hack_node would have no effect, because the
payload would be allocated to a fixed range of registers containing
r127 by the special handling of EOT message payloads in the same
function.  This would cause things to blow up if the source payload of
the first SIMD8 message ended up being allocated to a range which
happened to overlap the destination.

Fix it by avoiding r127 altogether in the allocation of EOT message
payloads.

The problem can be reproduced on ICL with the fp-indirections2 Piglit
test-case in combination with the other optimizer changes of this
series.

Fixes: 232ed8980217 "i965/fs: Register allocator shoudn't use grf127 for sends dest"
Cc: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/intel/compiler/brw_fs_reg_allocate.cpp | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/intel/compiler/brw_fs_reg_allocate.cpp b/src/intel/compiler/brw_fs_reg_allocate.cpp
index 6a594a4f520..bf3f86b0d56 100644
--- a/src/intel/compiler/brw_fs_reg_allocate.cpp
+++ b/src/intel/compiler/brw_fs_reg_allocate.cpp
@@ -683,12 +683,18 @@ fs_reg_alloc::setup_inst_interference(fs_inst *inst)
       int size = fs->alloc.sizes[vgrf];
       int reg = compiler->fs_reg_sets[rsi].class_to_ra_reg_range[size] - 1;
 
-      /* If something happened to spill, we want to push the EOT send
-       * register early enough in the register file that we don't
-       * conflict with any used MRF hack registers.
-       */
-      if (first_mrf_hack_node >= 0)
+      if (first_mrf_hack_node >= 0) {
+         /* If something happened to spill, we want to push the EOT send
+          * register early enough in the register file that we don't
+          * conflict with any used MRF hack registers.
+          */
          reg -= BRW_MAX_MRF(devinfo->gen) - spill_base_mrf(fs);
+      } else if (grf127_send_hack_node >= 0) {
+         /* Avoid r127 which might be unusable if the node was previously
+          * written by a SIMD8 SEND message with source/destination overlap.
+          */
+         reg--;
+      }
 
       ra_set_node_reg(g, first_vgrf_node + vgrf, reg);
    }




More information about the mesa-commit mailing list