diff --git a/.pick_status.json b/.pick_status.json index ba920108162..e59cc407cb3 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -760,7 +760,7 @@ "description": "aco: consider branch definitions in spiller", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 69d5cb23b23..9609d639fb3 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -451,6 +451,13 @@ RegisterDemand init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_id assert(idx != 0 && "loop without phis: TODO"); idx--; RegisterDemand reg_pressure = ctx.register_demand[block_idx][idx] - spilled_registers; + /* Consider register pressure from linear predecessors. This can affect + * reg_pressure if the branch instructions define sgprs. */ + for (unsigned pred : block->linear_preds) { + reg_pressure.sgpr = std::max( + reg_pressure.sgpr, ctx.register_demand[pred].back().sgpr - spilled_registers.sgpr); + } + while (reg_pressure.sgpr > ctx.target_pressure.sgpr) { unsigned distance = 0; Temp to_spill; @@ -629,6 +636,13 @@ RegisterDemand init_live_in_vars(spill_ctx& ctx, Block* block, unsigned block_id } reg_pressure += ctx.register_demand[block_idx][idx] - spilled_registers; + /* Consider register pressure from linear predecessors. This can affect + * reg_pressure if the branch instructions define sgprs. */ + for (unsigned pred : block->linear_preds) { + reg_pressure.sgpr = std::max( + reg_pressure.sgpr, ctx.register_demand[pred].back().sgpr - spilled_registers.sgpr); + } + while (reg_pressure.sgpr > ctx.target_pressure.sgpr) { assert(!partial_spills.empty());