From 3f3c19064965886ac735cbb3ce0815fa77739ff8 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Mon, 17 Jun 2024 11:34:26 +0200 Subject: [PATCH] ir3: move liveness recalculation inside ir3_ra_shared Similar to how ir3_spill does it. This will make it easier to optimize this in the future. E.g., we only need to recalculate liveness when any instruction were added. Fixes: fa22b0901af ("ir3/ra: Add specialized shared register RA/spilling") Signed-off-by: Job Noorman Part-of: --- src/freedreno/ir3/ir3_ra.c | 8 +------- src/freedreno/ir3/ir3_ra.h | 2 +- src/freedreno/ir3/ir3_shared_ra.c | 11 ++++++++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/freedreno/ir3/ir3_ra.c b/src/freedreno/ir3/ir3_ra.c index d3203a556ea..6b9cc48360a 100644 --- a/src/freedreno/ir3/ir3_ra.c +++ b/src/freedreno/ir3/ir3_ra.c @@ -2623,13 +2623,7 @@ ir3_ra(struct ir3_shader_variant *v) if (max_pressure.shared + max_pressure.shared_half > limit_pressure.shared || (max_pressure.shared_half > 0 && max_pressure.shared > limit_pressure.shared_half) || has_shared_vectors) { - ir3_ra_shared(v, live); - - /* Recalculate liveness and register pressure now that additional values - * have been added. - */ - ralloc_free(live); - live = ir3_calc_liveness(ctx, v->ir); + ir3_ra_shared(v, &live); ir3_calc_pressure(v, live, &max_pressure); ir3_debug_print(v->ir, "AFTER: shared register allocation"); diff --git a/src/freedreno/ir3/ir3_ra.h b/src/freedreno/ir3/ir3_ra.h index 17ba99fd826..e963c516ea2 100644 --- a/src/freedreno/ir3/ir3_ra.h +++ b/src/freedreno/ir3/ir3_ra.h @@ -191,7 +191,7 @@ bool ir3_spill(struct ir3 *ir, struct ir3_shader_variant *v, bool ir3_lower_spill(struct ir3 *ir); -void ir3_ra_shared(struct ir3_shader_variant *v, struct ir3_liveness *live); +void ir3_ra_shared(struct ir3_shader_variant *v, struct ir3_liveness **live); void ir3_ra_validate(struct ir3_shader_variant *v, unsigned full_size, unsigned half_size, unsigned block_count, bool shared_ra); diff --git a/src/freedreno/ir3/ir3_shared_ra.c b/src/freedreno/ir3/ir3_shared_ra.c index 7ce5d8782de..8bdc33a5e54 100644 --- a/src/freedreno/ir3/ir3_shared_ra.c +++ b/src/freedreno/ir3/ir3_shared_ra.c @@ -1394,9 +1394,10 @@ finalize(struct ir3 *ir) } void -ir3_ra_shared(struct ir3_shader_variant *v, struct ir3_liveness *live) +ir3_ra_shared(struct ir3_shader_variant *v, struct ir3_liveness **live_ptr) { struct ra_ctx ctx; + struct ir3_liveness *live = *live_ptr; ra_ctx_init(&ctx); ctx.intervals = rzalloc_array(NULL, struct ra_interval, @@ -1424,5 +1425,13 @@ ir3_ra_shared(struct ir3_shader_variant *v, struct ir3_liveness *live) ir3_ra_validate(v, RA_FULL_SIZE, RA_HALF_SIZE, live->block_count, true); finalize(v->ir); + + /* Recalculate liveness and register pressure now that additional values have + * been added. + * TODO we should only do this if any values have been spilled/reloaded. + */ + void *live_mem_ctx = ralloc_parent(live); + ralloc_free(live); + *live_ptr = ir3_calc_liveness(live_mem_ctx, v->ir); }