pan/midgard: Do not repeatedly spill same value
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sun, 13 Oct 2019 18:16:37 +0000 (14:16 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 16 Oct 2019 12:17:56 +0000 (08:17 -0400)
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 <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/midgard_schedule.c

index a4ffa54c532be91d9e599e3a3a55a533307410d1..5b1daed6d7e25ab733b642100b2ebb12519116fe 100644 (file)
@@ -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;