mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 20:38:06 +02:00
ir3: update merge set affinity in shared RA
The preferred register for merge sets was not updated after allocating
one. This caused a new merge set to be allocated for every register it
contains. This patch fixes this by reusing the update function from the
standard RA.
Fixes: fa22b0901a ("ir3/ra: Add specialized shared register RA/spilling")
Signed-off-by: Job Noorman <jnoorman@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28341>
This commit is contained in:
parent
de1d36d054
commit
9013e11d8c
3 changed files with 9 additions and 5 deletions
|
|
@ -1308,9 +1308,9 @@ compress_regs_left(struct ra_ctx *ctx, struct ra_file *file,
|
|||
return ret_reg;
|
||||
}
|
||||
|
||||
static void
|
||||
update_affinity(struct ra_file *file, struct ir3_register *reg,
|
||||
physreg_t physreg)
|
||||
void
|
||||
ra_update_affinity(unsigned file_size, struct ir3_register *reg,
|
||||
physreg_t physreg)
|
||||
{
|
||||
if (!reg->merge_set || reg->merge_set->preferred_reg != (physreg_t)~0)
|
||||
return;
|
||||
|
|
@ -1318,7 +1318,7 @@ update_affinity(struct ra_file *file, struct ir3_register *reg,
|
|||
if (physreg < reg->merge_set_offset)
|
||||
return;
|
||||
|
||||
if ((physreg - reg->merge_set_offset + reg->merge_set->size) > file->size)
|
||||
if ((physreg - reg->merge_set_offset + reg->merge_set->size) > file_size)
|
||||
return;
|
||||
|
||||
reg->merge_set->preferred_reg = physreg - reg->merge_set_offset;
|
||||
|
|
@ -1509,7 +1509,7 @@ allocate_dst_fixed(struct ra_ctx *ctx, struct ir3_register *dst,
|
|||
{
|
||||
struct ra_file *file = ra_get_file(ctx, dst);
|
||||
struct ra_interval *interval = &ctx->intervals[dst->name];
|
||||
update_affinity(file, dst, physreg);
|
||||
ra_update_affinity(file->size, dst, physreg);
|
||||
|
||||
ra_interval_init(interval, dst);
|
||||
interval->physreg_start = physreg;
|
||||
|
|
|
|||
|
|
@ -306,4 +306,7 @@ void ir3_reg_interval_remove(struct ir3_reg_ctx *ctx,
|
|||
void ir3_reg_interval_remove_all(struct ir3_reg_ctx *ctx,
|
||||
struct ir3_reg_interval *interval);
|
||||
|
||||
void ra_update_affinity(unsigned file_size, struct ir3_register *reg,
|
||||
physreg_t physreg);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -879,6 +879,7 @@ handle_dst(struct ra_ctx *ctx, struct ir3_instruction *instr,
|
|||
free_space(ctx, physreg, size);
|
||||
}
|
||||
|
||||
ra_update_affinity(reg_file_size(dst), dst, physreg);
|
||||
interval->physreg_start = physreg;
|
||||
interval->physreg_end = physreg + reg_size(dst);
|
||||
dst->num = ra_physreg_to_num(physreg, dst->flags);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue