Module: Mesa Branch: staging/19.3 Commit: 960a21c33e5ff5cdd343707e5ad5383f843e8fea URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=960a21c33e5ff5cdd343707e5ad5383f843e8fea
Author: Rhys Perry <[email protected]> Date: Tue Jan 7 19:13:08 2020 +0000 aco: don't always add logical edges from continue_break blocks to headers Otherwise, code like this will be broken: loop { if (...) { break; } else { break; } } The continue_or_break block doesn't have any logical predecessors but it's a logical predecessor of the header block. This liveness error breaks the spiller in init_live_in_vars() (under "keep variables spilled on all incoming paths") and eventually creates garbage reloads. Fixes: 93c8ebfa ('aco: Initial commit of independent AMD compiler') Signed-off-by: Rhys Perry <[email protected]> Reviewed-by: Daniel Schürmann <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3257> (cherry picked from commit d282a292eca05bd9f701d8509d674e4697f510ec) --- .pick_status.json | 2 +- src/amd/compiler/aco_instruction_selection.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 403ccccdaed..98eba03ffe8 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -382,7 +382,7 @@ "description": "aco: don't always add logical edges from continue_break blocks to headers", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "93c8ebfa780ebd1495095e794731881aef29e7d3" }, diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 0997299f685..ece846d7bca 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -7084,7 +7084,8 @@ static void visit_loop(isel_context *ctx, nir_loop *loop) add_linear_edge(block_idx, continue_block); add_linear_edge(continue_block->index, &ctx->program->blocks[loop_header_idx]); - add_logical_edge(block_idx, &ctx->program->blocks[loop_header_idx]); + if (!ctx->cf_info.parent_loop.has_divergent_branch) + add_logical_edge(block_idx, &ctx->program->blocks[loop_header_idx]); ctx->block = &ctx->program->blocks[block_idx]; } else { ctx->block->kind |= (block_kind_continue | block_kind_uniform); _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
