v3d/compiler: don't rewrite unused temporaries to point to NOP register
authorIago Toral Quiroga <itoral@igalia.com>
Thu, 25 Jun 2020 09:54:04 +0000 (11:54 +0200)
committerIago Toral <itoral@igalia.com>
Fri, 26 Jun 2020 08:57:32 +0000 (08:57 +0000)
This was assuming that unused temporaries are written but never read,
since the NOP register can only be used as a destination register,
but we can end up here also for temporaries that are read once but
never written.

This was found with a graphicsfuzz test that has a switch with
cases that have unreachable discards. In that test, NIR genrates
code like this:

decl_reg vec3 32 r19
...
r20 = mov r19.z
r21 = mov r19.y
r22 = mov r19.x

Where r19.xyz would generate 3 temporary registers that are read but
never written, so we would rewrite them to point to the NOP register
as QPU instruction sources, which is not allowed and would hit an
assert that expect magic reads to be from [r0,r5] only.

Fixes:
dEQP-VK.graphicsfuzz.unreachable-switch-case-with-discards

Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5645>

src/broadcom/compiler/vir_register_allocate.c

index d88a8df1141d6f7622c8a421f068eac981750f9b..eac027f9e67aaf0de4a3753d2b9a46a665622a72 100644 (file)
@@ -678,14 +678,6 @@ v3d_register_allocate(struct v3d_compile *c, bool *spilled)
                         temp_registers[i].magic = false;
                         temp_registers[i].index = ra_reg - PHYS_INDEX;
                 }
-
-                /* If the value's never used, just write to the NOP register
-                 * for clarity in debug output.
-                 */
-                if (c->temp_start[i] == c->temp_end[i]) {
-                        temp_registers[i].magic = true;
-                        temp_registers[i].index = V3D_QPU_WADDR_NOP;
-                }
         }
 
         ralloc_free(g);