From c94ccbf201a26cc7c0281787a555bada67dd73c9 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sun, 13 Oct 2019 14:16:37 -0400 Subject: [PATCH] pan/midgard: Do not repeatedly spill same value It doesn't make sense. You already spilled it once, and it didn't help. Don't try again, or you'll end up in a loop. Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/midgard_schedule.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c index a4ffa54c532..5b1daed6d7e 100644 --- a/src/panfrost/midgard/midgard_schedule.c +++ b/src/panfrost/midgard/midgard_schedule.c @@ -1206,15 +1206,27 @@ static void mir_spill_register( /* We can't spill any bundles that contain unspills. This could be * optimized to allow use of r27 to spill twice per bundle, but if - * you're at the point of optimizing spilling, it's too late. */ + * you're at the point of optimizing spilling, it's too late. + * + * We also can't double-spill. */ mir_foreach_block(ctx, block) { mir_foreach_bundle_in_block(block, bun) { bool no_spill = false; - for (unsigned i = 0; i < bun->instruction_count; ++i) + for (unsigned i = 0; i < bun->instruction_count; ++i) { no_spill |= bun->instructions[i]->no_spill; + if (bun->instructions[i]->no_spill) { + mir_foreach_src(bun->instructions[i], s) { + unsigned src = bun->instructions[i]->src[s]; + + if (src < ctx->temp_count) + ra_set_node_spill_cost(g, src, -1.0); + } + } + } + if (!no_spill) continue; -- 2.30.2