diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index c630e8c2d6b..8ef29676d0d 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -130,7 +130,7 @@ agx_block_add_successor(agx_block *block, agx_block *successor) } block->successors[i] = successor; - _mesa_set_add(successor->predecessors, block); + util_dynarray_append(&successor->predecessors, agx_block *, block); return; } @@ -1053,8 +1053,7 @@ agx_create_block(agx_context *ctx) { agx_block *blk = rzalloc(ctx, agx_block); - blk->predecessors = _mesa_set_create(blk, - _mesa_hash_pointer, _mesa_key_pointer_equal); + util_dynarray_init(&blk->predecessors, blk); return blk; } diff --git a/src/asahi/compiler/agx_compiler.h b/src/asahi/compiler/agx_compiler.h index bc13ae4d948..0e5314b542e 100644 --- a/src/asahi/compiler/agx_compiler.h +++ b/src/asahi/compiler/agx_compiler.h @@ -351,7 +351,7 @@ typedef struct agx_block { /* Control flow graph */ struct agx_block *successors[2]; - struct set *predecessors; + struct util_dynarray predecessors; bool unconditional_jumps; /* Liveness analysis results */ @@ -540,13 +540,7 @@ agx_vec_for_intr(agx_context *ctx, nir_intrinsic_instr *instr) _v++, v = *_v) \ #define agx_foreach_predecessor(blk, v) \ - struct set_entry *_entry_##v; \ - agx_block *v; \ - for (_entry_##v = _mesa_set_next_entry(blk->predecessors, NULL), \ - v = (agx_block *) (_entry_##v ? _entry_##v->key : NULL); \ - _entry_##v != NULL; \ - _entry_##v = _mesa_set_next_entry(blk->predecessors, _entry_##v), \ - v = (agx_block *) (_entry_##v ? _entry_##v->key : NULL)) + util_dynarray_foreach(&blk->predecessors, agx_block *, v) #define agx_foreach_src(ins, v) \ for (unsigned v = 0; v < ins->nr_srcs; ++v) diff --git a/src/asahi/compiler/agx_liveness.c b/src/asahi/compiler/agx_liveness.c index 0767f06e43f..6aa40435580 100644 --- a/src/asahi/compiler/agx_liveness.c +++ b/src/asahi/compiler/agx_liveness.c @@ -123,10 +123,9 @@ agx_compute_liveness(agx_context *ctx) bool progress = liveness_block_update(blk, words); /* If we made progress, we need to process the predecessors */ - - if (progress || !blk->pass_flags) { + if (progress) { agx_foreach_predecessor(blk, pred) - _mesa_set_add(work_list, pred); + _mesa_set_add(work_list, *pred); } /* Use pass flags to communicate that we've visited this block */ diff --git a/src/asahi/compiler/agx_print.c b/src/asahi/compiler/agx_print.c index 6bb2eb4e019..6b53cc0a7f5 100644 --- a/src/asahi/compiler/agx_print.c +++ b/src/asahi/compiler/agx_print.c @@ -208,11 +208,11 @@ agx_print_block(agx_block *block, FILE *fp) fprintf(fp, "block%u ", succ->name); } - if (block->predecessors->entries) { + if (block->predecessors.size) { fprintf(fp, " from"); agx_foreach_predecessor(block, pred) - fprintf(fp, " block%u", pred->name); + fprintf(fp, " block%u", (*pred)->name); } fprintf(fp, "\n\n"); diff --git a/src/asahi/compiler/agx_register_allocate.c b/src/asahi/compiler/agx_register_allocate.c index 11b6f61ad1d..88d78c16a2a 100644 --- a/src/asahi/compiler/agx_register_allocate.c +++ b/src/asahi/compiler/agx_register_allocate.c @@ -102,7 +102,7 @@ agx_ra_assign_local(agx_block *block, uint8_t *ssa_to_reg, uint8_t *ncomps, unsi agx_foreach_predecessor(block, pred) { for (unsigned i = 0; i < BITSET_WORDS(AGX_NUM_REGS); ++i) - used_regs[i] |= pred->regs_out[i]; + used_regs[i] |= (*pred)->regs_out[i]; } BITSET_SET(used_regs, 0); // control flow writes r0l diff --git a/src/asahi/compiler/test/agx_test.h b/src/asahi/compiler/test/agx_test.h index 3945433a611..ddb27b1361a 100644 --- a/src/asahi/compiler/test/agx_test.h +++ b/src/asahi/compiler/test/agx_test.h @@ -40,10 +40,7 @@ agx_test_builder(void *memctx) list_inithead(&ctx->blocks); agx_block *blk = rzalloc(ctx, agx_block); - - blk->predecessors = _mesa_set_create(blk, - _mesa_hash_pointer, - _mesa_key_pointer_equal); + util_dynarray_init(&blk->predecessors, NULL); list_addtail(&blk->link, &ctx->blocks); list_inithead(&blk->instructions);