aco/spill: Avoid copying current_spills when not needed
authorTony Wasserka <tony.wasserka@gmx.de>
Sat, 10 Jul 2021 12:06:50 +0000 (14:06 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 1 Oct 2021 09:39:13 +0000 (09:39 +0000)
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11925>

src/amd/compiler/aco_spill.cpp

index 35a532d..cc4b9a5 100644 (file)
@@ -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;