mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-27 05:56:00 -04:00
174f7aaf7a
Counterweight to §3-B, with a precise discriminator. When two arms converge on a shared block, that block is usually a late cross_jump merge of per-arm DUPLICATED statements (§298). Spelling it as a real goto is not equivalent when the label sits INSIDE a loop: the goto becomes a jump into the loop body, jump.c's mark_loop_jump marks it loop_invalid, cc1 -dL prints 'Loop at N ignored due to multiple entry points', and loop.c silently drops invariant hoisting — measured: the 1/0x80 constant hoist into $a0/$a1 vanished, 2 insns plus a spurious andi. Discriminator: shared tail outside every loop -> fold it (§3-B, and you may free a hard ABI register). Shared tail inside a loop body -> duplicate per arm and let cross_jump merge. A -dL line is a free oracle for this. Also records CdReadSectorReadyCB's three remaining residual clusters as pack fuel so the next attempt starts from the draft, not from the .s.