From 7bee33f948fe87a27ccdd2fcaf66878e8fb130bf Mon Sep 17 00:00:00 2001 From: Victor Chiletto Date: Tue, 20 Aug 2024 12:41:39 -0300 Subject: [PATCH] vkd3d-shader/hlsl: Allow copy propagation to be stopped early. --- libs/vkd3d-shader/hlsl_codegen.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index 59743612..a5561023 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -1361,6 +1361,8 @@ struct copy_propagation_state { struct rb_tree *scope_var_defs; size_t scope_count, scopes_capacity; + struct hlsl_ir_node *stop; + bool stopped; }; static int copy_propagation_var_def_compare(const void *key, const struct rb_entry *entry) @@ -1926,10 +1928,14 @@ static bool copy_propagation_process_if(struct hlsl_ctx *ctx, struct hlsl_ir_if copy_propagation_push_scope(state, ctx); progress |= copy_propagation_transform_block(ctx, &iff->then_block, state); + if (state->stopped) + return progress; copy_propagation_pop_scope(state); copy_propagation_push_scope(state, ctx); progress |= copy_propagation_transform_block(ctx, &iff->else_block, state); + if (state->stopped) + return progress; copy_propagation_pop_scope(state); /* Ideally we'd invalidate the outer state looking at what was @@ -1951,6 +1957,8 @@ static bool copy_propagation_process_loop(struct hlsl_ctx *ctx, struct hlsl_ir_l copy_propagation_push_scope(state, ctx); progress |= copy_propagation_transform_block(ctx, &loop->body, state); + if (state->stopped) + return progress; copy_propagation_pop_scope(state); return progress; @@ -1966,6 +1974,8 @@ static bool copy_propagation_process_switch(struct hlsl_ctx *ctx, struct hlsl_ir { copy_propagation_push_scope(state, ctx); progress |= copy_propagation_transform_block(ctx, &c->body, state); + if (state->stopped) + return progress; copy_propagation_pop_scope(state); } @@ -1985,6 +1995,12 @@ static bool copy_propagation_transform_block(struct hlsl_ctx *ctx, struct hlsl_b LIST_FOR_EACH_ENTRY_SAFE(instr, next, &block->instrs, struct hlsl_ir_node, entry) { + if (instr == state->stop) + { + state->stopped = true; + return progress; + } + switch (instr->type) { case HLSL_IR_LOAD: @@ -2022,6 +2038,9 @@ static bool copy_propagation_transform_block(struct hlsl_ctx *ctx, struct hlsl_b default: break; } + + if (state->stopped) + return progress; } return progress;