mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 03:08:05 +02:00
aco/spill: Avoid copying current_spills when not needed
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11925>
This commit is contained in:
parent
6650799ea5
commit
05163fd4f4
1 changed files with 10 additions and 11 deletions
|
|
@ -1144,8 +1144,7 @@ add_coupling_code(spill_ctx& ctx, Block* block, unsigned block_idx)
|
|||
}
|
||||
|
||||
void
|
||||
process_block(spill_ctx& ctx, unsigned block_idx, Block* block,
|
||||
std::map<Temp, uint32_t>& current_spills, RegisterDemand spilled_registers)
|
||||
process_block(spill_ctx& ctx, unsigned block_idx, Block* block, RegisterDemand spilled_registers)
|
||||
{
|
||||
assert(!ctx.processed[block_idx]);
|
||||
|
||||
|
|
@ -1164,6 +1163,8 @@ process_block(spill_ctx& ctx, unsigned block_idx, Block* block,
|
|||
/* We won't use local_next_use_distance, so no initialization needed */
|
||||
}
|
||||
|
||||
auto& current_spills = ctx.spills_exit[block_idx];
|
||||
|
||||
while (idx < block->instructions.size()) {
|
||||
aco_ptr<Instruction>& instr = block->instructions[idx];
|
||||
|
||||
|
|
@ -1214,9 +1215,7 @@ process_block(spill_ctx& ctx, unsigned block_idx, Block* block,
|
|||
bool can_rematerialize = ctx.remat.count(pair.first);
|
||||
if (((pair.second > distance && can_rematerialize == do_rematerialize) ||
|
||||
(can_rematerialize && !do_rematerialize && pair.second > idx)) &&
|
||||
current_spills.find(pair.first) == current_spills.end() &&
|
||||
ctx.spills_exit[block_idx].find(pair.first) ==
|
||||
ctx.spills_exit[block_idx].end()) {
|
||||
current_spills.find(pair.first) == current_spills.end()) {
|
||||
to_spill = pair.first;
|
||||
distance = pair.second;
|
||||
do_rematerialize = can_rematerialize;
|
||||
|
|
@ -1260,7 +1259,6 @@ process_block(spill_ctx& ctx, unsigned block_idx, Block* block,
|
|||
}
|
||||
|
||||
block->instructions = std::move(instructions);
|
||||
ctx.spills_exit[block_idx].insert(current_spills.begin(), current_spills.end());
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -1284,7 +1282,7 @@ spill_block(spill_ctx& ctx, unsigned block_idx)
|
|||
add_coupling_code(ctx, block, block_idx);
|
||||
}
|
||||
|
||||
std::map<Temp, uint32_t> current_spills = ctx.spills_entry[block_idx];
|
||||
const std::map<Temp, uint32_t>& current_spills = ctx.spills_entry[block_idx];
|
||||
|
||||
/* check conditions to process this block */
|
||||
bool process = (block->register_demand - spilled_registers).exceeds(ctx.target_pressure) ||
|
||||
|
|
@ -1295,10 +1293,11 @@ spill_block(spill_ctx& ctx, unsigned block_idx)
|
|||
process = true;
|
||||
}
|
||||
|
||||
if (process)
|
||||
process_block(ctx, block_idx, block, current_spills, spilled_registers);
|
||||
else
|
||||
ctx.spills_exit[block_idx].insert(current_spills.begin(), current_spills.end());
|
||||
assert(ctx.spills_exit[block_idx].empty());
|
||||
ctx.spills_exit[block_idx] = current_spills;
|
||||
if (process) {
|
||||
process_block(ctx, block_idx, block, spilled_registers);
|
||||
}
|
||||
|
||||
ctx.processed[block_idx] = true;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue