diff --git a/.pick_status.json b/.pick_status.json index 99eef7f9197..ad6f85af44c 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -76,7 +76,7 @@ "description": "aco: limit VALUPartialForwardingHazard search", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "5806f0246fdeba22eba4fcf2d1b4cfa03b33e886" }, 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; }