diff --git a/.pick_status.json b/.pick_status.json index a103e3ea93e..1eb1adead67 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -364,7 +364,7 @@ "description": "pan/mdg: Reorder some code in mir_spill_register", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null }, diff --git a/src/panfrost/midgard/midgard_ra.c b/src/panfrost/midgard/midgard_ra.c index 1d93cc44f16..c6e97b7b752 100644 --- a/src/panfrost/midgard/midgard_ra.c +++ b/src/panfrost/midgard/midgard_ra.c @@ -842,6 +842,13 @@ mir_spill_register( /* Allocate TLS slot (maybe) */ unsigned spill_slot = !is_special ? (*spill_count)++ : 0; + /* For special reads, figure out how many bytes we need */ + unsigned read_bytemask = 0; + + mir_foreach_instr_global_safe(ctx, ins) { + read_bytemask |= mir_bytemask_of_read_components(ins, spill_node); + } + /* For TLS, replace all stores to the spilled node. For * special reads, just keep as-is; the class will be demoted * implicitly. For special writes, spill to a work register */ @@ -855,8 +862,6 @@ mir_spill_register( mir_foreach_instr_in_block_safe(block, ins) { if (ins->dest != spill_node) continue; - midgard_instruction st; - /* Note: it's important to match the mask of the spill * with the mask of the instruction whose destination * we're spilling, or otherwise we'll read invalid @@ -864,34 +869,30 @@ mir_spill_register( */ if (is_special_w) { - st = v_mov(spill_node, spill_slot); + midgard_instruction st = v_mov(spill_node, spill_slot); st.no_spill |= (1 << spill_class); st.mask = ins->mask; st.dest_type = st.src_types[1] = ins->dest_type; + + /* Hint: don't rewrite this node */ + st.hint = true; + + mir_insert_instruction_after_scheduled(ctx, block, ins, st); } else { ins->dest = spill_index++; ins->no_spill |= (1 << spill_class); - st = v_load_store_scratch(ins->dest, spill_slot, true, ins->mask); + + midgard_instruction st = + v_load_store_scratch(ins->dest, spill_slot, true, ins->mask); + mir_insert_instruction_after_scheduled(ctx, block, ins, st); } - /* Hint: don't rewrite this node */ - st.hint = true; - - mir_insert_instruction_after_scheduled(ctx, block, ins, st); - if (!is_special) ctx->spills++; } } } - /* For special reads, figure out how many bytes we need */ - unsigned read_bytemask = 0; - - mir_foreach_instr_global_safe(ctx, ins) { - read_bytemask |= mir_bytemask_of_read_components(ins, spill_node); - } - /* Insert a load from TLS before the first consecutive * use of the node, rewriting to use spilled indices to * break up the live range. Or, for special, insert a