ir3/sched: Don't schedule collect early
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 11 Mar 2021 14:00:15 +0000 (15:00 +0100)
committerEmma Anholt <emma@anholt.net>
Thu, 10 Jun 2021 19:24:06 +0000 (12:24 -0700)
I don't think there was ever a good reason to do this, but when we start
folding constants/immediates into collect, this can become actively
harmful.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9842>

src/freedreno/ir3/ir3_sched.c

index 22d1f88..2e1cabf 100644 (file)
@@ -746,7 +746,16 @@ choose_instr_prio(struct ir3_sched_ctx *ctx, struct ir3_sched_notes *notes)
        struct ir3_sched_node *chosen = NULL;
 
        foreach_sched_node (n, &ctx->dag->heads) {
-               if (!is_meta(n->instr))
+               /*
+                * - phi nodes and inputs must be scheduled first
+                * - split should be scheduled first, so that the vector value is
+                *   killed as soon as possible. RA cannot split up the vector and
+                *   reuse components that have been killed until it's been killed.
+                * - collect, on the other hand, should be treated as a "normal"
+                *   instruction, and may add to register pressure if its sources are
+                *   part of another vector or immediates.
+                */
+               if (!is_meta(n->instr) || n->instr->opc == OPC_META_COLLECT)
                        continue;
 
                if (!chosen || (chosen->max_delay < n->max_delay))