intel/fs/gen8+: Fix r127 dst/src overlap RA workaround for EOT message payload.
authorFrancisco Jerez <currojerez@riseup.net>
Sat, 28 Dec 2019 00:08:04 +0000 (16:08 -0800)
committerFrancisco Jerez <currojerez@riseup.net>
Fri, 10 Jan 2020 19:00:42 +0000 (11:00 -0800)
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@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/compiler/brw_fs_reg_allocate.cpp

index 6a594a4f520e7afe3ba1c031adb6cc9590c264e3..bf3f86b0d56bbb84925496bc0363b7504af357be 100644 (file)
@@ -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);
    }