mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-26 13:33:34 -04:00
c42b3dbc35
From the fable escalation that closed ov_SC06_010/func_8017E764 (8 -> 0, BOTH clusters), and it is three findings not one: 1. DEAD-RESET CSE-BREAKER. To stop cse merging two computations of the same expression WITHOUT an asm's scheduling footprint: name it, use it, then 'p = 0;' immediately after. cse invalidates at the second set and flow deletes the dead set BEFORE sched1 -- zero bytes, zero LUID disturbance. An empty-asm re-tie by contrast is a REAL pre-call insn whose def->asm->arg chain fronts that argument's addiu, and on this function that WAS the second residual cluster (§361 confirmed: the lever caused the bug it was later blamed on). Removing the dead-reset costs +2 ins / +8 frame bytes, so it is load-bearing. 2. A REGISTER PIN THAT DELETES A sched2 ANTI-DEP. sched1's birthing boost sinks a single-set 'la' to its consumer, local-alloc reuses the freed scratch, and sched2 is then walled by store-reads-$v0 -> la-writes-$v0. A pin on the address pointer deletes the anti-dep. Note this is where a pin is RIGHT, against §368 where pins measured worse -- the discriminator is breaking a false anti-dependence (works) vs out-arguing local-alloc about an allocation (fails). 3. HARD FACT: gcc-2.7.2 insn_cost (sched.c:1363) sets LINK_COST_FREE on any dep whose consumer is unrecognizable (INSN_CODE<0 = every inline asm), so pri(asm)=1 ALWAYS. An asm can never inherit a load's latency into its priority. That closes off a whole family of plausible levers. Also cross-referenced §370: this run was briefed to test that bound FIRST and reported it did NOT explain the residual. §370's claim is unchanged and still narrow; the transferable habit is checking whether a recorded bound covers your case before declaring a residual unreachable.