From f48038b588df726cd34f5d15e999498310da7432 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 31 Aug 2019 11:56:58 -0700 Subject: [PATCH] pan/midgard: Initialize worklist This flows naturally from the dependency graph Signed-off-by: Alyssa Rosenzweig --- src/panfrost/midgard/midgard_schedule.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/panfrost/midgard/midgard_schedule.c b/src/panfrost/midgard/midgard_schedule.c index 70fa030390c..aff93399a80 100644 --- a/src/panfrost/midgard/midgard_schedule.c +++ b/src/panfrost/midgard/midgard_schedule.c @@ -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; -- 2.30.2