From 7c4dd3194aedfc129168efdb012f9ea0d85830d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Fri, 16 Sep 2022 13:54:54 +0200 Subject: [PATCH] aco/optimizer_postRA: Mark a register overwritten when predecessors disagree. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Affects blocks whose some (but not all) predecessors overwrite a register. This commit fixes glitches in some games which regressed because of the improved SCC no-compare optimization. Fossil DB stats on Navi 21: Totals from 2816 (2.09% of 134906) affected shaders: CodeSize: 24224276 -> 24241580 (+0.07%) Instrs: 4570595 -> 4574921 (+0.09%) Latency: 53680256 -> 53693655 (+0.02%); split: -0.00%, +0.02% InvThroughput: 9829289 -> 9830573 (+0.01%) Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7257 Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7305 Fixes: 2e56e2342094e8ec90afa5265b1c43503f662939 Signed-off-by: Timur Kristóf Reviewed-by: Daniel Schürmann Part-of: (cherry picked from commit 63063dd5ce4ef4a7a4c305c0905900aa25c5abe2) --- .pick_status.json | 2 +- src/amd/compiler/aco_optimizer_postRA.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 6e657f167b8..805a72e3058 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2587,7 +2587,7 @@ "description": "aco/optimizer_postRA: Mark a register overwritten when predecessors disagree.", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "2e56e2342094e8ec90afa5265b1c43503f662939" }, diff --git a/src/amd/compiler/aco_optimizer_postRA.cpp b/src/amd/compiler/aco_optimizer_postRA.cpp index 726cff40a0c..0b4a3a71ea7 100644 --- a/src/amd/compiler/aco_optimizer_postRA.cpp +++ b/src/amd/compiler/aco_optimizer_postRA.cpp @@ -76,7 +76,7 @@ struct pr_opt_ctx { if (all_same) instr_idx_by_regs[block->index][i] = instr_idx_by_regs[first_pred][i]; else - instr_idx_by_regs[block->index][i] = not_written_in_block; + instr_idx_by_regs[block->index][i] = written_by_multiple_instrs; } } }