pan/midgard: Initialize worklist
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Sat, 31 Aug 2019 18:56:58 +0000 (11:56 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 30 Sep 2019 12:40:13 +0000 (08:40 -0400)
This flows naturally from the dependency graph

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/midgard_schedule.c

index 70fa030390c90477a2ce03fe9a7647e35537a377..aff93399a80c8f793a4f84291ea28b476ca6b469 100644 (file)
@@ -755,6 +755,18 @@ flatten_mir(midgard_block *block, unsigned *len)
         return instructions;
 }
 
+/* The worklist is the set of instructions that can be scheduled now; that is,
+ * the set of instructions with no remaining dependencies */
+
+static void
+mir_initialize_worklist(BITSET_WORD *worklist, midgard_instruction **instructions, unsigned count)
+{
+        for (unsigned i = 0; i < count; ++i) {
+                if (instructions[i]->nr_dependencies == 0)
+                        BITSET_SET(worklist, i);
+        }
+}
+
 /* Schedule a single block by iterating its instruction to create bundles.
  * While we go, tally about the bundle sizes to compute the block size. */
 
@@ -769,6 +781,11 @@ schedule_block(compiler_context *ctx, midgard_block *block)
         unsigned node_count = ctx->temp_count + 1;
         mir_create_dependency_graph(instructions, len, node_count);
 
+        /* Allocate the worklist */
+        size_t sz = BITSET_WORDS(len) * sizeof(BITSET_WORD);
+        BITSET_WORD *worklist = calloc(sz, 1);
+        mir_initialize_worklist(worklist, instructions, len);
+
         util_dynarray_init(&block->bundles, NULL);
 
         block->quadword_count = 0;