diff --git a/src/amd/compiler/aco_reduce_assign.cpp b/src/amd/compiler/aco_reduce_assign.cpp index bf0904b9889..d280306a8e9 100644 --- a/src/amd/compiler/aco_reduce_assign.cpp +++ b/src/amd/compiler/aco_reduce_assign.cpp @@ -103,11 +103,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; } } @@ -146,8 +151,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 36d8ffdb574..0876e65ac0a 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -1604,10 +1604,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)); } } @@ -1644,10 +1650,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)); } }