[Mesa-dev] [RFC] i965/fs: Generalize grf127 hack to dispatch_width >
Jason Ekstrand
jason at jlekstrand.net
Wed Jul 11 02:13:14 UTC 2018
On July 10, 2018 18:50:51 Caio Marcelo de Oliveira Filho
<caio.oliveira at intel.com> wrote:
> 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)
dispatch_width is always >= 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) {
Same here
> /* 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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list