From 0a25af1d4ed47e6ce67fafd19f1ea127fe217f23 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 19 Mar 2024 12:04:32 +0000 Subject: [PATCH] aco: save/reset/combine has_divergent_continue in uniform branches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For if (uniform) { if (divergent) continue } else { break } we don't need to consider the continue to be divergent. No fossil-db changes. Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 21a9906176e..49bbc90a4f7 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -56,6 +56,8 @@ struct if_context { bool exec_potentially_empty_break_old; bool had_divergent_discard_old; bool had_divergent_discard_then; + bool has_divergent_continue_old; + bool has_divergent_continue_then; uint16_t exec_potentially_empty_break_depth_old; unsigned BB_if_idx; @@ -10650,6 +10652,7 @@ begin_uniform_if_then(isel_context* ctx, if_context* ic, Temp cond) ctx->cf_info.parent_loop.has_divergent_branch = false; ic->had_divergent_discard_old = ctx->cf_info.had_divergent_discard; + ic->has_divergent_continue_old = ctx->cf_info.parent_loop.has_divergent_continue; /** emit then block */ ctx->program->next_uniform_if_depth++; @@ -10686,6 +10689,9 @@ begin_uniform_if_else(isel_context* ctx, if_context* ic) ic->had_divergent_discard_then = ctx->cf_info.had_divergent_discard; ctx->cf_info.had_divergent_discard = ic->had_divergent_discard_old; + ic->has_divergent_continue_then = ctx->cf_info.parent_loop.has_divergent_continue; + ctx->cf_info.parent_loop.has_divergent_continue = ic->has_divergent_continue_old; + /** emit else block */ Block* BB_else = ctx->program->create_and_insert_block(); add_edge(ic->BB_if_idx, BB_else); @@ -10714,6 +10720,7 @@ end_uniform_if(isel_context* ctx, if_context* ic) ctx->cf_info.has_branch &= ic->uniform_has_then_branch; ctx->cf_info.parent_loop.has_divergent_branch &= ic->then_branch_divergent; ctx->cf_info.had_divergent_discard |= ic->had_divergent_discard_then; + ctx->cf_info.parent_loop.has_divergent_continue |= ic->has_divergent_continue_then; /** emit endif merge block */ ctx->program->next_uniform_if_depth--;