[Mesa-dev] [PATCH] r600: fix array spill if temp[0] is before all arrays

Dave Airlie airlied at gmail.com
Mon Feb 12 04:56:54 UTC 2018


From: Dave Airlie <airlied at redhat.com>

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 at redhat.com>
---
 src/gallium/drivers/r600/r600_shader.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index d9f0d653e9..f71f2c6983 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -927,6 +927,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;
 		}
-- 
2.14.3



More information about the mesa-dev mailing list