diff options
Diffstat (limited to 'src/freedreno/ir3/ir3_ra_validate.c')
-rw-r--r-- | src/freedreno/ir3/ir3_ra_validate.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/freedreno/ir3/ir3_ra_validate.c b/src/freedreno/ir3/ir3_ra_validate.c index 046c49723e8..070ddc195b6 100644 --- a/src/freedreno/ir3/ir3_ra_validate.c +++ b/src/freedreno/ir3/ir3_ra_validate.c @@ -192,10 +192,16 @@ merge_state(struct ra_val_ctx *ctx, struct reaching_state *dst, bool progress = false; progress |= merge_file(&dst->full, &src->full, ctx->full_size); progress |= merge_file(&dst->half, &src->half, ctx->half_size); - progress |= merge_file(&dst->shared, &src->shared, RA_SHARED_SIZE); return progress; } +static bool +merge_state_physical(struct ra_val_ctx *ctx, struct reaching_state *dst, + const struct reaching_state *src) +{ + return merge_file(&dst->shared, &src->shared, RA_SHARED_SIZE); +} + static struct file_state * ra_val_get_file(struct ra_val_ctx *ctx, struct ir3_register *reg) { @@ -337,12 +343,21 @@ propagate_block(struct ra_val_ctx *ctx, struct ir3_block *block) bool progress = false; for (unsigned i = 0; i < 2; i++) { - if (!block->successors[i]) + struct ir3_block *succ = block->successors[i]; + if (!succ) continue; progress |= merge_state(ctx, - &ctx->block_reaching[block->successors[i]->index], + &ctx->block_reaching[succ->index], &ctx->reaching); } + for (unsigned i = 0; i < 2; i++) { + struct ir3_block *succ = block->physical_successors[i]; + if (!succ) + continue; + progress |= merge_state_physical(ctx, + &ctx->block_reaching[succ->index], + &ctx->reaching); + } return progress; } |