diff --git a/src/freedreno/ir3/ir3_ra.c b/src/freedreno/ir3/ir3_ra.c index 6b9cc48360a..72fd598e95f 100644 --- a/src/freedreno/ir3/ir3_ra.c +++ b/src/freedreno/ir3/ir3_ra.c @@ -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; diff --git a/src/freedreno/ir3/ir3_ra.h b/src/freedreno/ir3/ir3_ra.h index e963c516ea2..4b147c7d8d1 100644 --- a/src/freedreno/ir3/ir3_ra.h +++ b/src/freedreno/ir3/ir3_ra.h @@ -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 diff --git a/src/freedreno/ir3/ir3_shared_ra.c b/src/freedreno/ir3/ir3_shared_ra.c index c37be4954d9..35560458157 100644 --- a/src/freedreno/ir3/ir3_shared_ra.c +++ b/src/freedreno/ir3/ir3_shared_ra.c @@ -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);