r600: fix array spill if temp[0] is before all arrays
authorDave Airlie <airlied@redhat.com>
Mon, 12 Feb 2018 04:46:50 +0000 (14:46 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 14 Feb 2018 03:37:59 +0000 (13:37 +1000)
I found a shader with
DCL TEMP[0], LOCAL
DCL TEMP[1..256], ARRAY(1), LOCAL
DCL TEMP[257..512], ARRAY(2), LOCAL
DCL TEMP[513..768], ARRAY(3), LOCAL
DCL TEMP[769], LOCAL

This would remap badly, as it would add up all the spilled sizes
and subtract it from the temp for 0. If the current temp is less
than the array start break out.

Fixes: 1d871aa6 (r600g: Implement spilling of temp arrays (v2))
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index 4141e864308085e61dd5bb42a9accd058aa04c1c..7d60bd90c3c37a98eb2ae01a0be6d2454b2590df 100644 (file)
@@ -920,6 +920,8 @@ static int map_tgsi_reg_index_to_r600_gpr(struct r600_shader_ctx *ctx, unsigned
                        }
                }
 
+               if (tgsi_reg_index < ctx->array_infos[i].range.First)
+                       break;
                if (ctx->spilled_arrays[i]) {
                        spilled_size += ctx->array_infos[i].range.Last - ctx->array_infos[i].range.First + 1;
                }