diff options
Diffstat (limited to 'src/asahi/compiler/agx_pressure_schedule.c')
| -rw-r--r-- | src/asahi/compiler/agx_pressure_schedule.c | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/src/asahi/compiler/agx_pressure_schedule.c b/src/asahi/compiler/agx_pressure_schedule.c index 35961bee876..57849fd6e83 100644 --- a/src/asahi/compiler/agx_pressure_schedule.c +++ b/src/asahi/compiler/agx_pressure_schedule.c @@ -7,6 +7,7 @@ /* Bottom-up local scheduler to reduce register pressure */ #include "util/dag.h" +#include "util/sparse_bitset.h" #include "agx_compiler.h" #include "agx_opcodes.h" @@ -15,7 +16,7 @@ struct sched_ctx { struct dag *dag; /* Live set */ - BITSET_WORD *live; + struct u_sparse_bitset live; }; struct sched_node { @@ -121,13 +122,13 @@ create_dag(agx_context *ctx, agx_block *block, void *memctx) * live_in = (live_out - KILL) + GEN */ static signed -calculate_pressure_delta(agx_instr *I, BITSET_WORD *live) +calculate_pressure_delta(agx_instr *I, struct u_sparse_bitset *live) { signed delta = 0; /* Destinations must be unique */ agx_foreach_ssa_dest(I, d) { - if (BITSET_TEST(live, I->dest[d].value)) + if (u_sparse_bitset_test(live, I->dest[d].value)) delta -= agx_index_size_16(I->dest[d]); } @@ -142,7 +143,7 @@ calculate_pressure_delta(agx_instr *I, BITSET_WORD *live) } } - if (!dupe && !BITSET_TEST(live, I->src[src].value)) + if (!dupe && !u_sparse_bitset_test(live, I->src[src].value)) delta += agx_index_size_16(I->src[src]); } @@ -185,7 +186,7 @@ choose_instr(struct sched_ctx *s) if (n->instr->op == AGX_OPCODE_WAIT_PIX) return n; - int32_t delta = calculate_pressure_delta(n->instr, s->live); + int32_t delta = calculate_pressure_delta(n->instr, &s->live); if (delta < min_delta) { best = n; @@ -204,16 +205,16 @@ pressure_schedule_block(agx_context *ctx, agx_block *block, struct sched_ctx *s) signed orig_max_pressure = 0; unsigned nr_ins = 0; - memcpy(s->live, block->live_out, BITSET_BYTES(ctx->alloc)); + u_sparse_bitset_dup(&s->live, &block->live_out); agx_foreach_instr_in_block_rev(block, I) { - pressure += calculate_pressure_delta(I, s->live); + pressure += calculate_pressure_delta(I, &s->live); orig_max_pressure = MAX2(pressure, orig_max_pressure); - agx_liveness_ins_update(s->live, I); + agx_liveness_ins_update(&s->live, I); nr_ins++; } - memcpy(s->live, block->live_out, BITSET_BYTES(ctx->alloc)); + u_sparse_bitset_dup(&s->live, &block->live_out); /* off by a constant, that's ok */ signed max_pressure = 0; @@ -224,12 +225,12 @@ pressure_schedule_block(agx_context *ctx, agx_block *block, struct sched_ctx *s) while (!list_is_empty(&s->dag->heads)) { struct sched_node *node = choose_instr(s); - pressure += calculate_pressure_delta(node->instr, s->live); + pressure += calculate_pressure_delta(node->instr, &s->live); max_pressure = MAX2(pressure, max_pressure); dag_prune_head(s->dag, &node->dag); schedule[nr_ins++] = node; - agx_liveness_ins_update(s->live, node->instr); + agx_liveness_ins_update(&s->live, node->instr); } /* Bail if it looks like it's worse */ @@ -252,14 +253,10 @@ agx_pressure_schedule(agx_context *ctx) { agx_compute_liveness(ctx); void *memctx = ralloc_context(ctx); - BITSET_WORD *live = - ralloc_array(memctx, BITSET_WORD, BITSET_WORDS(ctx->alloc)); agx_foreach_block(ctx, block) { - struct sched_ctx sctx = { - .dag = create_dag(ctx, block, memctx), - .live = live, - }; + struct sched_ctx sctx = {.dag = create_dag(ctx, block, memctx)}; + u_sparse_bitset_init(&sctx.live, ctx->alloc, memctx); pressure_schedule_block(ctx, block, &sctx); } |