diff --git a/.pick_status.json b/.pick_status.json index 45c3b0cda2b..06dcdcec8b7 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2484,7 +2484,7 @@ "description": "aco/spill: Insert p_start_linear_vgpr right after p_logical_end", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/compiler/aco_reduce_assign.cpp b/src/amd/compiler/aco_reduce_assign.cpp index 55fc525e485..2bc5add45ae 100644 --- a/src/amd/compiler/aco_reduce_assign.cpp +++ b/src/amd/compiler/aco_reduce_assign.cpp @@ -118,11 +118,16 @@ setup_reduce_temp(Program* program) * would insert at the end instead of using this one. */ } else { assert(last_top_level_block_idx < block.index); - /* insert before the branch at last top level block */ + /* insert after p_logical_end of the last top-level block */ std::vector>& instructions = program->blocks[last_top_level_block_idx].instructions; - instructions.insert(std::next(instructions.begin(), instructions.size() - 1), - std::move(create)); + auto insert_point = + std::find_if(instructions.rbegin(), instructions.rend(), + [](const auto& iter) { + return iter->opcode == aco_opcode::p_logical_end; + }) + .base(); + instructions.insert(insert_point, std::move(create)); inserted_at = last_top_level_block_idx; } } @@ -161,8 +166,13 @@ setup_reduce_temp(Program* program) assert(last_top_level_block_idx < block.index); std::vector>& instructions = program->blocks[last_top_level_block_idx].instructions; - instructions.insert(std::next(instructions.begin(), instructions.size() - 1), - std::move(create)); + auto insert_point = + std::find_if(instructions.rbegin(), instructions.rend(), + [](const auto& iter) { + return iter->opcode == aco_opcode::p_logical_end; + }) + .base(); + instructions.insert(insert_point, std::move(create)); vtmp_inserted_at = last_top_level_block_idx; } } diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 8da3d49202b..47c4f803834 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -1845,10 +1845,16 @@ assign_spill_slots(spill_ctx& ctx, unsigned spills_to_vgpr) instructions.emplace_back(std::move(create)); } else { assert(last_top_level_block_idx < block.index); - /* insert before the branch at last top level block */ + /* insert after p_logical_end of the last top-level block */ std::vector>& block_instrs = ctx.program->blocks[last_top_level_block_idx].instructions; - block_instrs.insert(std::prev(block_instrs.end()), std::move(create)); + auto insert_point = + std::find_if(block_instrs.rbegin(), block_instrs.rend(), + [](const auto& iter) { + return iter->opcode == aco_opcode::p_logical_end; + }) + .base(); + block_instrs.insert(insert_point, std::move(create)); } } @@ -1885,10 +1891,16 @@ assign_spill_slots(spill_ctx& ctx, unsigned spills_to_vgpr) instructions.emplace_back(std::move(create)); } else { assert(last_top_level_block_idx < block.index); - /* insert before the branch at last top level block */ + /* insert after p_logical_end of the last top-level block */ std::vector>& block_instrs = ctx.program->blocks[last_top_level_block_idx].instructions; - block_instrs.insert(std::prev(block_instrs.end()), std::move(create)); + auto insert_point = + std::find_if(block_instrs.rbegin(), block_instrs.rend(), + [](const auto& iter) { + return iter->opcode == aco_opcode::p_logical_end; + }) + .base(); + block_instrs.insert(insert_point, std::move(create)); } }