summaryrefslogtreecommitdiff
path: root/src/amd/compiler/aco_insert_NOPs.cpp
diff options
context:
space:
mode:
authorRhys Perry <pendingchaos02@gmail.com>2023-01-26 16:14:26 +0000
committerMarge Bot <emma+marge@anholt.net>2023-02-01 18:52:40 +0000
commitbfd4ac4581bae0d36b2c58524131f91c7c0d27ce (patch)
tree7133e17fe166b84c93dc3c17c21101c6ae19aff4 /src/amd/compiler/aco_insert_NOPs.cpp
parent8092bc2158ebb8a5f85e0ec569387c5dcd0d1627 (diff)
downloadmesa-bfd4ac4581bae0d36b2c58524131f91c7c0d27ce.tar.gz
aco: limit VALUPartialForwardingHazard search
Complicated CFG and lots of SALU can cause this to take an extremely long time to finish. Fixes dEQP-VK.graphicsfuzz.cov-value-tracking-selection-dag-negation-clamp-loop and Monster Hunter Rise demo compile times. fossil-db (gfx1100): Totals from 57 (0.04% of 134574) affected shaders: Instrs: 170919 -> 171165 (+0.14%) CodeSize: 860144 -> 861128 (+0.11%) Latency: 961466 -> 961505 (+0.00%) InvThroughput: 127598 -> 127608 (+0.01%) Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8153 Fixes: 5806f0246fd ("aco/gfx11: workaround VALUPartialForwardingHazard") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20941>
Diffstat (limited to 'src/amd/compiler/aco_insert_NOPs.cpp')
-rw-r--r--src/amd/compiler/aco_insert_NOPs.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/amd/compiler/aco_insert_NOPs.cpp b/src/amd/compiler/aco_insert_NOPs.cpp
index 8cf42811ab0..de9fd0105ff 100644
--- a/src/amd/compiler/aco_insert_NOPs.cpp
+++ b/src/amd/compiler/aco_insert_NOPs.cpp
@@ -1127,6 +1127,9 @@ struct VALUPartialForwardingHazardBlockState {
enum VALUPartialForwardingHazardState state = nothing_written;
unsigned num_valu_since_read = 0;
unsigned num_valu_since_write = 0;
+
+ unsigned num_instrs = 0;
+ unsigned num_blocks = 0;
};
bool
@@ -1189,6 +1192,13 @@ handle_valu_partial_forwarding_hazard_instr(VALUPartialForwardingHazardGlobalSta
if (block_state.num_vgprs_read == 0)
return true; /* All VGPRs have been written and a hazard was never found. */
+ block_state.num_instrs++;
+ if (block_state.num_instrs > 256 || block_state.num_blocks > 32) {
+ /* Exit to limit compile times and set hazard_found=true to be safe. */
+ global_state.hazard_found = true;
+ return true;
+ }
+
return false;
}
@@ -1203,6 +1213,8 @@ handle_valu_partial_forwarding_hazard_block(VALUPartialForwardingHazardGlobalSta
global_state.loop_headers_visited.insert(block->index);
}
+ block_state.num_blocks++;
+
return true;
}