[Mesa-dev] [RFC] i965/fs: Generalize grf127 hack to dispatch_width > 8

Caio Marcelo de Oliveira Filho caio.oliveira at intel.com
Wed Jul 11 01:50:11 UTC 2018


Change the hack to always apply, adjusting the register number
according to the dispatch_width.

The original change assumed that given for dispatch_width > 8 we
already prevent the overlap of source and destination for send, it
would not be necessary to explicitly add an interference with a
register that covers r127.

The problem is that the code for spilling registers ends up generating
scratch reads, that in Gen7+ will reuse the destination register,
causing a send with both source and destination overlaping. So prevent
r127 (or the overlapping wider register) to be used as destination for
sends.

This patch fixes piglit test
tests/spec/arb_compute_shader/linker/bug-93840.shader_test.

Fixes: 232ed898021 "i965/fs: Register allocator shoudn't use grf127 for sends dest"
---

After more digging on the piglit failure, I came up with this
patch. I'm still seeing crashes with for some shader-db executions
(master have them too), but didn't have time today to drill into them.

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

diff --git a/src/intel/compiler/brw_fs_reg_allocate.cpp b/src/intel/compiler/brw_fs_reg_allocate.cpp
index 59e047483c0..417ddeba09c 100644
--- a/src/intel/compiler/brw_fs_reg_allocate.cpp
+++ b/src/intel/compiler/brw_fs_reg_allocate.cpp
@@ -549,7 +549,7 @@ fs_visitor::assign_regs(bool allow_spilling, bool spill_all)
    if (devinfo->gen >= 7)
       node_count += BRW_MAX_GRF - GEN7_MRF_HACK_START;
    int grf127_send_hack_node = node_count;
-   if (devinfo->gen >= 8 && dispatch_width == 8)
+   if (devinfo->gen >= 8 && dispatch_width >= 8)
       node_count ++;
    struct ra_graph *g =
       ra_alloc_interference_graph(compiler->fs_reg_sets[rsi].regs, node_count);
@@ -656,7 +656,7 @@ fs_visitor::assign_regs(bool allow_spilling, bool spill_all)
       }
    }
 
-   if (devinfo->gen >= 8 && dispatch_width == 8) {
+   if (devinfo->gen >= 8 && dispatch_width >= 8) {
       /* At Intel Broadwell PRM, vol 07, section "Instruction Set Reference",
        * subsection "EUISA Instructions", Send Message (page 990):
        *
@@ -665,12 +665,9 @@ fs_visitor::assign_regs(bool allow_spilling, bool spill_all)
        *
        * We are avoiding using grf127 as part of the destination of send
        * messages adding a node interference to the grf127_send_hack_node.
-       * This node has a fixed asignment to grf127.
-       *
-       * We don't apply it to SIMD16 because previous code avoids any register
-       * overlap between sources and destination.
+       * This node has a fixed assignment that overlaps with grf127.
        */
-      ra_set_node_reg(g, grf127_send_hack_node, 127);
+      ra_set_node_reg(g, grf127_send_hack_node, 128 - reg_width);
       foreach_block_and_inst(block, fs_inst, inst, cfg) {
          if (inst->is_send_from_grf() && inst->dst.file == VGRF) {
             ra_add_node_interference(g, inst->dst.nr, grf127_send_hack_node);
-- 
2.18.0



More information about the mesa-dev mailing list