From 5e5423e953d2d35fe598f59cb377760d30b70ec7 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 24 Jun 2026 22:11:27 -0600 Subject: [PATCH] =?UTF-8?q?feat(phase-21):=20dedup=5Fpropagate=20drop-stra?= =?UTF-8?q?ggler=20retry=20=E2=80=94=20=5Fa=20pipeline=20now=20hands-free?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 2nd straggler class (cont.4 wave-2): cross-overlay loose-typing COMPILE errors (not just the -O0 byte-mismatch class). The -O0 exclusion alone was insufficient. Refactor the propagation into a drop-straggler retry loop: extract apply_plan(subplan, restrict=); on a byte-gate failure, isolate the culprit(s) for the failing overlay (per-fn trial), drop them (kept x1), retry the survivors. Handles BOTH straggler classes failing ANY overlay; plan strictly shrinks (terminates); byte-gate stays sole arbiter (a dropped fn never banks where it isn't byte-identical). Validated end-to-end: wave-2 --auto-from auto-dropped 2 loose-typing stragglers + propagated 3 clean x134 (commit:0271); fleet 62.70 -> 62.82%. Future _a waves now auto-realize x134, no manual probe. --- docs/backlog.md | 447 ++++++++++++++++++------------------ docs/progress.fleet.md | 274 +++++++++++----------- phase-ends/CURRENT_PHASE.md | 14 +- tools/dedup_propagate.py | 199 +++++++++------- 4 files changed, 492 insertions(+), 442 deletions(-) diff --git a/docs/backlog.md b/docs/backlog.md index 87168dcdd9..81942c5a77 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -2,7 +2,7 @@ > Generated by `tools/backlog.py render` from `.run/backlog.jsonl`. These are functions the Phase-21 automation got **close** on but did NOT byte-match. The whole-binary byte-gate is the sole arbiter (G3/P9): **byte-matches bank and are NOT listed here** — only genuine near-misses/blockers are. Ranked by hand-session priority: **reach** (×N propagation leverage) → **closeness** (match_one mismatch count, lower = closer) → **size**. Each row's `best_draft` is the closest C the machine reached — resume from there. -**Open near-misses:** 242 · by status {'near': 177, 'failed': 65} · by class {'WAVE': 20, 'plumbing': 42, 'other': 15, 'schedule': 47, 'loose-typing': 2, 'struct': 51, 'loop-guard': 2, 'regalloc-order': 49, 'remat': 3, 'iv-combine': 3, 'GIANT': 8} +**Open near-misses:** 253 · by status {'near': 187, 'failed': 66} · by class {'WAVE': 20, 'plumbing': 43, 'other': 16, 'schedule': 52, 'loose-typing': 3, 'struct': 52, 'loop-guard': 2, 'regalloc-order': 50, 'remat': 4, 'iv-combine': 3, 'GIANT': 8} | # | addr | reach | class | nins | status | closeness | where it stuck | best draft | |--:|------|------:|-------|-----:|--------|----------:|----------------|------------| @@ -31,220 +31,231 @@ | 23 | func_801495C4 | 134 | regalloc-order | 34 | near | 0 | none — MATCH expected (cloned byte-matched sibling func_8014964C recipe: $16 pin + asm barriers force param_2→$s0 and rematerialize &in/&mid/mtx) | `.run/backlog_drafts/func_801495C4.c` | | 24 | func_80151664 | 134 | plumbing | 35 | near | 0 | none — MATCH (35 ins, relocation-masked); canonical externs kept, call-site casts only | `.run/backlog_drafts/func_80151664.c` | | 25 | func_801522CC | 134 | plumbing | 41 | near | 0 | TBD — first compile; func_80153C18 canonical is (void) but target sets $a0=$s0 in its delay slot (call-site cast) | `.run/backlog_drafts/func_801522CC.c` | -| 26 | func_801497A8 | 134 | regalloc-order | 47 | near | 0 | none — MATCH. $s1 pinned to D_80078E78 base; result accumulator + masked | `.run/backlog_drafts/func_801497A8.c` | -| 27 | func_801483E8 | 134 | struct | 50 | near | 0 | none — MATCH | `.run/backlog_drafts/func_801483E8.c` | -| 28 | func_8015F380 | 134 | plumbing | 50 | near | 0 | none — expect MATCH (single call-crossing local pinned to $s0) | `.run/backlog_drafts/func_8015F380.c` | -| 29 | func_8016EFC8 | 134 | schedule | 51 | near | 0 | none — MATCH (51 ins). Temp `u32 v = *a0 / 0x4000000;` hoists the load to ins 0 and | `.run/backlog_drafts/func_8016EFC8.c` | -| 30 | func_80156ECC | 134 | plumbing | 55 | near | 0 | none — MATCH (clean reconstruction; 3 call-crossing structs in s1/s2/s4, lh/lhu pair) | `.run/backlog_drafts/func_80156ECC.c` | -| 31 | func_801758FC | 134 | schedule | 55 | near | 0 | none — MATCH (55 ins) | `.run/backlog_drafts/func_801758FC.c` | -| 32 | func_801759D8 | 134 | schedule | 56 | near | 0 | none — MATCH (56 ins) | `.run/backlog_drafts/func_801759D8.c` | -| 33 | func_80133298 | 134 | struct | 65 | near | 0 | none — MATCH (65 ins, relocation-masked) | `.run/backlog_drafts/func_80133298.c` | -| 34 | func_80147E44 | 134 | regalloc-order | 67 | near | 0 | none -- MATCH (67 ins). $s1/$s0/$s3/$s2 pins ($17/$16/$19/$18) + 3-pointer reload | `.run/backlog_drafts/func_80147E44.c` | -| 35 | func_80164418 | 134 | struct | 70 | near | 0 | none — MATCH (s16 stack array forces the spill; 2nd ratan2 reuses /dy/ in $a1) | `.run/backlog_drafts/func_80164418.c` | -| 36 | func_8012E014 | 134 | other | 73 | near | 0 | none — MATCH (expected; straightforward struct-field + global-copy body) | `.run/backlog_drafts/func_8012E014.c` | -| 37 | func_8012E138 | 134 | regalloc-order | 81 | near | 0 | none — MATCH (81/81 ins, match_one proxy); reloaded ptr pinned to $a0 | `.run/backlog_drafts/func_8012E138.c` | -| 38 | func_8012B4B8 | 134 | regalloc-order | 84 | near | 0 | none — MATCH | `.run/backlog_drafts/func_8012B4B8.c` | -| 39 | func_80166054 | 134 | regalloc-order | 94 | near | 0 | none — MATCH (94 ins). Pins: param_1->$s2, angle->$s0, shift->$s1, r0->$s3, | `.run/backlog_drafts/func_80166054.c` | -| 40 | func_801379FC | 134 | regalloc-order | 97 | near | 0 | none — MATCH (match_one 97/97) | `.run/backlog_drafts/func_801379FC.c` | -| 41 | func_801463A0 | 134 | struct | 101 | near | 0 | none — MATCH (101 ins, match_one); real symbol names; misaligned 8B copy + s16 stores + masked B9C last | `.run/backlog_drafts/func_801463A0.c` | -| 42 | func_80167714 | 134 | regalloc-order | 104 | near | 0 | none — MATCH (104 ins) | `.run/backlog_drafts/func_80167714.c` | -| 43 | func_80169228 | 134 | regalloc-order | 105 | near | 0 | none — MATCH (105 ins, relocation-masked). Key levers: arg0/p pinned $s1/$s0, | `.run/backlog_drafts/func_80169228.c` | -| 44 | func_8012CC88 | 134 | struct | 105 | near | 0 | none — MATCH (105 ins, relocation-masked) | `.run/backlog_drafts/func_8012CC88.c` | -| 45 | func_80174CB0 | 134 | regalloc-order | 123 | near | 0 | none — MATCH (match_one 123/123). Levers: (1) §21 one combined stack struct {s32 a[5]; ...} | `.run/backlog_drafts/func_80174CB0.c` | -| 46 | func_80178004 | 134 | regalloc-order | 165 | near | 0 | none — MATCH (full register pins per sibling func_80177EA4; running-ptr $s2 to stop unroll-rebase; | `.run/backlog_drafts/func_80178004.c` | -| 47 | func_80163C2C | 134 | regalloc-order | 167 | near | 0 | none — MATCH (167 ins) | `.run/backlog_drafts/func_80163C2C.c` | -| 48 | func_8015126C | 134 | regalloc-order | 254 | near | 0 | none — MATCH (254 ins, relocation-masked) | `.run/backlog_drafts/func_8015126C.c` | -| 49 | func_8016F0E4 | 134 | plumbing | 26 | near | 1 | none — MATCH (26 ins); natural C form, param_1 auto-allocated to $s0 | `.run/backlog_drafts/func_8016F0E4.c` | -| 50 | func_8014F3E8 | 134 | WAVE | 32 | near | 1 | WAVE: 1 mismatch | `.run/backlog_drafts/func_8014F3E8.c` | -| 51 | func_80177AD4 | 134 | regalloc-order | 34 | near | 1 | 1 ins — loop-bound shift reads loop-carried $a3 (sll v0,a3,16) vs target's dying copy $v0 (sll v0,v0,16); gcc CSE canonicalizes the two equal-valued regs to the loop-carried one. IV-combine (§20) CRACKED via $a2/$a3 pins (was 31-mismatch "stub"). | `.run/backlog_drafts/func_80177AD4.c` | -| 52 | func_801775E0 | 134 | regalloc-order | 67 | near | 1 | 1 ins — target `sb $v0,0x6($s0)` vs mine `sb $v0,26($s1)` (same store P1+0x1a; gcc address-CSE picks $s1 base not the recomputed $s0); all else byte-identical | `.run/backlog_drafts/func_801775E0.c` | -| 53 | func_8014FFDC | 134 | struct | 93 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8014FFDC.c` | -| 54 | func_80158638 | 134 | plumbing | 87 | near | 2 | none — MATCH (proxy); callee externs are plain func_, gate's canon/cast passes own them | `.run/backlog_drafts/func_80158638.c` | -| 55 | func_80171FFC | 134 | regalloc-order | 40 | near | 3 | none — MATCH (40 ins). Key: func_8017248C takes (a0,a1); calling it with | `.run/backlog_drafts/func_80171FFC.c` | -| 56 | func_801466F0 | 134 | plumbing | 24 | near | 4 | none — MATCH (struct param-spill + branch-polarity) | `.run/backlog_drafts/func_801466F0.c` | -| 57 | func_80147364 | 134 | remat | 30 | near | 4 | none — MATCH (30 ins). Lever: hoist &D_80126B58 into a local ptr `u8 *p=&D_80126B58;` so gcc | `.run/backlog_drafts/func_80147364.c` | -| 58 | func_801325B8 | 134 | schedule | 113 | near | 4 | 4/113 — prologue save-order of the $s0(cur/p3) vs $s5(p1) pair; gcc emits | `.run/backlog_drafts/func_801325B8.c` | -| 59 | func_80146A6C | 134 | struct | 18 | near | 5 | none — MATCH | `.run/backlog_drafts/func_80146A6C.c` | -| 60 | func_80140D68 | 134 | schedule | 65 | near | 5 | 5-ins near-miss — gcc hoists `lui 0xff00` (the 0xFF000000 mask) one slot too early in the first AddPrim block, so the D_800B9A02 index value lands in $v1 instead of $a1 and *param_1 is read late (idx 35-43). Structure + regs otherwise byte-exact (frame eliminated via struct-array D_800AE7BC, &D_800B9A02 held in $a2 via the pB $6 pin, param_1+8 grouping fixes the rest). Pure sched1 list-order residual -> permuter candidate (try reg-hint + reorder around the lui 0xff00 / lw 0($a0) pair). | `.run/backlog_drafts/func_80140D68.c` | -| 61 | func_80130C08 | 134 | schedule | 65 | near | 5 | tail shares one jal func_80131CA8 between the a1=5 and a1=0x38 arms via `j .L80130CEC` with a DUPLICATED `move a0,s0` (one in the beqz delay slot, one at jump-in label .L80130CDC); goto-merge form collapses to 64 ins (one move dropped), if-else form keeps 65 ins but emits two separate jals (idx 54-56 differ + the recheck branch inverts bnez/beqz at idx 51). 5 mismatched, count correct. | `.run/backlog_drafts/func_80130C08.c` | -| 62 | func_80175820 | 134 | schedule | 55 | near | 6 | body byte-IDENTICAL; only residual is the phantom 0x10 leaf frame — target schedules `addiu $sp,-0x10` into the load-delay slot at insn 26 (after the D_8011F7C0 load) and `addiu $sp,0x10` before `jr ra`. With the frame forced (reserved local + anchor) gcc emits the prologue adjust at insn 0 instead of the delay slot (§5 frame-scheduling class); pins block the permuter, no C lever found to move it. Frameless form left here = body byte-exact, 2 frame insns short. | `.run/backlog_drafts/func_80175820.c` | -| 63 | func_8016130C | 134 | WAVE | 26 | near | 9 | WAVE: 9 mismatch | `.run/backlog_drafts/func_8016130C.c` | -| 64 | func_80161374 | 134 | schedule | 41 | near | 10 | none — MATCH (41/41 relocation-masked) | `.run/backlog_drafts/func_80161374.c` | -| 65 | func_80163764 | 134 | regalloc-order | 42 | near | 10 | none — MATCH (42 ins). pins $s2/$s1/$s0/$s3 + u32 counter (sltiu) + init order s2,s3,i,p | `.run/backlog_drafts/func_80163764.c` | -| 66 | func_80149374 | 134 | remat | 23 | near | 11 | gcc -O2 CSEs &sp18 into freed callee-saved $s0 (1 addu + 2 move); target rematerializes addiu $sp,0x18 twice. Single-buffer straight-line address reused across 2 calls -> CSE wins; no clean C (cast/type/union/ptr-var/$8-pin) flips it; two-distinct-locals remats but grows frame +8 (gcc-2.7.2 won't coalesce slots back to 0x18). Frame/regs/params all match; only this 1 insn differs. | `.run/backlog_drafts/func_80149374.c` | -| 67 | func_80150528 | 134 | schedule | 53 | near | 12 | none — MATCH (53 ins). Modeled on banked sibling DEFINE_func_80163950 (same D_801202A0 stride-0x10C loop + func_80135A4C call); single-pointer for-loop reproduces gcc's two-IV (p, p+0x20) schedule exactly. NB: §20 had flagged this "unsteerable" pre-sibling-exemplar. | `.run/backlog_drafts/func_80150528.c` | -| 68 | func_80146AFC | 134 | schedule | 40 | near | 13 | none — MATCH | `.run/backlog_drafts/func_80146AFC.c` | -| 69 | func_80137178 | 134 | schedule | 78 | near | 15 | reg values all correct; prologue independent-addiu order + lazy sw placement differ | `.run/backlog_drafts/func_80137178.c` | -| 70 | func_8015C030 | 134 | WAVE | 23 | near | 17 | WAVE: 17 mismatch | `.run/backlog_drafts/func_8015C030.c` | -| 71 | func_8014ADE0 | 134 | schedule | 139 | near | 19 | 16 ins off — all compiler-internal ties: (1) 0xAAA8 const lands $v0 vs target $v1; | `.run/backlog_drafts/func_8014ADE0.c` | -| 72 | func_8016191C | 134 | plumbing | 24 | near | 20 | none — MATCH (24 ins). early-return-per-arm: each arm sets $v0 directly + j-tail merges | `.run/backlog_drafts/func_8016191C.c` | -| 73 | func_8014FE60 | 134 | regalloc-order | 95 | near | 20 | none — MATCH (permuter closed the final bothzero-block regalloc/schedule residual: moving `a = in[2]` before the +0x7E read-modify-write flips the 0x7FFF constant into $v1 and computes return-0 in $v0) | `.run/backlog_drafts/func_8014FE60.c` | -| 74 | func_8017248C | 134 | WAVE | 24 | near | 23 | WAVE: 23 mismatch | `.run/backlog_drafts/func_8017248C.c` | -| 75 | func_8014E5B4 | 134 | regalloc-order | 59 | near | 23 | none — MATCH | `.run/backlog_drafts/func_8014E5B4.c` | -| 76 | func_80141B90 | 134 | struct | 29 | near | 24 | none — MATCH (29 ins); array-of-int %lo-fold + call + u16 if-block; volatile-double reserves the target's 8-byte frame slot | `.run/backlog_drafts/func_80141B90.c` | -| 77 | func_80136F3C | 134 | regalloc-order | 61 | near | 24 | 24 pure regalloc-order swaps — identical ins count + every opcode/immediate matches; only $sN indices differ. gcc coalesces param a0 with a0+3 (s0) / a1 with a1+3 (s1); target coalesces a0 with a0-3 (s1) / a1 with a1+3 (s2), base in s3 not s2. Coalescing choice not forceable from clean C (s16 register-pins suppress the sign-ext but reschedule the prologue). Permuter-tractable (register-swap passes). | `.run/backlog_drafts/func_80136F3C.c` | -| 78 | func_801719A4 | 134 | struct | 24 | near | 25 | none — MATCH (24 ins, relocation-masked) | `.run/backlog_drafts/func_801719A4.c` | -| 79 | func_8016706C | 134 | WAVE | 30 | near | 27 | WAVE: 27 mismatch | `.run/backlog_drafts/func_8016706C.c` | -| 80 | func_8014D2A0 | 134 | other | 80 | near | 27 | none — MATCH (80 ins, relocation-masked); loop-guard idiom per engine_core DEFINE_func_80164ACC | `.run/backlog_drafts/func_8014D2A0.c` | -| 81 | func_801777BC | 134 | schedule | 59 | near | 29 | body byte-matches; residual ~3 ins = prologue instruction-scheduling (final `sll t8,16` / `lw param_7` / `addu t0,a0,0xC` ordering around the blez guard) + the loop-counter copy `addu t3,v0` — pure gcc sched/regalloc tie-break, permuter-blocked by the register __asm__ pins | `.run/backlog_drafts/func_801777BC.c` | -| 82 | func_80161888 | 134 | schedule | 37 | near | 30 | none — MATCH (proxy verified) | `.run/backlog_drafts/func_80161888.c` | -| 83 | func_80144B14 | 134 | schedule | 34 | near | 31 | none — MATCH (34 ins). Two stack structs (s16[3] each) passed by addr to | `.run/backlog_drafts/func_80144B14.c` | -| 84 | func_801778A8 | 134 | iv-combine | 38 | near | 38 | gcc spawns 2 IVs (byte giv @+0xc, halfword RMW giv @+0xa); target combines both into ONE IV at +0xc reaching the halfword at -2($a3). A struct collapses to 1 IV but anchors at the struct base (+0xa) not +0xc; raw byte+halfword RMW never combines. Same combine_givs-refuses-halfword-RMW wall as sibling func_80177AD4 (§20, stubbed). Floor 33-off; not source-steerable (combine runs pre-regalloc, pins/order don't move it). | `.run/backlog_drafts/func_801778A8.c` | -| 85 | func_8012A1BC | 134 | schedule | 78 | near | 42 | 42/78 — block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoists all 9 non-block scalar loads to the top then stores 4, blk, blk, then late-stores the rest; a "memory" barrier is needed to stop the block copy hoisting+spilling but it also pins the 5 late scalars' stores too early. No single source/barrier shape reproduces "loads cross the block copy but the copy itself does not" — permuter/schedule residual. | `.run/backlog_drafts/func_8012A1BC.c` | -| 86 | func_80176144 | 134 | regalloc-order | 53 | near | 50 | none — MATCH | `.run/backlog_drafts/func_80176144.c` | -| 87 | func_8016163C | 134 | plumbing | 78 | near | 50 | none — MATCH (78 ins). First arm calls func_801599A4 with NO arg (asm nop delay slot) via fn-ptr cast ((void(*)(void))func_801599A4)(). | `.run/backlog_drafts/func_8016163C.c` | -| 88 | func_801387B8 | 134 | regalloc-order | 100 | near | 50 | the two scanned bytes land in $a0/$a1 not $a1/$a2 (gcc-2.7.2 grabs the freed incoming-arg $a0 for the first load; a $5 register-asm pin is NOT honored on a load-defined arg-class reg, a $6 pin IS — kept pin-free so the permuter can grind it, costing +1) + gcc basic-block layout of the case-7/case-10/default handlers differs; control-flow semantics correct, 50 mismatch | `.run/backlog_drafts/func_801387B8.c` | -| 89 | func_8014F2E0 | 134 | schedule | 66 | near | 51 | §10 IV-init placement (piVar3 setup not sunk past loop guard) + store-vs-load (D_801150D8=0 schedules between the two arg-loads) — both CONFIRMED-unsteerable per cookbook §20; 11-off | `.run/backlog_drafts/func_8014F2E0.c` | -| 90 | func_80161774 | 134 | plumbing | 69 | near | 53 | none — MATCH (69 ins, match_one verified; clean nested-if; param_1 -> $s0 call-crossing) | `.run/backlog_drafts/func_80161774.c` | -| 91 | func_80176D94 | 134 | schedule | 152 | near | 63 | 63/152 — frame+prologue+4 calls+2x(801783D0/801777BC) MATCH (pins $s0=uVar2/$s2=param_2 + CSE-break barrier); residual is GIANT store-block caller-saved temp COLORING ($a2/$a3/$a0/$v1 vs target $t0/$t1/$t2/$a2) + micro-schedule (~70-ins straight line) + 4 delay-slot fills (li a1,4 vs s0-capture). structurally complete, count-exact → permuter/grinder territory. | `.run/backlog_drafts/func_80176D94.c` | -| 92 | func_80177940 | 134 | iv-combine | 101 | near | 65 | prologue+setup (35 ins) byte-match exactly; loop body diverges on gcc loop-invariant hoist ORDERING (scheduler tie-break), the conditional 0x74808080 recompute-vs-hoist, and the tail IV final-value double-move (addu s3,a0,zero; addu v0,s3,zero) + pd+=5 increment placement -- same loop-IV-combine class S20 flags as stub for sibling func_80177AD4. | `.run/backlog_drafts/func_80177940.c` | -| 93 | func_801770E0 | 134 | schedule | 152 | near | 66 | instr-count exact (152); residual = straight-line back-half scheduling + const temp-reg allocation ($t0/$t1/$t2 vs $v1/$a2/$a3) + a 2-ins prologue save-vs-sll swap. register pins ($s2/$s1/$s0) + CSE-break barrier are load-bearing (without pins 133+); permuter blocked by the register __asm__ pins (§10/§17 hard tail). | `.run/backlog_drafts/func_801770E0.c` | -| 94 | func_8014DD8C | 134 | WAVE | 108 | near | 83 | WAVE: 83 mismatch | `.run/backlog_drafts/func_8014DD8C.c` | -| 95 | func_80148094 | 134 | regalloc-order | 213 | near | 107 | ~39/213 residual (LCS), all in the sVar1>=0x201 clamp blocks: $v0/$v1 mflo regalloc swap + coupled branch-polarity/join-placement (bnez<->beqz) + 2 delay-slot fills (addiu s1,v0,0x400 into 80013F3C slot; sll s1,16 in-place into 2nd ratan2 slot) + early_ret a2-vs-s5 -> permuter/grinder territory | `.run/backlog_drafts/func_80148094.c` | -| 96 | func_80137DD4 | 134 | regalloc-order | 129 | near | 112 | opcodes/structure line-for-line correct, but gcc permutes the 6 saved regs vs target | `.run/backlog_drafts/func_80137DD4.c` | -| 97 | func_8014EA4C | 134 | loop-guard | 183 | near | 142 | body byte-identical; residual is the §20 IV-final-value loop guard — target emits an | `.run/backlog_drafts/func_8014EA4C.c` | -| 98 | func_801412A8 | 134 | regalloc-order | 198 | near | 154 | 154-mismatch near-miss (198/198 ins, structure+branches exact). Two irreducible gcc residuals: (1) HEAD: held &D_800B9A02 ptr must be init-at-decl to stay in a reg across all 4 prims (correct 198-ins), but that forces gcc to materialize the address at fn entry (2 ins before the branches) vs target's in-body materialization -> shifts the head regalloc cascade; in-body assign re-materializes per-use (172 ins, wrong count) even with the $9 pin. (2) BODY: gcc OFFSET-FOLDS the 4x-unrolled prim stores (p[0..3], p+=4 -> sw at 16/20/24/28 from a fixed base) instead of ADVANCING $t6 (addiu $t6,0x10; sw at 0/4/8/12) like the target; no C form (post-inc, char* advance, =r/0 barrier, r-only barrier) triggers the register-advance. Pins landed p1->$t6/uVar4->$t0/iVar1->$a0/pidx->$t1 (head 0-1,8,14,16-19 exact). | `.run/backlog_drafts/func_801412A8.c` | -| 99 | func_801571C4 | 134 | schedule | 198 | near | 183 | prologue instruction SCHEDULE + frame-layout residual. Body + loop are byte-exact and | `.run/backlog_drafts/func_801571C4.c` | -| 100 | func_8014EE14 | 134 | schedule | 248 | near | 205 | body structurally matched (97 reloc-masked, mostly +1-offset branch artifacts). 3 real residuals, | `.run/backlog_drafts/func_8014EE14.c` | -| 101 | func_801745AC | 134 | plumbing | 12 | failed | | none — MATCH (stub: param saved in $s0 across first call, passed to second) | `.run/backlog_drafts/func_801745AC.c` | -| 102 | func_801705C0 | 134 | WAVE | 14 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801705C0.c` | -| 103 | func_8016B91C | 134 | WAVE | 18 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8016B91C.c` | -| 104 | func_80156600 | 134 | other | 18 | failed | | none — MATCH (simple counted scan, do-while form per Ghidra-C) | `.run/backlog_drafts/func_80156600.c` | -| 105 | func_801718AC | 134 | WAVE | 22 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801718AC.c` | -| 106 | func_80168B70 | 134 | WAVE | 27 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80168B70.c` | -| 107 | func_8016BA68 | 134 | plumbing | 29 | failed | | none — MATCH (29 ins, straight-line; lh narrow loads at call site) | `.run/backlog_drafts/func_8016BA68.c` | -| 108 | func_801494CC | 134 | WAVE | 30 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801494CC.c` | -| 109 | func_801708B0 | 134 | WAVE | 30 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801708B0.c` | -| 110 | func_80170CF0 | 134 | schedule | 30 | failed | | 4-ins PROLOGUE-ORDER residual (body insns 4-29 byte-identical). My cc1 hoists the funcptr lui/lw ABOVE the frame setup (lui,lw,addiu sp,sw s0); target keeps frame setup first (addiu sp,sw s0,lui,lw). Same prologue-order class as func_80177F84 (cookbook L1332) — no C lever found (intermediate var/cast/void*-vs-funcptr/pin/early-ptr all reproduce the hoist; barriers/empty-asm/volatile-local regress). KEY WIN: `case 0: break;` forces emit_case_nodes' slti<2;bnez→default lower-bound prune, exactly matching the target dispatch tree (a bare 2-case switch omits it). | `.run/backlog_drafts/func_80170CF0.c` | -| 111 | func_80149450 | 134 | WAVE | 31 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80149450.c` | -| 112 | func_80149F2C | 134 | WAVE | 31 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80149F2C.c` | -| 113 | func_80161A90 | 134 | other | 34 | failed | | none — MATCH (34 ins) at the overlay's STANDARD -O2 (match_one reports MATCH). NO -O1 split needed. | `.run/backlog_drafts/func_80161A90.c` | -| 114 | func_80152C80 | 134 | plumbing | 41 | failed | | none — MATCH expected (linear call/store sequence, no regalloc tension) | `.run/backlog_drafts/func_80152C80.c` | -| 115 | func_80173BC0 | 134 | plumbing | 41 | failed | | none — MATCH. Keys: invert mask branch (else-block = 80174650 path so func_8013E588 | `.run/backlog_drafts/func_80173BC0.c` | -| 116 | func_8014C1C8 | 134 | regalloc-order | 44 | failed | | none — MATCH (match_one 44/44 ins, relocation-masked) | `.run/backlog_drafts/func_8014C1C8.c` | -| 117 | func_80146750 | 134 | regalloc-order | 47 | failed | | none — MATCH (match_one 47/47; psVar4->$a3 / psVar3->$v1 pins forced the init order) | `.run/backlog_drafts/func_80146750.c` | -| 118 | func_8014680C | 134 | struct | 47 | failed | | none — MATCH (47 ins, relocation-masked) | `.run/backlog_drafts/func_8014680C.c` | -| 119 | func_8014C4AC | 134 | other | 47 | failed | | none — MATCH (shared-ret0 goto §16 flips final branch polarity + schedules ret=0 into delay slot; memcpy(t0+0x7C,a3,8) inlines the lwl/lwr/swl/swr 8-byte block §21; param_1 = unsigned short* for the lhu reads) | `.run/backlog_drafts/func_8014C4AC.c` | -| 120 | func_80151B98 | 134 | regalloc-order | 47 | failed | | none — MATCH | `.run/backlog_drafts/func_80151B98.c` | -| 121 | func_80147F78 | 134 | schedule | 48 | failed | | TWO residuals remain. (1) FRAME: target frame is 0x60 = exactly 64 bytes (16 words) of LIVE local vars on top of the 4 saved regs (s0,s1,s2,ra) + 0x10 arg area; my body has no locals so frame is 0x20. Reproducing 64B of live local needs an address-escaped local buffer, but the target has only the 3 visible jals (no 4th call to receive &buf), so I cannot make a 16-word local survive -O2 dead-store-elim without emitting an extra instruction. (2) RELOAD SCHEDULE: target reloads D_80127090/94/98 from memory (folded lui%hi;lw%lo) with the FIRST reload HOISTED up between store90 and store94 (free non-volatile scheduling); a "memory" clobber barrier (below) forces the folded reloads but pins them strictly AFTER all three stores. The natural source is almost certainly a 16-word local buffer that ALIASES the globals (non-volatile reloads, freely scheduled) — same construct that also explains the 0x60 frame. Closest faithful body kept below; folded reload bytes are correct, frame + hoist are the gap. | `.run/backlog_drafts/func_80147F78.c` | -| 122 | func_80151C54 | 134 | plumbing | 52 | failed | | none — MATCH (52 ins). Branch-polarity §3-T4: BD60 arm is fall-through (if !=1 && ==0x11), BC44 is else. | `.run/backlog_drafts/func_80151C54.c` | -| 123 | func_8017129C | 134 | struct | 58 | failed | | none — MATCH (58 ins); three aligned 16-byte block-copies via struct assignment (cookbook §21) | `.run/backlog_drafts/func_8017129C.c` | -| 124 | func_80173A60 | 134 | regalloc-order | 59 | failed | | none — MATCH (59 ins) | `.run/backlog_drafts/func_80173A60.c` | -| 125 | func_8014A738 | 134 | regalloc-order | 62 | failed | | none — MATCH | `.run/backlog_drafts/func_8014A738.c` | -| 126 | func_80175308 | 134 | struct | 67 | failed | | none — MATCH (67 ins, relocation-masked) | `.run/backlog_drafts/func_80175308.c` | -| 127 | func_80132F40 | 134 | regalloc-order | 72 | failed | | gcc gives src (sp+0x10) a 5th saved reg ($s3, frame 0x38 not 0x40); target rematerializes | `.run/backlog_drafts/func_80132F40.c` | -| 128 | func_8014D610 | 134 | plumbing | 74 | failed | | none — MATCH (74 ins). for-loop + continue, single IV pointer p; gcc derives the $s0 = p+0x75 second induction var. Template: DEFINE_func_80163950 (sibling, same D_801202A0 loop + func_80135A4C). | `.run/backlog_drafts/func_8014D610.c` | -| 129 | func_80163534 | 134 | schedule | 76 | failed | | mismatch=13, a single 1-position scheduling tie. Instrs 1-30 byte-perfect; all registers correct | `.run/backlog_drafts/func_80163534.c` | -| 130 | func_8014CF04 | 134 | struct | 82 | failed | | none — MATCH (82 ins; array-of-struct scan, for-loop over Ent D_801202A0[96], stride 0x10C) | `.run/backlog_drafts/func_8014CF04.c` | -| 131 | func_80156670 | 134 | schedule | 83 | failed | | none — MATCH (83 ins). Key: hoist `iVar1 = uVar3*4;` as its OWN statement before the if so gcc schedules `sll v1,s1,2` into the bnez delay slot (computed unconditionally) and reuses v1 index-first (`iVar1 + (s32)&D_801150E0` → `addu v0,v1,v0`). 13-arg call to func_80157158 (a0-a3 + 9 stack args at 0x10..0x30); param_2/param_3 cast (u16) → andi; param_6 incoming as lhu(u16). Address args = integer math `iVar2 + (s32)&D_x` (index-first → lui;addiu;addu, index added first). | `.run/backlog_drafts/func_80156670.c` | -| 132 | func_8014D4C0 | 134 | schedule | 84 | failed | | none — MATCH (goto forces if-body out-of-line/last; `>=` fixes slt operand order) | `.run/backlog_drafts/func_8014D4C0.c` | -| 133 | func_8016A73C | 134 | struct | 85 | failed | | none — MATCH (85 ins, relocation-masked) | `.run/backlog_drafts/func_8016A73C.c` | -| 134 | func_80173CB4 | 134 | schedule | 90 | failed | | none — MATCH (switch form keeps cases unmerged; final block: reuse one temp for the D_8012750C test + the func_8013767C result -> $a0 alloc; invert if to !=0 for branch polarity + store order) | `.run/backlog_drafts/func_80173CB4.c` | -| 135 | func_8014C6F4 | 134 | regalloc-order | 91 | failed | | 19-off loop tie-break — target compiles the search as a while/for (pre-guard sltu;beqz present) with the found pointer snapshotted to $v0 split from the IV in $a0 and the +4 sunk into both call-arg delay slots; do-while is instruction-count-exact (91=91) but lacks the pre-guard, while every for/while form costs +4 ins (merge stays in $a0). §10 schedule/regalloc residual. | `.run/backlog_drafts/func_8014C6F4.c` | -| 136 | func_8014D12C | 134 | schedule | 93 | failed | | none — MATCH (93 ins). Block-order lever: success-continuation (return 1) | `.run/backlog_drafts/func_8014D12C.c` | -| 137 | func_801502EC | 134 | schedule | 93 | failed | | none — MATCH (93 ins). 8-byte block copy via alignment-1 struct (Blk8{u8 b[8]}) assignment reproduces the lwl/lwr/swl/swr; ret=0 hoisted before the block copy to fix the s3-vs-ra prologue save order. | `.run/backlog_drafts/func_801502EC.c` | -| 138 | func_80150170 | 134 | struct | 95 | failed | | none — MATCH (95/95). Keys: (1) two parallel 3-halfword groups via chained assign `sp10.x = sp18.x = v` (sp18 inner so 0x18 stores first); (2) align-1 blk8 struct copy for the lwl/lwr/swl/swr 8-byte copy into actor+0x80 (src = sp buf from func_801502EC, or u8[] D_801152A8); (3) f0/f2 = u16 (lhu), f1 = s16 (lh for the slt); (4) `(iVar5/iVar6)!=0` single-OR test + branch-polarity invert (not-both-zero is fall-through); (5) both-zero tail register pins: 0x7fff -> $v1 (`register s32 __asm__("$3")`), sp10.f0/f2 -> reused $a0 (`register u32 __asm__("$4")` written twice) to force gcc's hoist-load + reg reuse schedule. | `.run/backlog_drafts/func_80150170.c` | -| 139 | func_8014CD80 | 134 | regalloc-order | 97 | failed | | none — MATCH (97 ins). iVar3 pinned to $v1 (register __asm__("$3")) so | `.run/backlog_drafts/func_8014CD80.c` | -| 140 | func_8014E284 | 134 | WAVE | 108 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8014E284.c` | -| 141 | func_80167540 | 134 | WAVE | 117 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80167540.c` | -| 142 | func_8014F4C0 | 134 | WAVE | 141 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8014F4C0.c` | -| 143 | func_8014E048 | 134 | WAVE | 143 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8014E048.c` | -| 144 | func_80155800 | 134 | WAVE | 145 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80155800.c` | -| 145 | func_80144090 | 134 | schedule | 154 | failed | | corner-block store/CSE schedule — gcc groups P+2/P-2 (share s>>6) vs target alternates P+2,P+4,P-2,P+0; plus otz*4 (sll $a0,$s5,2) scheduled late not into the D_800B9A02-load delay slot. Structure/regalloc all match (pins+array-of-struct %lo-fold+branch-polarity+mult-grouping landed; 144->52). Residual is §10 schedule tie-break, not source-steerable. | `.run/backlog_drafts/func_80144090.c` | -| 146 | func_80138ED0 | 134 | GIANT | 159 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 147 | func_8014F74C | 134 | other | 174 | failed | | none — MATCH (174 ins). Keys: sibling func_8014FA70 template; in/out/sp20 u8[8] short-trio bufs (lwl/lwr/swl/swr unaligned copies); load each a0 field once into b0/b1/b2 (stored to both sp20+out, reused in the 0x146-add block); 3-way memcpy branch on s1 (0x2000->D_801152A8, 0x4000->D_801152B0, else->D_800D3918); goto-form cmp-chain; final `""::: "memory"` barrier blocks gcc store-flag fold of (in4==out4)<<15 back to a branch | `.run/backlog_drafts/func_8014F74C.c` | -| 148 | func_8012EC04 | 134 | GIANT | 178 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 149 | func_801392FC | 134 | GIANT | 182 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 150 | func_8013AF20 | 134 | GIANT | 185 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 151 | func_8012D098 | 134 | GIANT | 189 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 152 | func_80129CF8 | 134 | GIANT | 191 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 153 | func_8013A530 | 134 | GIANT | 204 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 154 | func_801372B0 | 134 | GIANT | 207 | failed | | won't compile standalone (loose-typing / missing decl) | | -| 155 | func_80156B74 | 134 | struct | 214 | failed | | none — MATCH | `.run/backlog_drafts/func_80156B74.c` | -| 156 | func_80144B9C | 134 | other | 770 | failed | | -O0 cluster fn (prologue 21F0A003, fp-frame, all locals spilled+reloaded, load-delay nops). match_one compiles -O2 so it CANNOT match this; needs its own per-file -O0 split (Makefile CC1FLAGS:=-O0), like ov_SC01_077_o0.c. Body below is the faithful -O0 source; gate via whole-binary -O0 build only. | `.run/backlog_drafts/func_80144B9C.c` | -| 157 | func_80151944 | 4 | struct | 15 | near | 0 | none — MATCH (fn-pointer table dispatch; array-of-ptr indexing folds %lo) | `.run/backlog_drafts/func_80151944.c` | -| 158 | func_8016039C | 2 | struct | 15 | near | 1 | none — MATCH (function-pointer table dispatch indexed by unsigned-halfword field) | `.run/backlog_drafts/func_8016039C.c` | -| 159 | func_8015CC74 | 2 | struct | 15 | failed | | none — MATCH (analog func_8015BE38 idiom: D_80189354[a0->idx]() with Obj.idx at off 2) | `.run/backlog_drafts/func_8015CC74.c` | -| 160 | func_8015DAF8 | 1 | struct | 15 | near | 0 | none — MATCH (proxy); identical idiom to matched func_8016901C in same overlay | `.run/backlog_drafts/func_8015DAF8.c` | -| 161 | func_801577C8 | 1 | plumbing | 16 | near | 0 | none — MATCH expected (scalar global store + two sequential calls, param preserved across first call) | `.run/backlog_drafts/func_801577C8.c` | -| 162 | func_80178B70 | 1 | struct | 18 | near | 0 | none — MATCH; local ptr p=&D_8018A458 used for store AND (int)p-0xC arg forces $s0-base reuse across call1, param_1 into $s1 | `.run/backlog_drafts/func_80178B70.c` | -| 163 | func_8017F240 | 1 | regalloc-order | 20 | near | 0 | none — MATCH (base &D_801270D0 pinned to $s0 holds across call; one lui/addiu reused for load+store) | `.run/backlog_drafts/func_8017F240.c` | -| 164 | func_80157D20 | 1 | plumbing | 21 | near | 0 | none — MATCH expected (call, indexed u16-global load as 2nd arg, then call; param_1 saved across all three calls) | `.run/backlog_drafts/func_80157D20.c` | -| 165 | func_80163408 | 1 | struct | 21 | near | 0 | local 8-byte struct copied from D_801D8BB0, © passed as 5th arg (s32) | `.run/backlog_drafts/func_80163408.c` | -| 166 | func_80175184 | 1 | struct | 21 | near | 0 | none — MATCH (fnptr-array %lo-fold dispatch; idx = *(u16*)(a0+2) < 2 ? D_8018A1A4[idx]() : func_80175268()) | `.run/backlog_drafts/func_80175184.c` | -| 167 | func_8014FBC0 | 1 | schedule | 22 | near | 0 | none — MATCH (22 ins). Stack-switch primitive: register $sp var, manual save/switch/restore around the call. | `.run/backlog_drafts/func_8014FBC0.c` | -| 168 | func_80178B18 | 1 | other | 22 | near | 0 | none — MATCH | `.run/backlog_drafts/func_80178B18.c` | -| 169 | func_8017B8E8 | 1 | plumbing | 22 | near | 0 | none — MATCH (two inlined unaligned 8-byte memcpy blocks: src[0..7]->D_801DA794, src[8..15]->D_801DA78C) | `.run/backlog_drafts/func_8017B8E8.c` | -| 170 | func_80182988 | 1 | plumbing | 22 | near | 0 | none — MATCH (u16 store of 0xAA10 forces ori, not sign-extended addiu) | `.run/backlog_drafts/func_80182988.c` | -| 171 | func_801609B8 | 1 | struct | 28 | near | 0 | none — MATCH (pending byte-gate); function-pointer table %lo-fold via extern array | `.run/backlog_drafts/func_801609B8.c` | -| 172 | func_8017E224 | 1 | struct | 29 | near | 0 | none — MATCH (unaligned 8-byte memcpy of global onto stack + cond byte incr) | `.run/backlog_drafts/func_8017E224.c` | -| 173 | func_80165140 | 1 | regalloc-order | 30 | near | 0 | none — MATCH (pin i=$v1/eight=$a0/p=$a2; DON'T pin param — let it self-copy to $a3 first; memcpy 8/4 unaligned) | `.run/backlog_drafts/func_80165140.c` | -| 174 | func_801549F8 | 1 | iv-combine | 31 | near | 0 | none — MATCH (31 ins). Re-tie barrier on the index defeats gcc's pointer-giv | `.run/backlog_drafts/func_801549F8.c` | -| 175 | func_8015E698 | 1 | struct | 31 | near | 0 | none — MATCH (clean -O2 reconstruction; table-of-fnptr indexed by param_1[0]) | `.run/backlog_drafts/func_8015E698.c` | -| 176 | func_8017D98C | 1 | plumbing | 31 | near | 0 | none — MATCH (expected): straight global stores + tail call; const 0x140 reused for two halves | `.run/backlog_drafts/func_8017D98C.c` | -| 177 | func_80182268 | 1 | struct | 31 | near | 0 | none — MATCH (jump-table switch over sign-extended high byte of *(u16*)(a0+0x70); case4 decrements D_801270CC then falls into case3/7's func_8012C218; no default) | `.run/backlog_drafts/func_80182268.c` | -| 178 | func_801602A4 | 1 | struct | 34 | near | 0 | none — MATCH (template = matched twin func_801601E4; lhu+0x8000 == compare, fnptr-table dispatch D_801891B8[*(u16*)a0]() no-arg, then 3-call setup in target order; func_80161208 in else) | `.run/backlog_drafts/func_801602A4.c` | -| 179 | func_801734BC | 1 | struct | 34 | near | 0 | none — MATCH (pending byte-gate); switch-jtbl with no default, 3 short stores + fnptr call | `.run/backlog_drafts/func_801734BC.c` | -| 180 | func_8017D900 | 1 | plumbing | 35 | near | 0 | none — expect MATCH (STUB: ordered global stores + single tail call, sibling of func_8017D840) | `.run/backlog_drafts/func_8017D900.c` | -| 181 | func_8016BEA0 | 1 | other | 37 | near | 0 | none — MATCH (expected) | `.run/backlog_drafts/func_8016BEA0.c` | -| 182 | func_801754A8 | 1 | regalloc-order | 37 | near | 0 | none — MATCH (37 ins, relocation-masked proxy) | `.run/backlog_drafts/func_801754A8.c` | -| 183 | func_80160920 | 1 | struct | 38 | near | 0 | none — MATCH (function-pointer table folds %lo via extern array indexed by halfword) | `.run/backlog_drafts/func_80160920.c` | -| 184 | func_80183BAC | 1 | struct | 41 | near | 0 | switch jump-table dispatch (jtbl_801D9420); verifying case grouping 0,1,2,5,6/3,7/4 emits the target table + tail | `.run/backlog_drafts/func_80183BAC.c` | -| 185 | func_80183C50 | 1 | struct | 41 | near | 0 | none — MATCH (cross-jump exploit §cookbook L1543: dup func_8012C218 into case3/7 + case4 → merged jal;nop) | `.run/backlog_drafts/func_80183C50.c` | -| 186 | func_8015DF34 | 1 | struct | 44 | near | 0 | none — MATCH (clean structural; fn-ptr table via array index folds %lo) | `.run/backlog_drafts/func_8015DF34.c` | -| 187 | func_8015FE70 | 1 | struct | 44 | near | 0 | none — MATCH expected (fn-ptr-table dispatch + ushort struct fields) | `.run/backlog_drafts/func_8015FE70.c` | -| 188 | func_8014358C | 1 | regalloc-order | 45 | near | 0 | none — MATCH (relocation-masked match_one) | `.run/backlog_drafts/func_8014358C.c` | -| 189 | func_80183AF0 | 1 | regalloc-order | 47 | near | 0 | none — MATCH (mask pinned $a1/$5 + p pinned $v0/$2; switch w/ distributed func_8012C218 tail via dup calls + cross-jump merge) | `.run/backlog_drafts/func_80183AF0.c` | -| 190 | func_80178BF8 | 1 | plumbing | 49 | near | 0 | none — MATCH (pure scalar-store + two pointer-decrement do-while loops) | `.run/backlog_drafts/func_80178BF8.c` | -| 191 | func_8015E344 | 1 | struct | 50 | near | 0 | none — MATCH (pending whole-binary gate); fn-ptr table folds %lo via extern array, 0x234 single word store | `.run/backlog_drafts/func_8015E344.c` | -| 192 | func_8017EC7C | 1 | struct | 52 | near | 0 | none — MATCH (52 ins, relocation-masked) | `.run/backlog_drafts/func_8017EC7C.c` | -| 193 | func_80183CF4 | 1 | struct | 57 | near | 0 | none — MATCH (clean switch + jtbl; orchestrator owns jtbl/rodata migration) | `.run/backlog_drafts/func_80183CF4.c` | -| 194 | func_8015D01C | 1 | regalloc-order | 58 | near | 0 | none — MATCH | `.run/backlog_drafts/func_8015D01C.c` | -| 195 | func_8016D688 | 1 | struct | 60 | near | 0 | none — MATCH (byte array D_801D9C20[] folds the &D_801D9C21 base/-1 offsets; emit p+0xE store BEFORE the param+2 increment so the lhu fills the load-delay slot in $v1) | `.run/backlog_drafts/func_8016D688.c` | -| 196 | func_801842C8 | 1 | plumbing | 62 | near | 0 | none — MATCH | `.run/backlog_drafts/func_801842C8.c` | -| 197 | func_80165240 | 1 | regalloc-order | 63 | near | 0 | none — MATCH (63 ins). buf pinned to $s2 (register __asm__("$18")) so it stays in a callee-saved reg; param_3 then naturally lands in $s3. memcpy(buf+0x30,param_3,4) -> lwl/lwr+swl/swr unaligned 4B copy (cookbook §1 mem->mem). array-of-u8 buf with explicit *(T*)(buf+off) stores; mtx[0x20] declared 2nd so it lands at sp+0x50, buf_ at sp+0x10. | `.run/backlog_drafts/func_80165240.c` | -| 198 | func_8017BB34 | 1 | struct | 65 | near | 0 | none — MATCH (65 ins). Keys: (1) align-1 {s8 b[8]} struct so the two 8-byte copies emit lwl/lwr; (2) stack-local declaration order = target frame order (svin@0x10, buf@0x18, out@0x38, local8@0x40, rt_in@0x48, rt_out@0x50) — reordering the locals to ascending offset fixed all 23 offset-only diffs. | `.run/backlog_drafts/func_8017BB34.c` | -| 199 | func_8016BD78 | 1 | regalloc-order | 74 | near | 0 | none — MATCH (lazy pointer locals pa=&BC4, pb=&BC8 assigned at first use → $a1/$a2 held thru middle code as final call args; middle bytes BC5/BC6/BC9/BCA direct global) | `.run/backlog_drafts/func_8016BD78.c` | -| 200 | func_8016E7C8 | 1 | regalloc-order | 74 | near | 0 | none — MATCH (match_one 74/74; pins $18=&prim, $19=param_3 fixed s2/s3 alloc order; Work struct sized to 0x20) | `.run/backlog_drafts/func_8016E7C8.c` | -| 201 | func_80161D20 | 1 | struct | 14 | near | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` | -| 202 | func_8015FAAC | 1 | struct | 15 | near | 1 | none — MATCH expected; fn-ptr table indexed by u16 field at +2, *4 scaled load then jalr | `.run/backlog_drafts/func_8015FAAC.c` | -| 203 | func_8016084C | 1 | struct | 15 | near | 1 | none — MATCH (jump-table dispatch via array-of-fn-ptr %lo-fold) | `.run/backlog_drafts/func_8016084C.c` | -| 204 | func_8017F714 | 1 | plumbing | 27 | near | 1 | none — MATCH (27/27 ins, match_one verified) | `.run/backlog_drafts/func_8017F714.c` | -| 205 | func_80142A10 | 1 | struct | 28 | near | 1 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_80142A10.c` | -| 206 | func_80161C24 | 1 | struct | 29 | near | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` | -| 207 | func_80184C0C | 1 | struct | 48 | near | 1 | none — MATCH (array-of-struct %lo-fold for &D_8018AEB8[idx], stride 0x34) | `.run/backlog_drafts/func_80184C0C.c` | -| 208 | func_8016B4F8 | 1 | regalloc-order | 50 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8016B4F8.c` | -| 209 | func_801803B0 | 1 | other | 51 | near | 1 | none — MATCH expected; simple if/else, no call-crossing locals beyond param in $s0 | `.run/backlog_drafts/func_801803B0.c` | -| 210 | func_8015FBE0 | 1 | schedule | 58 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8015FBE0.c` | -| 211 | func_801809BC | 1 | schedule | 70 | near | 2 | 2-ins prologue swap: `sw $ra,0x30` vs `addiu $a0,$s0,4` (first call-arg setup) adjacent, no data dep — pure ra-save scheduling; everything else byte-identical (70/70 ins). pins+a1-anchor fixed regalloc+s1-order+branch-polarity. | `.run/backlog_drafts/func_801809BC.c` | -| 212 | func_80171B4C | 1 | schedule | 70 | near | 3 | 3-off in the tail only (body+prologue MATCH via $s1 pin on arg1). gcc fills the | `.run/backlog_drafts/func_80171B4C.c` | -| 213 | func_80140E6C | 1 | schedule | 37 | near | 4 | 4 ins — each save-across-call copy (move s1,v0 / move s0,v0) should fill the NEXT jal's delay slot (target) but gcc-2.7.2 sched ties the copy with the next call's arg-setup at priority 2 and the LUID tie-break (rank_for_schedule) keeps the copy first, so reorg fills the slot with the arg-setup instead; no C reshape found that flips the LUID/priority order without breaking the OR-chain regalloc. | `.run/backlog_drafts/func_80140E6C.c` | -| 214 | func_8017EF50 | 1 | schedule | 53 | near | 5 | 5 ins — gcc-2.7.2 instr-scheduler load-order tie-breaks. Branch region + cross-jump-break (t14 pin to $3) + 0x34/0x30 hoist (c34 pin $5, c2c pin $3) all MATCH. Residual: (a) header 0x10-load vs 0x2c-load order swap; (b) compare loads 0x36-before-0xA and puts 0xA in $a1 not $a2 (slt operand reg differs). Both clusters resist source steering — every fix to one perturbs the pinned header schedule. | `.run/backlog_drafts/func_8017EF50.c` | -| 215 | func_8017F114 | 1 | schedule | 75 | near | 5 | block-order swap of 0x7F(.L1C8) vs elem3(.L1C0) cold blocks; gcc-2.7.2 BB placement (permuter-class) | `.run/backlog_drafts/func_8017F114.c` | -| 216 | func_8014D3E0 | 1 | other | 22 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8014D3E0.c` | -| 217 | func_8013CF68 | 1 | schedule | 63 | near | 6 | blocks 2&3 delay-slot fill — gcc picks dead-reg $v1(b0,0x10/0x20) store for the jal delay slot; target picks arg-reg $a3(0x12/0x22). 6 ins (2 rotations); not flippable by source store-order/interleave/barrier (all tested); permuter/scheduler-internal lever needed. Prologue, $s0 fold, regalloc, block-1 all exact. | `.run/backlog_drafts/func_8013CF68.c` | -| 218 | func_8017B940 | 1 | struct | 63 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8017B940.c` | -| 219 | func_80164E40 | 1 | struct | 25 | near | 8 | none — MATCH expected; byte 0 keeps base $v1 (reused by final lw word), bytes 1/2 standalone | `.run/backlog_drafts/func_80164E40.c` | -| 220 | func_8016E9EC | 1 | schedule | 53 | near | 11 | 11 left — all GNU scheduler/canon tie-breaks (regs all match via pins): (a) prologue hoists `addiu a1,0x1C` into the save block; (b) first lbu reads $a0 not $s1 (incoming-arg still live); (c) iCopy copy `addu s4,s0` lands early (scheduler) vs target's func_800D2CA8 delay-slot; (d) `addu a2,s2,s3` vs target `s3,s2` commutative-canon (unflippable w/o breaking load order). Permuter can't run (register __asm__ pins rejected, cookbook §5a). | `.run/backlog_drafts/func_8016E9EC.c` | -| 221 | func_8017EB2C | 1 | regalloc-order | 69 | near | 11 | cond?2:1 call-arg: gcc computes into $v0 then move->$a0 (or pin->$a0 forces move v0,a0 to evac param_1); target reuses $a0 sequentially (andi a0 -> addiu a0) with a sw-s0-in-delay j-island. Body (idx14+) byte-perfect. | `.run/backlog_drafts/func_8017EB2C.c` | -| 222 | func_80156044 | 1 | struct | 74 | near | 12 | none — MATCH (74 ins, relocation-masked); $s2-pin for u16-return + def-mask + 3-arg cast on func_80156848 | `.run/backlog_drafts/func_80156044.c` | -| 223 | func_80161CD0 | 1 | regalloc-order | 20 | near | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` | -| 224 | func_80158FA4 | 1 | schedule | 51 | near | 17 | target keeps a DEAD `sra $a1,$v0,16` before `beqz $a1` (sign-extend of func_80159464's | `.run/backlog_drafts/func_80158FA4.c` | -| 225 | func_8018301C | 1 | plumbing | 28 | near | 24 | none — MATCH (straight-line, statement-order; verify with match_one) | `.run/backlog_drafts/func_8018301C.c` | -| 226 | func_8016BBE0 | 1 | other | 56 | near | 24 | none — straightforward; expect MATCH (mirror Ghidra-C order, synth_mult ×0x555) | `.run/backlog_drafts/func_8016BBE0.c` | -| 227 | func_8016E95C | 1 | regalloc-order | 36 | near | 25 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_8016E95C.c` | -| 228 | func_8015094C | 1 | schedule | 73 | near | 33 | gcc jump-opt collapses the target's explicit `j`-to-shared-merge layout (cross-jump | `.run/backlog_drafts/func_8015094C.c` | -| 229 | func_80148E54 | 1 | regalloc-order | 67 | near | 40 | 67/67 ins, structure+branches+block-order+body-reload all match; residual is pure register-allocation order (permuter-eligible, no register-pins). (1) masked first-angle folds andi->$s1; target keeps it in $a0 then copies addu $s1,$a0 lazily into the beq delay-slot (the s1-copy schedules 1 slot later). (2) the 0x80 const is CSE-held in $a2 across both test+body; target re-materializes 0x80 in $v0 per block (it gets clobbered by `srl v0,v1,8`), which both renames the compare regs ($v0 not $a2) AND fills the body's reload load-delay slot (mine emits a nop there). (3) single-exit ret funnels $v1->$v0 (move v0,v1) where target writes $v0 directly. All three are gcc regalloc/value-prop tie-breaks no C reshape steered (tried: $v0 pin, temp-split, low-mask-reuse compare, memory-clobber-vs-volatile reload) — leave for the permuter. | `.run/backlog_drafts/func_80148E54.c` | -| 230 | func_80148AFC | 1 | regalloc-order | 71 | near | 48 | 1 real ins off — target keeps masked angle in caller-saved $a1 (andi $a1) then copies addu $s1,$a1 into the first beq delay slot; gcc coalesces it direct to $s1 (andi $s1) + fills delay with slti. Copy-coalescing tie-break (cookbook §20 hoist-vs-remat): resists barriers/pins($s1,$a1)/u16/reorder/split-mask. Everything else byte-exact (prologue identical thru 0x40; both bodies out-of-line via trailing-goto layout; slti via s32 type from lbu; BB4/BD0 double-load+reload via early-return main block). | `.run/backlog_drafts/func_80148AFC.c` | -| 231 | func_8017B0E4 | 1 | other | 61 | near | 51 | none — MATCH (expected; clean six-call sign-extend-store pattern) | `.run/backlog_drafts/func_8017B0E4.c` | -| 232 | func_80166F58 | 1 | schedule | 69 | near | 55 | regs/loop/logic/%lo-fold all match (pinned $s0-$s6); residual is reorg.c delay-slot fill — target replicates `addiu $v0,$s2,1` into the 3 skip-branch delay slots + commits `addu $s2,$v0,0` at merge (my codegen emits in-place `addiu $s2,$s2,1` w/ nop slots, -1 ins); plus prologue short-arg promote-then-move not fusing (`sra $a1;addu $s4,$a1,0` vs my fused `sra $s4,$a1`). Not source-steerable (pins block permuter). | `.run/backlog_drafts/func_80166F58.c` | -| 233 | func_80177DA8 | 1 | remat | 63 | near | 58 | gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader — a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target. | `.run/backlog_drafts/func_80177DA8.c` | -| 234 | func_801800F8 | 1 | schedule | 73 | near | 62 | body+frame(0x28)+addu-order all MATCH; sole residual = `move $a0,$v0` (func_8001C214 | `.run/backlog_drafts/func_801800F8.c` | -| 235 | func_80160B34 | 1 | struct | 15 | failed | | none — MATCH | `.run/backlog_drafts/func_80160B34.c` | -| 236 | func_80182338 | 1 | other | 26 | failed | | none — straight-line init; rely on gcc scheduler to hoist $a1/$v0=6 into prologue/delay-slot | `.run/backlog_drafts/func_80182338.c` | -| 237 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` | -| 238 | func_8015E018 | 1 | loose-typing | 47 | failed | | none — MATCH (signed char forces lbu+sll24/sra24 sign-extend; default char is unsigned in this toolchain) | `.run/backlog_drafts/func_8015E018.c` | -| 239 | func_80159A20 | 1 | struct | 58 | failed | | none — MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT — positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block — matching the target layout). | `.run/backlog_drafts/func_80159A20.c` | -| 240 | func_8013E958 | 1 | schedule | 63 | failed | | 2 ins swapped — cc1 emits `andi 0x7f; andi 0xff; beqz`(tests doubly-masked) but target wants `andi 0x7f; beqz; andi 0xff`(andi 0xff in the first beqz delay slot). Loop fully byte-matches; struct/ptr fold idioms nailed (D_80115110.q[0x16] hoists base+0x58 disp, Cell D_80115188[i].v folds %lo). func_800D0488 takes (m&0xFF) arg. s16 m -> 2 mism (right ins count); s32 m fixes order but merges andi+arg-move (62 ins, 1 short). | `.run/backlog_drafts/func_8013E958.c` | -| 241 | func_8013E83C | 1 | plumbing | 71 | failed | | none — MATCH (scalar global stores + 2 conditional calls; §3-T4 branch-polarity invert on the &0xFF test) | `.run/backlog_drafts/func_8013E83C.c` | -| 242 | func_8017B368 | 1 | schedule | 74 | failed | | dead table-path off by 1 ins — target keeps src*16 live in $s0 & computes 2nd arg src16+(base+8) in call1 delay slot; every C form either folds to e+8 (73 ins) or CSEs base into an extra saved reg $s2 (75 ins). All live code (prologue, sltiu dispatch, copy path, 4 struct-copy stores, tail) matches; only the unreachable func_8012F214 path scheduling diverges. | `.run/backlog_drafts/func_8017B368.c` | +| 26 | func_80129C40 | 134 | struct | 46 | near | 0 | none — MATCH (array-of-struct %lo-fold for the two 3-element 0xA4-stride bases) | `.run/backlog_drafts/func_80129C40.c` | +| 27 | func_801497A8 | 134 | regalloc-order | 47 | near | 0 | none — MATCH. $s1 pinned to D_80078E78 base; result accumulator + masked | `.run/backlog_drafts/func_801497A8.c` | +| 28 | func_801483E8 | 134 | struct | 50 | near | 0 | none — MATCH | `.run/backlog_drafts/func_801483E8.c` | +| 29 | func_8015F380 | 134 | plumbing | 50 | near | 0 | none — expect MATCH (single call-crossing local pinned to $s0) | `.run/backlog_drafts/func_8015F380.c` | +| 30 | func_80136DFC | 134 | loose-typing | 50 | near | 0 | none — MATCH | `.run/backlog_drafts/func_80136DFC.c` | +| 31 | func_8016EFC8 | 134 | schedule | 51 | near | 0 | none — MATCH (51 ins). Temp `u32 v = *a0 / 0x4000000;` hoists the load to ins 0 and | `.run/backlog_drafts/func_8016EFC8.c` | +| 32 | func_801376E8 | 134 | schedule | 51 | near | 0 | none — MATCH (51 ins). 3 levers: (1) adjacent-field array u16 D_80126A14[] for A14/A16 | `.run/backlog_drafts/func_801376E8.c` | +| 33 | func_80156ECC | 134 | plumbing | 55 | near | 0 | none — MATCH (clean reconstruction; 3 call-crossing structs in s1/s2/s4, lh/lhu pair) | `.run/backlog_drafts/func_80156ECC.c` | +| 34 | func_801758FC | 134 | schedule | 55 | near | 0 | none — MATCH (55 ins) | `.run/backlog_drafts/func_801758FC.c` | +| 35 | func_801759D8 | 134 | schedule | 56 | near | 0 | none — MATCH (56 ins) | `.run/backlog_drafts/func_801759D8.c` | +| 36 | func_8012A328 | 134 | schedule | 60 | near | 0 | none — MATCH (60 ins, relocation-masked) | `.run/backlog_drafts/func_8012A328.c` | +| 37 | func_8012CFA8 | 134 | regalloc-order | 60 | near | 0 | none — MATCH (modeled on byte-proven sibling func_8012D3B4) | `.run/backlog_drafts/func_8012CFA8.c` | +| 38 | func_80138DE0 | 134 | other | 60 | near | 0 | none — MATCH (60 ins) | `.run/backlog_drafts/func_80138DE0.c` | +| 39 | func_80133298 | 134 | struct | 65 | near | 0 | none — MATCH (65 ins, relocation-masked) | `.run/backlog_drafts/func_80133298.c` | +| 40 | func_80147E44 | 134 | regalloc-order | 67 | near | 0 | none -- MATCH (67 ins). $s1/$s0/$s3/$s2 pins ($17/$16/$19/$18) + 3-pointer reload | `.run/backlog_drafts/func_80147E44.c` | +| 41 | func_80164418 | 134 | struct | 70 | near | 0 | none — MATCH (s16 stack array forces the spill; 2nd ratan2 reuses /dy/ in $a1) | `.run/backlog_drafts/func_80164418.c` | +| 42 | func_8012E014 | 134 | other | 73 | near | 0 | none — MATCH (expected; straightforward struct-field + global-copy body) | `.run/backlog_drafts/func_8012E014.c` | +| 43 | func_8012E138 | 134 | regalloc-order | 81 | near | 0 | none — MATCH (81/81 ins, match_one proxy); reloaded ptr pinned to $a0 | `.run/backlog_drafts/func_8012E138.c` | +| 44 | func_8012B4B8 | 134 | regalloc-order | 84 | near | 0 | none — MATCH | `.run/backlog_drafts/func_8012B4B8.c` | +| 45 | func_80166054 | 134 | regalloc-order | 94 | near | 0 | none — MATCH (94 ins). Pins: param_1->$s2, angle->$s0, shift->$s1, r0->$s3, | `.run/backlog_drafts/func_80166054.c` | +| 46 | func_801379FC | 134 | regalloc-order | 97 | near | 0 | none — MATCH (match_one 97/97) | `.run/backlog_drafts/func_801379FC.c` | +| 47 | func_801463A0 | 134 | struct | 101 | near | 0 | none — MATCH (101 ins, match_one); real symbol names; misaligned 8B copy + s16 stores + masked B9C last | `.run/backlog_drafts/func_801463A0.c` | +| 48 | func_80167714 | 134 | regalloc-order | 104 | near | 0 | none — MATCH (104 ins) | `.run/backlog_drafts/func_80167714.c` | +| 49 | func_80169228 | 134 | regalloc-order | 105 | near | 0 | none — MATCH (105 ins, relocation-masked). Key levers: arg0/p pinned $s1/$s0, | `.run/backlog_drafts/func_80169228.c` | +| 50 | func_8012CC88 | 134 | struct | 105 | near | 0 | none — MATCH (105 ins, relocation-masked) | `.run/backlog_drafts/func_8012CC88.c` | +| 51 | func_80174CB0 | 134 | regalloc-order | 123 | near | 0 | none — MATCH (match_one 123/123). Levers: (1) §21 one combined stack struct {s32 a[5]; ...} | `.run/backlog_drafts/func_80174CB0.c` | +| 52 | func_80178004 | 134 | regalloc-order | 165 | near | 0 | none — MATCH (full register pins per sibling func_80177EA4; running-ptr $s2 to stop unroll-rebase; | `.run/backlog_drafts/func_80178004.c` | +| 53 | func_80163C2C | 134 | regalloc-order | 167 | near | 0 | none — MATCH (167 ins) | `.run/backlog_drafts/func_80163C2C.c` | +| 54 | func_8015126C | 134 | regalloc-order | 254 | near | 0 | none — MATCH (254 ins, relocation-masked) | `.run/backlog_drafts/func_8015126C.c` | +| 55 | func_8016F0E4 | 134 | plumbing | 26 | near | 1 | none — MATCH (26 ins); natural C form, param_1 auto-allocated to $s0 | `.run/backlog_drafts/func_8016F0E4.c` | +| 56 | func_8014F3E8 | 134 | WAVE | 32 | near | 1 | WAVE: 1 mismatch | `.run/backlog_drafts/func_8014F3E8.c` | +| 57 | func_80177AD4 | 134 | regalloc-order | 34 | near | 1 | 1 ins — loop-bound shift reads loop-carried $a3 (sll v0,a3,16) vs target's dying copy $v0 (sll v0,v0,16); gcc CSE canonicalizes the two equal-valued regs to the loop-carried one. IV-combine (§20) CRACKED via $a2/$a3 pins (was 31-mismatch "stub"). | `.run/backlog_drafts/func_80177AD4.c` | +| 58 | func_801775E0 | 134 | regalloc-order | 67 | near | 1 | 1 ins — target `sb $v0,0x6($s0)` vs mine `sb $v0,26($s1)` (same store P1+0x1a; gcc address-CSE picks $s1 base not the recomputed $s0); all else byte-identical | `.run/backlog_drafts/func_801775E0.c` | +| 59 | func_8014FFDC | 134 | struct | 93 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8014FFDC.c` | +| 60 | func_80158638 | 134 | plumbing | 87 | near | 2 | none — MATCH (proxy); callee externs are plain func_, gate's canon/cast passes own them | `.run/backlog_drafts/func_80158638.c` | +| 61 | func_80171FFC | 134 | regalloc-order | 40 | near | 3 | none — MATCH (40 ins). Key: func_8017248C takes (a0,a1); calling it with | `.run/backlog_drafts/func_80171FFC.c` | +| 62 | func_801466F0 | 134 | plumbing | 24 | near | 4 | none — MATCH (struct param-spill + branch-polarity) | `.run/backlog_drafts/func_801466F0.c` | +| 63 | func_80147364 | 134 | remat | 30 | near | 4 | none — MATCH (30 ins). Lever: hoist &D_80126B58 into a local ptr `u8 *p=&D_80126B58;` so gcc | `.run/backlog_drafts/func_80147364.c` | +| 64 | func_801325B8 | 134 | schedule | 113 | near | 4 | 4/113 — prologue save-order of the $s0(cur/p3) vs $s5(p1) pair; gcc emits | `.run/backlog_drafts/func_801325B8.c` | +| 65 | func_80146A6C | 134 | struct | 18 | near | 5 | none — MATCH | `.run/backlog_drafts/func_80146A6C.c` | +| 66 | func_80140D68 | 134 | schedule | 65 | near | 5 | 5-ins near-miss — gcc hoists `lui 0xff00` (the 0xFF000000 mask) one slot too early in the first AddPrim block, so the D_800B9A02 index value lands in $v1 instead of $a1 and *param_1 is read late (idx 35-43). Structure + regs otherwise byte-exact (frame eliminated via struct-array D_800AE7BC, &D_800B9A02 held in $a2 via the pB $6 pin, param_1+8 grouping fixes the rest). Pure sched1 list-order residual -> permuter candidate (try reg-hint + reorder around the lui 0xff00 / lw 0($a0) pair). | `.run/backlog_drafts/func_80140D68.c` | +| 67 | func_80130C08 | 134 | schedule | 65 | near | 5 | tail shares one jal func_80131CA8 between the a1=5 and a1=0x38 arms via `j .L80130CEC` with a DUPLICATED `move a0,s0` (one in the beqz delay slot, one at jump-in label .L80130CDC); goto-merge form collapses to 64 ins (one move dropped), if-else form keeps 65 ins but emits two separate jals (idx 54-56 differ + the recheck branch inverts bnez/beqz at idx 51). 5 mismatched, count correct. | `.run/backlog_drafts/func_80130C08.c` | +| 68 | func_80175820 | 134 | schedule | 55 | near | 6 | body byte-IDENTICAL; only residual is the phantom 0x10 leaf frame — target schedules `addiu $sp,-0x10` into the load-delay slot at insn 26 (after the D_8011F7C0 load) and `addiu $sp,0x10` before `jr ra`. With the frame forced (reserved local + anchor) gcc emits the prologue adjust at insn 0 instead of the delay slot (§5 frame-scheduling class); pins block the permuter, no C lever found to move it. Frameless form left here = body byte-exact, 2 frame insns short. | `.run/backlog_drafts/func_80175820.c` | +| 69 | func_8016130C | 134 | WAVE | 26 | near | 9 | WAVE: 9 mismatch | `.run/backlog_drafts/func_8016130C.c` | +| 70 | func_80161374 | 134 | schedule | 41 | near | 10 | none — MATCH (41/41 relocation-masked) | `.run/backlog_drafts/func_80161374.c` | +| 71 | func_80163764 | 134 | regalloc-order | 42 | near | 10 | none — MATCH (42 ins). pins $s2/$s1/$s0/$s3 + u32 counter (sltiu) + init order s2,s3,i,p | `.run/backlog_drafts/func_80163764.c` | +| 72 | func_80136F3C | 134 | schedule | 61 | near | 10 | 10/61 — regalloc EXACT (param-copy + corner register-pins). residual = gcc list-scheduler permutation of the prologue window (idx 7-16): target saves $s0 before computing xp, sets $s4=0xFF before the D_800B9A02 lhu, and defers xm($s1=$s1-3) to AFTER the lhu; no C-level reorder/barrier reaches it; permuter can't run (pycparser rejects register __asm__). | `.run/backlog_drafts/func_80136F3C.c` | +| 73 | func_80149374 | 134 | remat | 23 | near | 11 | gcc -O2 CSEs &sp18 into freed callee-saved $s0 (1 addu + 2 move); target rematerializes addiu $sp,0x18 twice. Single-buffer straight-line address reused across 2 calls -> CSE wins; no clean C (cast/type/union/ptr-var/$8-pin) flips it; two-distinct-locals remats but grows frame +8 (gcc-2.7.2 won't coalesce slots back to 0x18). Frame/regs/params all match; only this 1 insn differs. | `.run/backlog_drafts/func_80149374.c` | +| 74 | func_80150528 | 134 | schedule | 53 | near | 12 | none — MATCH (53 ins). Modeled on banked sibling DEFINE_func_80163950 (same D_801202A0 stride-0x10C loop + func_80135A4C call); single-pointer for-loop reproduces gcc's two-IV (p, p+0x20) schedule exactly. NB: §20 had flagged this "unsteerable" pre-sibling-exemplar. | `.run/backlog_drafts/func_80150528.c` | +| 75 | func_80146AFC | 134 | schedule | 40 | near | 13 | none — MATCH | `.run/backlog_drafts/func_80146AFC.c` | +| 76 | func_80137178 | 134 | schedule | 78 | near | 15 | reg values all correct; prologue independent-addiu order + lazy sw placement differ | `.run/backlog_drafts/func_80137178.c` | +| 77 | func_8015C030 | 134 | WAVE | 23 | near | 17 | WAVE: 17 mismatch | `.run/backlog_drafts/func_8015C030.c` | +| 78 | func_8014ADE0 | 134 | schedule | 139 | near | 19 | 16 ins off — all compiler-internal ties: (1) 0xAAA8 const lands $v0 vs target $v1; | `.run/backlog_drafts/func_8014ADE0.c` | +| 79 | func_8016191C | 134 | plumbing | 24 | near | 20 | none — MATCH (24 ins). early-return-per-arm: each arm sets $v0 directly + j-tail merges | `.run/backlog_drafts/func_8016191C.c` | +| 80 | func_8014FE60 | 134 | regalloc-order | 95 | near | 20 | none — MATCH (permuter closed the final bothzero-block regalloc/schedule residual: moving `a = in[2]` before the +0x7E read-modify-write flips the 0x7FFF constant into $v1 and computes return-0 in $v0) | `.run/backlog_drafts/func_8014FE60.c` | +| 81 | func_8017248C | 134 | WAVE | 24 | near | 23 | WAVE: 23 mismatch | `.run/backlog_drafts/func_8017248C.c` | +| 82 | func_8014E5B4 | 134 | regalloc-order | 59 | near | 23 | none — MATCH | `.run/backlog_drafts/func_8014E5B4.c` | +| 83 | func_80141B90 | 134 | struct | 29 | near | 24 | none — MATCH (29 ins); array-of-int %lo-fold + call + u16 if-block; volatile-double reserves the target's 8-byte frame slot | `.run/backlog_drafts/func_80141B90.c` | +| 84 | func_801719A4 | 134 | struct | 24 | near | 25 | none — MATCH (24 ins, relocation-masked) | `.run/backlog_drafts/func_801719A4.c` | +| 85 | func_8016706C | 134 | WAVE | 30 | near | 27 | WAVE: 27 mismatch | `.run/backlog_drafts/func_8016706C.c` | +| 86 | func_8014D2A0 | 134 | other | 80 | near | 27 | none — MATCH (80 ins, relocation-masked); loop-guard idiom per engine_core DEFINE_func_80164ACC | `.run/backlog_drafts/func_8014D2A0.c` | +| 87 | func_801777BC | 134 | schedule | 59 | near | 29 | body byte-matches; residual ~3 ins = prologue instruction-scheduling (final `sll t8,16` / `lw param_7` / `addu t0,a0,0xC` ordering around the blez guard) + the loop-counter copy `addu t3,v0` — pure gcc sched/regalloc tie-break, permuter-blocked by the register __asm__ pins | `.run/backlog_drafts/func_801777BC.c` | +| 88 | func_80161888 | 134 | schedule | 37 | near | 30 | none — MATCH (proxy verified) | `.run/backlog_drafts/func_80161888.c` | +| 89 | func_80144B14 | 134 | schedule | 34 | near | 31 | none — MATCH (34 ins). Two stack structs (s16[3] each) passed by addr to | `.run/backlog_drafts/func_80144B14.c` | +| 90 | func_8012F49C | 134 | regalloc-order | 51 | near | 31 | &D_800AF648 is CSE-promoted into the dead-after-RotTransSV $s1 (cache + 2 `move a0,s1`) where the target re-materializes `lui/addiu %hi/%lo` per call; freeing/reserving $s1 either way (pins, live-range barrier) only shifts pressure (spawns $s3 / regresses). Plus the tail emits `sw $v0,0($s2)` vs the target's redundant `addu $v0,$s2,$zero; sw $v1,0($v0)`. Both are gcc-2.7.2 regalloc cost-model artifacts, not source-reshapeable here. | `.run/backlog_drafts/func_8012F49C.c` | +| 91 | func_801778A8 | 134 | iv-combine | 38 | near | 38 | gcc spawns 2 IVs (byte giv @+0xc, halfword RMW giv @+0xa); target combines both into ONE IV at +0xc reaching the halfword at -2($a3). A struct collapses to 1 IV but anchors at the struct base (+0xa) not +0xc; raw byte+halfword RMW never combines. Same combine_givs-refuses-halfword-RMW wall as sibling func_80177AD4 (§20, stubbed). Floor 33-off; not source-steerable (combine runs pre-regalloc, pins/order don't move it). | `.run/backlog_drafts/func_801778A8.c` | +| 92 | func_80128ED8 | 134 | regalloc-order | 53 | near | 39 | index uses $a3 directly; target reads index->$v1 then copies to $a3 (addu $a3,$v1,$zero) so $v1 frees for the 0xc0 andi, adding a j .L80128F50 join + a -0x10 frame (vars=16); gcc-2.7.2 refuses the redundant-looking copy here, base pinned $t0 fixes the tail | `.run/backlog_drafts/func_80128ED8.c` | +| 93 | func_8012A1BC | 134 | schedule | 78 | near | 42 | 42/78 — block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoists all 9 non-block scalar loads to the top then stores 4, blk, blk, then late-stores the rest; a "memory" barrier is needed to stop the block copy hoisting+spilling but it also pins the 5 late scalars' stores too early. No single source/barrier shape reproduces "loads cross the block copy but the copy itself does not" — permuter/schedule residual. | `.run/backlog_drafts/func_8012A1BC.c` | +| 94 | func_8012B77C | 134 | schedule | 58 | near | 43 | register HOMES + mult/acc-build region + dy-in-delay-slot all byte-match; residual is sched.c load-region tie-break (target loads dz pair first w/ both operands in temps $v1/$v0, mine schedules dx-loads first and lands a[5] in the saved $s5) + one reload `addu $v0,$s3,$zero` before the final store + the `acc&0xFFFF` andi hoisted into the prologue. Each source restructure fixes one and regresses another — genuine sched.c/local-alloc equilibrium. | `.run/backlog_drafts/func_8012B77C.c` | +| 95 | func_8012E688 | 134 | remat | 60 | near | 48 | §10 hoist-vs-remat — gcc-2.7.2 CSEs &D_800AF648 into a 3rd callee-saved reg ($s2) and reuses it across both calls; the target REMATERIALIZES `lui/addiu %hi/%lo` per call (no $s2). Params correctly pinned to $s0/$s1, but gcc always finds a spare callee-saved for the hoisted global address. Pins/barriers/casts/volatile all fail to force remat (matches cookbook §20 confirmed-stub class func_80149374/801493D0, global-symbol variant). The $s2 spill cascades a +4 frame-offset shift through all RotTransPers buffer addiu's. | `.run/backlog_drafts/func_8012E688.c` | +| 96 | func_80176144 | 134 | regalloc-order | 53 | near | 50 | none — MATCH | `.run/backlog_drafts/func_80176144.c` | +| 97 | func_8016163C | 134 | plumbing | 78 | near | 50 | none — MATCH (78 ins). First arm calls func_801599A4 with NO arg (asm nop delay slot) via fn-ptr cast ((void(*)(void))func_801599A4)(). | `.run/backlog_drafts/func_8016163C.c` | +| 98 | func_801387B8 | 134 | regalloc-order | 100 | near | 50 | the two scanned bytes land in $a0/$a1 not $a1/$a2 (gcc-2.7.2 grabs the freed incoming-arg $a0 for the first load; a $5 register-asm pin is NOT honored on a load-defined arg-class reg, a $6 pin IS — kept pin-free so the permuter can grind it, costing +1) + gcc basic-block layout of the case-7/case-10/default handlers differs; control-flow semantics correct, 50 mismatch | `.run/backlog_drafts/func_801387B8.c` | +| 99 | func_8014F2E0 | 134 | schedule | 66 | near | 51 | §10 IV-init placement (piVar3 setup not sunk past loop guard) + store-vs-load (D_801150D8=0 schedules between the two arg-loads) — both CONFIRMED-unsteerable per cookbook §20; 11-off | `.run/backlog_drafts/func_8014F2E0.c` | +| 100 | func_80161774 | 134 | plumbing | 69 | near | 53 | none — MATCH (69 ins, match_one verified; clean nested-if; param_1 -> $s0 call-crossing) | `.run/backlog_drafts/func_80161774.c` | +| 101 | func_80176D94 | 134 | schedule | 152 | near | 63 | 63/152 — frame+prologue+4 calls+2x(801783D0/801777BC) MATCH (pins $s0=uVar2/$s2=param_2 + CSE-break barrier); residual is GIANT store-block caller-saved temp COLORING ($a2/$a3/$a0/$v1 vs target $t0/$t1/$t2/$a2) + micro-schedule (~70-ins straight line) + 4 delay-slot fills (li a1,4 vs s0-capture). structurally complete, count-exact → permuter/grinder territory. | `.run/backlog_drafts/func_80176D94.c` | +| 102 | func_80177940 | 134 | iv-combine | 101 | near | 65 | prologue+setup (35 ins) byte-match exactly; loop body diverges on gcc loop-invariant hoist ORDERING (scheduler tie-break), the conditional 0x74808080 recompute-vs-hoist, and the tail IV final-value double-move (addu s3,a0,zero; addu v0,s3,zero) + pd+=5 increment placement -- same loop-IV-combine class S20 flags as stub for sibling func_80177AD4. | `.run/backlog_drafts/func_80177940.c` | +| 103 | func_801770E0 | 134 | schedule | 152 | near | 66 | instr-count exact (152); residual = straight-line back-half scheduling + const temp-reg allocation ($t0/$t1/$t2 vs $v1/$a2/$a3) + a 2-ins prologue save-vs-sll swap. register pins ($s2/$s1/$s0) + CSE-break barrier are load-bearing (without pins 133+); permuter blocked by the register __asm__ pins (§10/§17 hard tail). | `.run/backlog_drafts/func_801770E0.c` | +| 104 | func_8014DD8C | 134 | WAVE | 108 | near | 83 | WAVE: 83 mismatch | `.run/backlog_drafts/func_8014DD8C.c` | +| 105 | func_80137DD4 | 134 | schedule | 129 | near | 107 | regalloc fully matches (frame -0x30; s4/s3/s5=params, s2=mask, s1=ptr w/ in-place +0x24 reuse, s0=acc+reused as 0xff000000); residual is gcc -O2 in-block scheduling not steerable from C: (1) first block emits one-register diff (a3) vs target two-register a0=diff/a1=result + p3 in load-delay slot; (2) signed-char field 0x1f emits `lb` but target `lbu;sll24;sra24` (gcc folds every (s8)/(<<24>>24) form back to lb); (3) ~3 chain-block temp/schedule micro-diffs (lw into a2 vs v1, in-place addu vs t1). | `.run/backlog_drafts/func_80137DD4.c` | +| 106 | func_80148094 | 134 | regalloc-order | 213 | near | 107 | ~39/213 residual (LCS), all in the sVar1>=0x201 clamp blocks: $v0/$v1 mflo regalloc swap + coupled branch-polarity/join-placement (bnez<->beqz) + 2 delay-slot fills (addiu s1,v0,0x400 into 80013F3C slot; sll s1,16 in-place into 2nd ratan2 slot) + early_ret a2-vs-s5 -> permuter/grinder territory | `.run/backlog_drafts/func_80148094.c` | +| 107 | func_8014EA4C | 134 | loop-guard | 183 | near | 142 | body byte-identical; residual is the §20 IV-final-value loop guard — target emits an | `.run/backlog_drafts/func_8014EA4C.c` | +| 108 | func_801412A8 | 134 | regalloc-order | 198 | near | 154 | 154-mismatch near-miss (198/198 ins, structure+branches exact). Two irreducible gcc residuals: (1) HEAD: held &D_800B9A02 ptr must be init-at-decl to stay in a reg across all 4 prims (correct 198-ins), but that forces gcc to materialize the address at fn entry (2 ins before the branches) vs target's in-body materialization -> shifts the head regalloc cascade; in-body assign re-materializes per-use (172 ins, wrong count) even with the $9 pin. (2) BODY: gcc OFFSET-FOLDS the 4x-unrolled prim stores (p[0..3], p+=4 -> sw at 16/20/24/28 from a fixed base) instead of ADVANCING $t6 (addiu $t6,0x10; sw at 0/4/8/12) like the target; no C form (post-inc, char* advance, =r/0 barrier, r-only barrier) triggers the register-advance. Pins landed p1->$t6/uVar4->$t0/iVar1->$a0/pidx->$t1 (head 0-1,8,14,16-19 exact). | `.run/backlog_drafts/func_801412A8.c` | +| 109 | func_801571C4 | 134 | schedule | 198 | near | 183 | prologue instruction SCHEDULE + frame-layout residual. Body + loop are byte-exact and | `.run/backlog_drafts/func_801571C4.c` | +| 110 | func_8014EE14 | 134 | schedule | 248 | near | 205 | body structurally matched (97 reloc-masked, mostly +1-offset branch artifacts). 3 real residuals, | `.run/backlog_drafts/func_8014EE14.c` | +| 111 | func_801745AC | 134 | plumbing | 12 | failed | | none — MATCH (stub: param saved in $s0 across first call, passed to second) | `.run/backlog_drafts/func_801745AC.c` | +| 112 | func_801705C0 | 134 | WAVE | 14 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801705C0.c` | +| 113 | func_8016B91C | 134 | WAVE | 18 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8016B91C.c` | +| 114 | func_80156600 | 134 | other | 18 | failed | | none — MATCH (simple counted scan, do-while form per Ghidra-C) | `.run/backlog_drafts/func_80156600.c` | +| 115 | func_801718AC | 134 | WAVE | 22 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801718AC.c` | +| 116 | func_80168B70 | 134 | WAVE | 27 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80168B70.c` | +| 117 | func_8016BA68 | 134 | plumbing | 29 | failed | | none — MATCH (29 ins, straight-line; lh narrow loads at call site) | `.run/backlog_drafts/func_8016BA68.c` | +| 118 | func_801494CC | 134 | WAVE | 30 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801494CC.c` | +| 119 | func_801708B0 | 134 | WAVE | 30 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_801708B0.c` | +| 120 | func_80170CF0 | 134 | schedule | 30 | failed | | 4-ins PROLOGUE-ORDER residual (body insns 4-29 byte-identical). My cc1 hoists the funcptr lui/lw ABOVE the frame setup (lui,lw,addiu sp,sw s0); target keeps frame setup first (addiu sp,sw s0,lui,lw). Same prologue-order class as func_80177F84 (cookbook L1332) — no C lever found (intermediate var/cast/void*-vs-funcptr/pin/early-ptr all reproduce the hoist; barriers/empty-asm/volatile-local regress). KEY WIN: `case 0: break;` forces emit_case_nodes' slti<2;bnez→default lower-bound prune, exactly matching the target dispatch tree (a bare 2-case switch omits it). | `.run/backlog_drafts/func_80170CF0.c` | +| 121 | func_80149450 | 134 | WAVE | 31 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80149450.c` | +| 122 | func_80149F2C | 134 | WAVE | 31 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80149F2C.c` | +| 123 | func_80161A90 | 134 | other | 34 | failed | | none — MATCH (34 ins) at the overlay's STANDARD -O2 (match_one reports MATCH). NO -O1 split needed. | `.run/backlog_drafts/func_80161A90.c` | +| 124 | func_80152C80 | 134 | plumbing | 41 | failed | | none — MATCH expected (linear call/store sequence, no regalloc tension) | `.run/backlog_drafts/func_80152C80.c` | +| 125 | func_80173BC0 | 134 | plumbing | 41 | failed | | none — MATCH. Keys: invert mask branch (else-block = 80174650 path so func_8013E588 | `.run/backlog_drafts/func_80173BC0.c` | +| 126 | func_8014C1C8 | 134 | regalloc-order | 44 | failed | | none — MATCH (match_one 44/44 ins, relocation-masked) | `.run/backlog_drafts/func_8014C1C8.c` | +| 127 | func_80146750 | 134 | regalloc-order | 47 | failed | | none — MATCH (match_one 47/47; psVar4->$a3 / psVar3->$v1 pins forced the init order) | `.run/backlog_drafts/func_80146750.c` | +| 128 | func_8014680C | 134 | struct | 47 | failed | | none — MATCH (47 ins, relocation-masked) | `.run/backlog_drafts/func_8014680C.c` | +| 129 | func_8014C4AC | 134 | other | 47 | failed | | none — MATCH (shared-ret0 goto §16 flips final branch polarity + schedules ret=0 into delay slot; memcpy(t0+0x7C,a3,8) inlines the lwl/lwr/swl/swr 8-byte block §21; param_1 = unsigned short* for the lhu reads) | `.run/backlog_drafts/func_8014C4AC.c` | +| 130 | func_80151B98 | 134 | regalloc-order | 47 | failed | | none — MATCH | `.run/backlog_drafts/func_80151B98.c` | +| 131 | func_80147F78 | 134 | schedule | 48 | failed | | TWO residuals remain. (1) FRAME: target frame is 0x60 = exactly 64 bytes (16 words) of LIVE local vars on top of the 4 saved regs (s0,s1,s2,ra) + 0x10 arg area; my body has no locals so frame is 0x20. Reproducing 64B of live local needs an address-escaped local buffer, but the target has only the 3 visible jals (no 4th call to receive &buf), so I cannot make a 16-word local survive -O2 dead-store-elim without emitting an extra instruction. (2) RELOAD SCHEDULE: target reloads D_80127090/94/98 from memory (folded lui%hi;lw%lo) with the FIRST reload HOISTED up between store90 and store94 (free non-volatile scheduling); a "memory" clobber barrier (below) forces the folded reloads but pins them strictly AFTER all three stores. The natural source is almost certainly a 16-word local buffer that ALIASES the globals (non-volatile reloads, freely scheduled) — same construct that also explains the 0x60 frame. Closest faithful body kept below; folded reload bytes are correct, frame + hoist are the gap. | `.run/backlog_drafts/func_80147F78.c` | +| 132 | func_80151C54 | 134 | plumbing | 52 | failed | | none — MATCH (52 ins). Branch-polarity §3-T4: BD60 arm is fall-through (if !=1 && ==0x11), BC44 is else. | `.run/backlog_drafts/func_80151C54.c` | +| 133 | func_8017129C | 134 | struct | 58 | failed | | none — MATCH (58 ins); three aligned 16-byte block-copies via struct assignment (cookbook §21) | `.run/backlog_drafts/func_8017129C.c` | +| 134 | func_80173A60 | 134 | regalloc-order | 59 | failed | | none — MATCH (59 ins) | `.run/backlog_drafts/func_80173A60.c` | +| 135 | func_80130650 | 134 | plumbing | 60 | failed | | none — MATCH (60 ins). ((void (*)(void))func_801319E0)() called with NO arg in the >=0x10 branch (target jal+nop, no a0 setup) → no-proto extern (K&R), promotion-safe vs canonical void ((void (*)(void))func_801319E0)(s32). func_8012CBF4 returns s32 here vs canonical void → cast_call_sites handles it. | `.run/backlog_drafts/func_80130650.c` | +| 136 | func_8014A738 | 134 | regalloc-order | 62 | failed | | none — MATCH | `.run/backlog_drafts/func_8014A738.c` | +| 137 | func_80175308 | 134 | struct | 67 | failed | | none — MATCH (67 ins, relocation-masked) | `.run/backlog_drafts/func_80175308.c` | +| 138 | func_80132F40 | 134 | regalloc-order | 72 | failed | | gcc gives src (sp+0x10) a 5th saved reg ($s3, frame 0x38 not 0x40); target rematerializes | `.run/backlog_drafts/func_80132F40.c` | +| 139 | func_8014D610 | 134 | plumbing | 74 | failed | | none — MATCH (74 ins). for-loop + continue, single IV pointer p; gcc derives the $s0 = p+0x75 second induction var. Template: DEFINE_func_80163950 (sibling, same D_801202A0 loop + func_80135A4C). | `.run/backlog_drafts/func_8014D610.c` | +| 140 | func_80163534 | 134 | schedule | 76 | failed | | mismatch=13, a single 1-position scheduling tie. Instrs 1-30 byte-perfect; all registers correct | `.run/backlog_drafts/func_80163534.c` | +| 141 | func_8014CF04 | 134 | struct | 82 | failed | | none — MATCH (82 ins; array-of-struct scan, for-loop over Ent D_801202A0[96], stride 0x10C) | `.run/backlog_drafts/func_8014CF04.c` | +| 142 | func_80156670 | 134 | schedule | 83 | failed | | none — MATCH (83 ins). Key: hoist `iVar1 = uVar3*4;` as its OWN statement before the if so gcc schedules `sll v1,s1,2` into the bnez delay slot (computed unconditionally) and reuses v1 index-first (`iVar1 + (s32)&D_801150E0` → `addu v0,v1,v0`). 13-arg call to func_80157158 (a0-a3 + 9 stack args at 0x10..0x30); param_2/param_3 cast (u16) → andi; param_6 incoming as lhu(u16). Address args = integer math `iVar2 + (s32)&D_x` (index-first → lui;addiu;addu, index added first). | `.run/backlog_drafts/func_80156670.c` | +| 143 | func_8014D4C0 | 134 | schedule | 84 | failed | | none — MATCH (goto forces if-body out-of-line/last; `>=` fixes slt operand order) | `.run/backlog_drafts/func_8014D4C0.c` | +| 144 | func_8016A73C | 134 | struct | 85 | failed | | none — MATCH (85 ins, relocation-masked) | `.run/backlog_drafts/func_8016A73C.c` | +| 145 | func_80173CB4 | 134 | schedule | 90 | failed | | none — MATCH (switch form keeps cases unmerged; final block: reuse one temp for the D_8012750C test + the func_8013767C result -> $a0 alloc; invert if to !=0 for branch polarity + store order) | `.run/backlog_drafts/func_80173CB4.c` | +| 146 | func_8014C6F4 | 134 | regalloc-order | 91 | failed | | 19-off loop tie-break — target compiles the search as a while/for (pre-guard sltu;beqz present) with the found pointer snapshotted to $v0 split from the IV in $a0 and the +4 sunk into both call-arg delay slots; do-while is instruction-count-exact (91=91) but lacks the pre-guard, while every for/while form costs +4 ins (merge stays in $a0). §10 schedule/regalloc residual. | `.run/backlog_drafts/func_8014C6F4.c` | +| 147 | func_8014D12C | 134 | schedule | 93 | failed | | none — MATCH (93 ins). Block-order lever: success-continuation (return 1) | `.run/backlog_drafts/func_8014D12C.c` | +| 148 | func_801502EC | 134 | schedule | 93 | failed | | none — MATCH (93 ins). 8-byte block copy via alignment-1 struct (Blk8{u8 b[8]}) assignment reproduces the lwl/lwr/swl/swr; ret=0 hoisted before the block copy to fix the s3-vs-ra prologue save order. | `.run/backlog_drafts/func_801502EC.c` | +| 149 | func_80150170 | 134 | struct | 95 | failed | | none — MATCH (95/95). Keys: (1) two parallel 3-halfword groups via chained assign `sp10.x = sp18.x = v` (sp18 inner so 0x18 stores first); (2) align-1 blk8 struct copy for the lwl/lwr/swl/swr 8-byte copy into actor+0x80 (src = sp buf from func_801502EC, or u8[] D_801152A8); (3) f0/f2 = u16 (lhu), f1 = s16 (lh for the slt); (4) `(iVar5/iVar6)!=0` single-OR test + branch-polarity invert (not-both-zero is fall-through); (5) both-zero tail register pins: 0x7fff -> $v1 (`register s32 __asm__("$3")`), sp10.f0/f2 -> reused $a0 (`register u32 __asm__("$4")` written twice) to force gcc's hoist-load + reg reuse schedule. | `.run/backlog_drafts/func_80150170.c` | +| 150 | func_8014CD80 | 134 | regalloc-order | 97 | failed | | none — MATCH (97 ins). iVar3 pinned to $v1 (register __asm__("$3")) so | `.run/backlog_drafts/func_8014CD80.c` | +| 151 | func_8014E284 | 134 | WAVE | 108 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8014E284.c` | +| 152 | func_80167540 | 134 | WAVE | 117 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80167540.c` | +| 153 | func_8014F4C0 | 134 | WAVE | 141 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8014F4C0.c` | +| 154 | func_8014E048 | 134 | WAVE | 143 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_8014E048.c` | +| 155 | func_80155800 | 134 | WAVE | 145 | failed | | won't compile standalone (loose-typing / missing decl) | `.run/backlog_drafts/func_80155800.c` | +| 156 | func_80144090 | 134 | schedule | 154 | failed | | corner-block store/CSE schedule — gcc groups P+2/P-2 (share s>>6) vs target alternates P+2,P+4,P-2,P+0; plus otz*4 (sll $a0,$s5,2) scheduled late not into the D_800B9A02-load delay slot. Structure/regalloc all match (pins+array-of-struct %lo-fold+branch-polarity+mult-grouping landed; 144->52). Residual is §10 schedule tie-break, not source-steerable. | `.run/backlog_drafts/func_80144090.c` | +| 157 | func_80138ED0 | 134 | GIANT | 159 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 158 | func_8014F74C | 134 | other | 174 | failed | | none — MATCH (174 ins). Keys: sibling func_8014FA70 template; in/out/sp20 u8[8] short-trio bufs (lwl/lwr/swl/swr unaligned copies); load each a0 field once into b0/b1/b2 (stored to both sp20+out, reused in the 0x146-add block); 3-way memcpy branch on s1 (0x2000->D_801152A8, 0x4000->D_801152B0, else->D_800D3918); goto-form cmp-chain; final `""::: "memory"` barrier blocks gcc store-flag fold of (in4==out4)<<15 back to a branch | `.run/backlog_drafts/func_8014F74C.c` | +| 159 | func_8012EC04 | 134 | GIANT | 178 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 160 | func_801392FC | 134 | GIANT | 182 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 161 | func_8013AF20 | 134 | GIANT | 185 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 162 | func_8012D098 | 134 | GIANT | 189 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 163 | func_80129CF8 | 134 | GIANT | 191 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 164 | func_8013A530 | 134 | GIANT | 204 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 165 | func_801372B0 | 134 | GIANT | 207 | failed | | won't compile standalone (loose-typing / missing decl) | | +| 166 | func_80156B74 | 134 | struct | 214 | failed | | none — MATCH | `.run/backlog_drafts/func_80156B74.c` | +| 167 | func_80144B9C | 134 | other | 770 | failed | | -O0 cluster fn (prologue 21F0A003, fp-frame, all locals spilled+reloaded, load-delay nops). match_one compiles -O2 so it CANNOT match this; needs its own per-file -O0 split (Makefile CC1FLAGS:=-O0), like ov_SC01_077_o0.c. Body below is the faithful -O0 source; gate via whole-binary -O0 build only. | `.run/backlog_drafts/func_80144B9C.c` | +| 168 | func_80151944 | 4 | struct | 15 | near | 0 | none — MATCH (fn-pointer table dispatch; array-of-ptr indexing folds %lo) | `.run/backlog_drafts/func_80151944.c` | +| 169 | func_8016039C | 2 | struct | 15 | near | 1 | none — MATCH (function-pointer table dispatch indexed by unsigned-halfword field) | `.run/backlog_drafts/func_8016039C.c` | +| 170 | func_8015CC74 | 2 | struct | 15 | failed | | none — MATCH (analog func_8015BE38 idiom: D_80189354[a0->idx]() with Obj.idx at off 2) | `.run/backlog_drafts/func_8015CC74.c` | +| 171 | func_8015DAF8 | 1 | struct | 15 | near | 0 | none — MATCH (proxy); identical idiom to matched func_8016901C in same overlay | `.run/backlog_drafts/func_8015DAF8.c` | +| 172 | func_801577C8 | 1 | plumbing | 16 | near | 0 | none — MATCH expected (scalar global store + two sequential calls, param preserved across first call) | `.run/backlog_drafts/func_801577C8.c` | +| 173 | func_80178B70 | 1 | struct | 18 | near | 0 | none — MATCH; local ptr p=&D_8018A458 used for store AND (int)p-0xC arg forces $s0-base reuse across call1, param_1 into $s1 | `.run/backlog_drafts/func_80178B70.c` | +| 174 | func_8017F240 | 1 | regalloc-order | 20 | near | 0 | none — MATCH (base &D_801270D0 pinned to $s0 holds across call; one lui/addiu reused for load+store) | `.run/backlog_drafts/func_8017F240.c` | +| 175 | func_80157D20 | 1 | plumbing | 21 | near | 0 | none — MATCH expected (call, indexed u16-global load as 2nd arg, then call; param_1 saved across all three calls) | `.run/backlog_drafts/func_80157D20.c` | +| 176 | func_80163408 | 1 | struct | 21 | near | 0 | local 8-byte struct copied from D_801D8BB0, © passed as 5th arg (s32) | `.run/backlog_drafts/func_80163408.c` | +| 177 | func_80175184 | 1 | struct | 21 | near | 0 | none — MATCH (fnptr-array %lo-fold dispatch; idx = *(u16*)(a0+2) < 2 ? D_8018A1A4[idx]() : func_80175268()) | `.run/backlog_drafts/func_80175184.c` | +| 178 | func_8014FBC0 | 1 | schedule | 22 | near | 0 | none — MATCH (22 ins). Stack-switch primitive: register $sp var, manual save/switch/restore around the call. | `.run/backlog_drafts/func_8014FBC0.c` | +| 179 | func_80178B18 | 1 | other | 22 | near | 0 | none — MATCH | `.run/backlog_drafts/func_80178B18.c` | +| 180 | func_8017B8E8 | 1 | plumbing | 22 | near | 0 | none — MATCH (two inlined unaligned 8-byte memcpy blocks: src[0..7]->D_801DA794, src[8..15]->D_801DA78C) | `.run/backlog_drafts/func_8017B8E8.c` | +| 181 | func_80182988 | 1 | plumbing | 22 | near | 0 | none — MATCH (u16 store of 0xAA10 forces ori, not sign-extended addiu) | `.run/backlog_drafts/func_80182988.c` | +| 182 | func_801609B8 | 1 | struct | 28 | near | 0 | none — MATCH (pending byte-gate); function-pointer table %lo-fold via extern array | `.run/backlog_drafts/func_801609B8.c` | +| 183 | func_8017E224 | 1 | struct | 29 | near | 0 | none — MATCH (unaligned 8-byte memcpy of global onto stack + cond byte incr) | `.run/backlog_drafts/func_8017E224.c` | +| 184 | func_80165140 | 1 | regalloc-order | 30 | near | 0 | none — MATCH (pin i=$v1/eight=$a0/p=$a2; DON'T pin param — let it self-copy to $a3 first; memcpy 8/4 unaligned) | `.run/backlog_drafts/func_80165140.c` | +| 185 | func_801549F8 | 1 | iv-combine | 31 | near | 0 | none — MATCH (31 ins). Re-tie barrier on the index defeats gcc's pointer-giv | `.run/backlog_drafts/func_801549F8.c` | +| 186 | func_8015E698 | 1 | struct | 31 | near | 0 | none — MATCH (clean -O2 reconstruction; table-of-fnptr indexed by param_1[0]) | `.run/backlog_drafts/func_8015E698.c` | +| 187 | func_8017D98C | 1 | plumbing | 31 | near | 0 | none — MATCH (expected): straight global stores + tail call; const 0x140 reused for two halves | `.run/backlog_drafts/func_8017D98C.c` | +| 188 | func_80182268 | 1 | struct | 31 | near | 0 | none — MATCH (jump-table switch over sign-extended high byte of *(u16*)(a0+0x70); case4 decrements D_801270CC then falls into case3/7's func_8012C218; no default) | `.run/backlog_drafts/func_80182268.c` | +| 189 | func_801602A4 | 1 | struct | 34 | near | 0 | none — MATCH (template = matched twin func_801601E4; lhu+0x8000 == compare, fnptr-table dispatch D_801891B8[*(u16*)a0]() no-arg, then 3-call setup in target order; func_80161208 in else) | `.run/backlog_drafts/func_801602A4.c` | +| 190 | func_801734BC | 1 | struct | 34 | near | 0 | none — MATCH (pending byte-gate); switch-jtbl with no default, 3 short stores + fnptr call | `.run/backlog_drafts/func_801734BC.c` | +| 191 | func_8017D900 | 1 | plumbing | 35 | near | 0 | none — expect MATCH (STUB: ordered global stores + single tail call, sibling of func_8017D840) | `.run/backlog_drafts/func_8017D900.c` | +| 192 | func_8016BEA0 | 1 | other | 37 | near | 0 | none — MATCH (expected) | `.run/backlog_drafts/func_8016BEA0.c` | +| 193 | func_801754A8 | 1 | regalloc-order | 37 | near | 0 | none — MATCH (37 ins, relocation-masked proxy) | `.run/backlog_drafts/func_801754A8.c` | +| 194 | func_80160920 | 1 | struct | 38 | near | 0 | none — MATCH (function-pointer table folds %lo via extern array indexed by halfword) | `.run/backlog_drafts/func_80160920.c` | +| 195 | func_80183BAC | 1 | struct | 41 | near | 0 | switch jump-table dispatch (jtbl_801D9420); verifying case grouping 0,1,2,5,6/3,7/4 emits the target table + tail | `.run/backlog_drafts/func_80183BAC.c` | +| 196 | func_80183C50 | 1 | struct | 41 | near | 0 | none — MATCH (cross-jump exploit §cookbook L1543: dup func_8012C218 into case3/7 + case4 → merged jal;nop) | `.run/backlog_drafts/func_80183C50.c` | +| 197 | func_8015DF34 | 1 | struct | 44 | near | 0 | none — MATCH (clean structural; fn-ptr table via array index folds %lo) | `.run/backlog_drafts/func_8015DF34.c` | +| 198 | func_8015FE70 | 1 | struct | 44 | near | 0 | none — MATCH expected (fn-ptr-table dispatch + ushort struct fields) | `.run/backlog_drafts/func_8015FE70.c` | +| 199 | func_8014358C | 1 | regalloc-order | 45 | near | 0 | none — MATCH (relocation-masked match_one) | `.run/backlog_drafts/func_8014358C.c` | +| 200 | func_80183AF0 | 1 | regalloc-order | 47 | near | 0 | none — MATCH (mask pinned $a1/$5 + p pinned $v0/$2; switch w/ distributed func_8012C218 tail via dup calls + cross-jump merge) | `.run/backlog_drafts/func_80183AF0.c` | +| 201 | func_80178BF8 | 1 | plumbing | 49 | near | 0 | none — MATCH (pure scalar-store + two pointer-decrement do-while loops) | `.run/backlog_drafts/func_80178BF8.c` | +| 202 | func_8015E344 | 1 | struct | 50 | near | 0 | none — MATCH (pending whole-binary gate); fn-ptr table folds %lo via extern array, 0x234 single word store | `.run/backlog_drafts/func_8015E344.c` | +| 203 | func_8017EC7C | 1 | struct | 52 | near | 0 | none — MATCH (52 ins, relocation-masked) | `.run/backlog_drafts/func_8017EC7C.c` | +| 204 | func_80183CF4 | 1 | struct | 57 | near | 0 | none — MATCH (clean switch + jtbl; orchestrator owns jtbl/rodata migration) | `.run/backlog_drafts/func_80183CF4.c` | +| 205 | func_8015D01C | 1 | regalloc-order | 58 | near | 0 | none — MATCH | `.run/backlog_drafts/func_8015D01C.c` | +| 206 | func_8016D688 | 1 | struct | 60 | near | 0 | none — MATCH (byte array D_801D9C20[] folds the &D_801D9C21 base/-1 offsets; emit p+0xE store BEFORE the param+2 increment so the lhu fills the load-delay slot in $v1) | `.run/backlog_drafts/func_8016D688.c` | +| 207 | func_801842C8 | 1 | plumbing | 62 | near | 0 | none — MATCH | `.run/backlog_drafts/func_801842C8.c` | +| 208 | func_80165240 | 1 | regalloc-order | 63 | near | 0 | none — MATCH (63 ins). buf pinned to $s2 (register __asm__("$18")) so it stays in a callee-saved reg; param_3 then naturally lands in $s3. memcpy(buf+0x30,param_3,4) -> lwl/lwr+swl/swr unaligned 4B copy (cookbook §1 mem->mem). array-of-u8 buf with explicit *(T*)(buf+off) stores; mtx[0x20] declared 2nd so it lands at sp+0x50, buf_ at sp+0x10. | `.run/backlog_drafts/func_80165240.c` | +| 209 | func_8017BB34 | 1 | struct | 65 | near | 0 | none — MATCH (65 ins). Keys: (1) align-1 {s8 b[8]} struct so the two 8-byte copies emit lwl/lwr; (2) stack-local declaration order = target frame order (svin@0x10, buf@0x18, out@0x38, local8@0x40, rt_in@0x48, rt_out@0x50) — reordering the locals to ascending offset fixed all 23 offset-only diffs. | `.run/backlog_drafts/func_8017BB34.c` | +| 210 | func_8016BD78 | 1 | regalloc-order | 74 | near | 0 | none — MATCH (lazy pointer locals pa=&BC4, pb=&BC8 assigned at first use → $a1/$a2 held thru middle code as final call args; middle bytes BC5/BC6/BC9/BCA direct global) | `.run/backlog_drafts/func_8016BD78.c` | +| 211 | func_8016E7C8 | 1 | regalloc-order | 74 | near | 0 | none — MATCH (match_one 74/74; pins $18=&prim, $19=param_3 fixed s2/s3 alloc order; Work struct sized to 0x20) | `.run/backlog_drafts/func_8016E7C8.c` | +| 212 | func_80161D20 | 1 | struct | 14 | near | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` | +| 213 | func_8015FAAC | 1 | struct | 15 | near | 1 | none — MATCH expected; fn-ptr table indexed by u16 field at +2, *4 scaled load then jalr | `.run/backlog_drafts/func_8015FAAC.c` | +| 214 | func_8016084C | 1 | struct | 15 | near | 1 | none — MATCH (jump-table dispatch via array-of-fn-ptr %lo-fold) | `.run/backlog_drafts/func_8016084C.c` | +| 215 | func_8017F714 | 1 | plumbing | 27 | near | 1 | none — MATCH (27/27 ins, match_one verified) | `.run/backlog_drafts/func_8017F714.c` | +| 216 | func_80142A10 | 1 | struct | 28 | near | 1 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_80142A10.c` | +| 217 | func_80161C24 | 1 | struct | 29 | near | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` | +| 218 | func_80184C0C | 1 | struct | 48 | near | 1 | none — MATCH (array-of-struct %lo-fold for &D_8018AEB8[idx], stride 0x34) | `.run/backlog_drafts/func_80184C0C.c` | +| 219 | func_8016B4F8 | 1 | regalloc-order | 50 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8016B4F8.c` | +| 220 | func_801803B0 | 1 | other | 51 | near | 1 | none — MATCH expected; simple if/else, no call-crossing locals beyond param in $s0 | `.run/backlog_drafts/func_801803B0.c` | +| 221 | func_8015FBE0 | 1 | schedule | 58 | near | 1 | none — MATCH | `.run/backlog_drafts/func_8015FBE0.c` | +| 222 | func_801809BC | 1 | schedule | 70 | near | 2 | 2-ins prologue swap: `sw $ra,0x30` vs `addiu $a0,$s0,4` (first call-arg setup) adjacent, no data dep — pure ra-save scheduling; everything else byte-identical (70/70 ins). pins+a1-anchor fixed regalloc+s1-order+branch-polarity. | `.run/backlog_drafts/func_801809BC.c` | +| 223 | func_80171B4C | 1 | schedule | 70 | near | 3 | 3-off in the tail only (body+prologue MATCH via $s1 pin on arg1). gcc fills the | `.run/backlog_drafts/func_80171B4C.c` | +| 224 | func_80140E6C | 1 | schedule | 37 | near | 4 | 4 ins — each save-across-call copy (move s1,v0 / move s0,v0) should fill the NEXT jal's delay slot (target) but gcc-2.7.2 sched ties the copy with the next call's arg-setup at priority 2 and the LUID tie-break (rank_for_schedule) keeps the copy first, so reorg fills the slot with the arg-setup instead; no C reshape found that flips the LUID/priority order without breaking the OR-chain regalloc. | `.run/backlog_drafts/func_80140E6C.c` | +| 225 | func_8017EF50 | 1 | schedule | 53 | near | 5 | 5 ins — gcc-2.7.2 instr-scheduler load-order tie-breaks. Branch region + cross-jump-break (t14 pin to $3) + 0x34/0x30 hoist (c34 pin $5, c2c pin $3) all MATCH. Residual: (a) header 0x10-load vs 0x2c-load order swap; (b) compare loads 0x36-before-0xA and puts 0xA in $a1 not $a2 (slt operand reg differs). Both clusters resist source steering — every fix to one perturbs the pinned header schedule. | `.run/backlog_drafts/func_8017EF50.c` | +| 226 | func_8017F114 | 1 | schedule | 75 | near | 5 | block-order swap of 0x7F(.L1C8) vs elem3(.L1C0) cold blocks; gcc-2.7.2 BB placement (permuter-class) | `.run/backlog_drafts/func_8017F114.c` | +| 227 | func_8014D3E0 | 1 | other | 22 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8014D3E0.c` | +| 228 | func_8013CF68 | 1 | schedule | 63 | near | 6 | blocks 2&3 delay-slot fill — gcc picks dead-reg $v1(b0,0x10/0x20) store for the jal delay slot; target picks arg-reg $a3(0x12/0x22). 6 ins (2 rotations); not flippable by source store-order/interleave/barrier (all tested); permuter/scheduler-internal lever needed. Prologue, $s0 fold, regalloc, block-1 all exact. | `.run/backlog_drafts/func_8013CF68.c` | +| 229 | func_8017B940 | 1 | struct | 63 | near | 6 | none — MATCH | `.run/backlog_drafts/func_8017B940.c` | +| 230 | func_80164E40 | 1 | struct | 25 | near | 8 | none — MATCH expected; byte 0 keeps base $v1 (reused by final lw word), bytes 1/2 standalone | `.run/backlog_drafts/func_80164E40.c` | +| 231 | func_8016E9EC | 1 | schedule | 53 | near | 11 | 11 left — all GNU scheduler/canon tie-breaks (regs all match via pins): (a) prologue hoists `addiu a1,0x1C` into the save block; (b) first lbu reads $a0 not $s1 (incoming-arg still live); (c) iCopy copy `addu s4,s0` lands early (scheduler) vs target's func_800D2CA8 delay-slot; (d) `addu a2,s2,s3` vs target `s3,s2` commutative-canon (unflippable w/o breaking load order). Permuter can't run (register __asm__ pins rejected, cookbook §5a). | `.run/backlog_drafts/func_8016E9EC.c` | +| 232 | func_8017EB2C | 1 | regalloc-order | 69 | near | 11 | cond?2:1 call-arg: gcc computes into $v0 then move->$a0 (or pin->$a0 forces move v0,a0 to evac param_1); target reuses $a0 sequentially (andi a0 -> addiu a0) with a sw-s0-in-delay j-island. Body (idx14+) byte-perfect. | `.run/backlog_drafts/func_8017EB2C.c` | +| 233 | func_80156044 | 1 | struct | 74 | near | 12 | none — MATCH (74 ins, relocation-masked); $s2-pin for u16-return + def-mask + 3-arg cast on func_80156848 | `.run/backlog_drafts/func_80156044.c` | +| 234 | func_80161CD0 | 1 | regalloc-order | 20 | near | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` | +| 235 | func_80158FA4 | 1 | schedule | 51 | near | 17 | target keeps a DEAD `sra $a1,$v0,16` before `beqz $a1` (sign-extend of func_80159464's | `.run/backlog_drafts/func_80158FA4.c` | +| 236 | func_8018301C | 1 | plumbing | 28 | near | 24 | none — MATCH (straight-line, statement-order; verify with match_one) | `.run/backlog_drafts/func_8018301C.c` | +| 237 | func_8016BBE0 | 1 | other | 56 | near | 24 | none — straightforward; expect MATCH (mirror Ghidra-C order, synth_mult ×0x555) | `.run/backlog_drafts/func_8016BBE0.c` | +| 238 | func_8016E95C | 1 | regalloc-order | 36 | near | 25 | none — MATCH (pending byte-gate) | `.run/backlog_drafts/func_8016E95C.c` | +| 239 | func_8015094C | 1 | schedule | 73 | near | 33 | gcc jump-opt collapses the target's explicit `j`-to-shared-merge layout (cross-jump | `.run/backlog_drafts/func_8015094C.c` | +| 240 | func_80148E54 | 1 | regalloc-order | 67 | near | 40 | 67/67 ins, structure+branches+block-order+body-reload all match; residual is pure register-allocation order (permuter-eligible, no register-pins). (1) masked first-angle folds andi->$s1; target keeps it in $a0 then copies addu $s1,$a0 lazily into the beq delay-slot (the s1-copy schedules 1 slot later). (2) the 0x80 const is CSE-held in $a2 across both test+body; target re-materializes 0x80 in $v0 per block (it gets clobbered by `srl v0,v1,8`), which both renames the compare regs ($v0 not $a2) AND fills the body's reload load-delay slot (mine emits a nop there). (3) single-exit ret funnels $v1->$v0 (move v0,v1) where target writes $v0 directly. All three are gcc regalloc/value-prop tie-breaks no C reshape steered (tried: $v0 pin, temp-split, low-mask-reuse compare, memory-clobber-vs-volatile reload) — leave for the permuter. | `.run/backlog_drafts/func_80148E54.c` | +| 241 | func_80148AFC | 1 | regalloc-order | 71 | near | 48 | 1 real ins off — target keeps masked angle in caller-saved $a1 (andi $a1) then copies addu $s1,$a1 into the first beq delay slot; gcc coalesces it direct to $s1 (andi $s1) + fills delay with slti. Copy-coalescing tie-break (cookbook §20 hoist-vs-remat): resists barriers/pins($s1,$a1)/u16/reorder/split-mask. Everything else byte-exact (prologue identical thru 0x40; both bodies out-of-line via trailing-goto layout; slti via s32 type from lbu; BB4/BD0 double-load+reload via early-return main block). | `.run/backlog_drafts/func_80148AFC.c` | +| 242 | func_8017B0E4 | 1 | other | 61 | near | 51 | none — MATCH (expected; clean six-call sign-extend-store pattern) | `.run/backlog_drafts/func_8017B0E4.c` | +| 243 | func_80166F58 | 1 | schedule | 69 | near | 55 | regs/loop/logic/%lo-fold all match (pinned $s0-$s6); residual is reorg.c delay-slot fill — target replicates `addiu $v0,$s2,1` into the 3 skip-branch delay slots + commits `addu $s2,$v0,0` at merge (my codegen emits in-place `addiu $s2,$s2,1` w/ nop slots, -1 ins); plus prologue short-arg promote-then-move not fusing (`sra $a1;addu $s4,$a1,0` vs my fused `sra $s4,$a1`). Not source-steerable (pins block permuter). | `.run/backlog_drafts/func_80166F58.c` | +| 244 | func_80177DA8 | 1 | remat | 63 | near | 58 | gcc narrows `&0xfffffeff` on a 16-bit (lhu) value to `andi 0xfeff` (inline), but target hoisted -0x101 into $t4 (and-reg) in the loop preheader — a gcc-2.7.2 LICM-before-combine pass-ordering quirk unsteerable from C; that 1-ins gap cascades the constant-reg numbering + tail reassoc. Secondary: single-IV loop ptr anchors at +0xA (short, 2 accesses) not +0xC (byte) like target. | `.run/backlog_drafts/func_80177DA8.c` | +| 245 | func_801800F8 | 1 | schedule | 73 | near | 62 | body+frame(0x28)+addu-order all MATCH; sole residual = `move $a0,$v0` (func_8001C214 | `.run/backlog_drafts/func_801800F8.c` | +| 246 | func_80160B34 | 1 | struct | 15 | failed | | none — MATCH | `.run/backlog_drafts/func_80160B34.c` | +| 247 | func_80182338 | 1 | other | 26 | failed | | none — straight-line init; rely on gcc scheduler to hoist $a1/$v0=6 into prologue/delay-slot | `.run/backlog_drafts/func_80182338.c` | +| 248 | func_80184A68 | 1 | regalloc-order | 33 | failed | | none — MATCH | `.run/backlog_drafts/func_80184A68.c` | +| 249 | func_8015E018 | 1 | loose-typing | 47 | failed | | none — MATCH (signed char forces lbu+sll24/sra24 sign-extend; default char is unsigned in this toolchain) | `.run/backlog_drafts/func_8015E018.c` | +| 250 | func_80159A20 | 1 | struct | 58 | failed | | none — MATCH. Key lever: block tail-MERGE (gcc shared `bne ...,$L1` cross-jump) by making the two return-tests STRUCTURALLY DIFFERENT — positive `if(==){goto mask;} return;` per branch (not `if(!=) return;`), so neither tail can merge. Then fix block ORDER by inverting the outer test (`if(d!=1)` makes the ==4/return path the inline fall-through, the d==1/p[2] path the forward `beq`-target block — matching the target layout). | `.run/backlog_drafts/func_80159A20.c` | +| 251 | func_8013E958 | 1 | schedule | 63 | failed | | 2 ins swapped — cc1 emits `andi 0x7f; andi 0xff; beqz`(tests doubly-masked) but target wants `andi 0x7f; beqz; andi 0xff`(andi 0xff in the first beqz delay slot). Loop fully byte-matches; struct/ptr fold idioms nailed (D_80115110.q[0x16] hoists base+0x58 disp, Cell D_80115188[i].v folds %lo). func_800D0488 takes (m&0xFF) arg. s16 m -> 2 mism (right ins count); s32 m fixes order but merges andi+arg-move (62 ins, 1 short). | `.run/backlog_drafts/func_8013E958.c` | +| 252 | func_8013E83C | 1 | plumbing | 71 | failed | | none — MATCH (scalar global stores + 2 conditional calls; §3-T4 branch-polarity invert on the &0xFF test) | `.run/backlog_drafts/func_8013E83C.c` | +| 253 | func_8017B368 | 1 | schedule | 74 | failed | | dead table-path off by 1 ins — target keeps src*16 live in $s0 & computes 2nd arg src16+(base+8) in call1 delay slot; every C form either folds to e+8 (73 ins) or CSEs base into an extra saved reg $s2 (75 ins). All live code (prologue, sltiu dispatch, copy path, 4 struct-copy stores, tail) matches; only the unreachable func_8012F214 path scheduling diverges. | `.run/backlog_drafts/func_8017B368.c` | diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index ab88863e2f..4cfe2f0ee8 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -3,148 +3,148 @@ # source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: `make check-all`; # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. -FLEET REAL substantive : 214052 (of which dedup-shared 213338 via 1604 groups / 213382 instances) +FLEET REAL substantive : 214457 (of which dedup-shared 213740 via 1607 groups / 213784 instances) FLEET LINKED PsyQ objs : 959 -FLEET byte-identical : 215699 / 344010 = 62.70% (REAL+LINKED+empties) +FLEET byte-identical : 216104 / 344010 = 62.82% (REAL+LINKED+empties) FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 128304 +FLEET INCLUDE_ASM stubs : 127899 FLEET matchable : 344010 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | |---|---:|---:|---:|---:|---:|---:| | main | 54 | 2 | 959 | 1055 | 2096 | 50.3% | | resident | 123 | 0 | 0 | 125 | 146 | 85.6% | -| ov_SC01_000 | 1596 | 1596 | 0 | 1596 | 2403 | 66.4% | -| ov_SC01_001 | 1596 | 1596 | 0 | 1598 | 2467 | 64.8% | -| ov_SC01_004 | 1588 | 1588 | 0 | 1589 | 2416 | 65.8% | -| ov_SC01_005 | 1595 | 1595 | 0 | 1602 | 2504 | 64.0% | -| ov_SC01_006 | 1595 | 1595 | 0 | 1602 | 2504 | 64.0% | -| ov_SC01_008 | 1588 | 1588 | 0 | 1590 | 2428 | 65.5% | -| ov_SC01_009 | 1588 | 1588 | 0 | 1589 | 2510 | 63.3% | -| ov_SC01_074 | 1588 | 1588 | 0 | 1590 | 2427 | 65.5% | -| ov_SC01_077 | 2095 | 1556 | 0 | 2097 | 2586 | 81.1% | -| ov_SC01_080 | 1592 | 1592 | 0 | 1592 | 2515 | 63.3% | -| ov_SC01_084 | 1592 | 1592 | 0 | 1597 | 2581 | 61.9% | -| ov_SC02_000 | 1596 | 1596 | 0 | 1603 | 2684 | 59.7% | -| ov_SC02_003 | 1596 | 1596 | 0 | 1603 | 2684 | 59.7% | -| ov_SC02_004 | 1592 | 1592 | 0 | 1592 | 2403 | 66.3% | -| ov_SC02_005 | 1588 | 1588 | 0 | 1598 | 2930 | 54.5% | -| ov_SC02_011 | 1594 | 1594 | 0 | 1606 | 2896 | 55.5% | -| ov_SC02_015 | 1594 | 1594 | 0 | 1594 | 2416 | 66.0% | -| ov_SC02_016 | 1594 | 1594 | 0 | 1597 | 2548 | 62.7% | -| ov_SC02_017 | 1594 | 1594 | 0 | 1602 | 2735 | 58.6% | -| ov_SC02_021 | 1594 | 1594 | 0 | 1594 | 2439 | 65.4% | -| ov_SC02_026 | 1592 | 1592 | 0 | 1598 | 2575 | 62.1% | -| ov_SC02_027 | 1592 | 1592 | 0 | 1601 | 2695 | 59.4% | -| ov_SC02_028 | 1592 | 1592 | 0 | 1602 | 2704 | 59.2% | -| ov_SC02_031 | 1592 | 1592 | 0 | 1598 | 2565 | 62.3% | -| ov_SC02_035 | 1592 | 1592 | 0 | 1595 | 2523 | 63.2% | -| ov_SC02_039 | 1592 | 1592 | 0 | 1592 | 2418 | 65.8% | -| ov_SC02_041 | 1592 | 1592 | 0 | 1595 | 2563 | 62.2% | -| ov_SC03_001 | 1592 | 1592 | 0 | 1610 | 2870 | 56.1% | -| ov_SC03_002 | 1596 | 1596 | 0 | 1612 | 2632 | 61.2% | -| ov_SC03_003 | 1592 | 1592 | 0 | 1593 | 2425 | 65.7% | -| ov_SC03_006 | 1598 | 1598 | 0 | 1607 | 2768 | 58.1% | -| ov_SC03_007 | 1592 | 1592 | 0 | 1596 | 2626 | 60.8% | -| ov_SC03_010 | 1592 | 1592 | 0 | 1592 | 2472 | 64.4% | -| ov_SC03_011 | 1592 | 1592 | 0 | 1598 | 2530 | 63.2% | -| ov_SC03_012 | 1592 | 1592 | 0 | 1593 | 2408 | 66.2% | -| ov_SC03_013 | 1592 | 1592 | 0 | 1592 | 2495 | 63.8% | -| ov_SC03_014 | 1592 | 1592 | 0 | 1602 | 2688 | 59.6% | -| ov_SC03_015 | 1592 | 1592 | 0 | 1602 | 2688 | 59.6% | -| ov_SC03_023 | 1592 | 1592 | 0 | 1593 | 2437 | 65.4% | -| ov_SC03_024 | 1592 | 1592 | 0 | 1604 | 2644 | 60.7% | -| ov_SC03_028 | 1592 | 1592 | 0 | 1596 | 2667 | 59.8% | -| ov_SC03_029 | 1594 | 1594 | 0 | 1604 | 2647 | 60.6% | -| ov_SC03_030 | 1596 | 1596 | 0 | 1598 | 2498 | 64.0% | -| ov_SC03_031 | 1592 | 1592 | 0 | 1596 | 2517 | 63.4% | -| ov_SC03_089 | 1592 | 1592 | 0 | 1599 | 2584 | 61.9% | -| ov_SC03_090 | 1592 | 1592 | 0 | 1600 | 2628 | 60.9% | -| ov_SC03_091 | 1592 | 1592 | 0 | 1600 | 2643 | 60.5% | -| ov_SC03_092 | 1592 | 1592 | 0 | 1604 | 2590 | 61.9% | -| ov_SC03_093 | 1592 | 1592 | 0 | 1596 | 2566 | 62.2% | -| ov_SC03_094 | 1592 | 1592 | 0 | 1598 | 2579 | 62.0% | -| ov_SC03_095 | 1592 | 1592 | 0 | 1595 | 2477 | 64.4% | -| ov_SC03_096 | 1592 | 1592 | 0 | 1595 | 2468 | 64.6% | -| ov_SC03_097 | 1592 | 1592 | 0 | 1599 | 2606 | 61.4% | -| ov_SC03_098 | 1592 | 1592 | 0 | 1595 | 2544 | 62.7% | -| ov_SC03_099 | 1592 | 1592 | 0 | 1595 | 2507 | 63.6% | -| ov_SC03_100 | 1592 | 1592 | 0 | 1596 | 2542 | 62.8% | -| ov_SC03_101 | 1592 | 1592 | 0 | 1596 | 2531 | 63.1% | -| ov_SC03_102 | 1592 | 1592 | 0 | 1595 | 2495 | 63.9% | -| ov_SC03_103 | 1594 | 1594 | 0 | 1597 | 2513 | 63.5% | -| ov_SC03_104 | 1592 | 1592 | 0 | 1599 | 2619 | 61.1% | -| ov_SC03_105 | 1592 | 1592 | 0 | 1599 | 2600 | 61.5% | -| ov_SC03_108 | 1592 | 1592 | 0 | 1592 | 2446 | 65.1% | -| ov_SC03_109 | 1592 | 1592 | 0 | 1594 | 2426 | 65.7% | -| ov_SC03_110 | 1592 | 1592 | 0 | 1592 | 2471 | 64.4% | -| ov_SC03_111 | 1592 | 1592 | 0 | 1595 | 2513 | 63.5% | -| ov_SC03_112 | 1594 | 1594 | 0 | 1596 | 2529 | 63.1% | -| ov_SC03_113 | 1594 | 1594 | 0 | 1597 | 2471 | 64.6% | -| ov_SC03_114 | 1592 | 1592 | 0 | 1594 | 2417 | 65.9% | -| ov_SC03_115 | 1592 | 1592 | 0 | 1594 | 2475 | 64.4% | -| ov_SC03_116 | 1592 | 1592 | 0 | 1595 | 2441 | 65.3% | -| ov_SC03_117 | 1592 | 1592 | 0 | 1598 | 2560 | 62.4% | -| ov_SC03_118 | 1592 | 1592 | 0 | 1605 | 2688 | 59.7% | -| ov_SC03_119 | 1592 | 1592 | 0 | 1605 | 2688 | 59.7% | -| ov_SC03_121 | 1592 | 1592 | 0 | 1595 | 2462 | 64.8% | -| ov_SC03_124 | 1588 | 1588 | 0 | 1608 | 2744 | 58.6% | -| ov_SC03_125 | 1592 | 1592 | 0 | 1604 | 2591 | 61.9% | -| ov_SC03_126 | 1592 | 1592 | 0 | 1593 | 2425 | 65.7% | -| ov_SC04_000 | 1596 | 1596 | 0 | 1605 | 2547 | 63.0% | -| ov_SC04_002 | 1592 | 1592 | 0 | 1596 | 2639 | 60.5% | -| ov_SC04_003 | 1592 | 1592 | 0 | 1596 | 2505 | 63.7% | -| ov_SC04_004 | 1592 | 1592 | 0 | 1594 | 2561 | 62.2% | -| ov_SC04_005 | 1592 | 1592 | 0 | 1598 | 2615 | 61.1% | -| ov_SC04_006 | 1592 | 1592 | 0 | 1594 | 2456 | 64.9% | -| ov_SC04_007 | 1592 | 1592 | 0 | 1596 | 2572 | 62.1% | -| ov_SC04_008 | 1592 | 1592 | 0 | 1592 | 2417 | 65.9% | -| ov_SC04_009 | 1592 | 1592 | 0 | 1595 | 2443 | 65.3% | -| ov_SC04_010 | 1592 | 1592 | 0 | 1593 | 2421 | 65.8% | -| ov_SC04_011 | 1592 | 1592 | 0 | 1598 | 2806 | 56.9% | -| ov_SC04_012 | 1592 | 1592 | 0 | 1593 | 2422 | 65.8% | -| ov_SC04_015 | 1592 | 1592 | 0 | 1604 | 2614 | 61.4% | -| ov_SC04_016 | 1592 | 1592 | 0 | 1594 | 2442 | 65.3% | -| ov_SC04_018 | 1592 | 1592 | 0 | 1605 | 2858 | 56.2% | -| ov_SC04_019 | 1592 | 1592 | 0 | 1605 | 2858 | 56.2% | -| ov_SC04_020 | 1592 | 1592 | 0 | 1604 | 2570 | 62.4% | -| ov_SC04_021 | 1592 | 1592 | 0 | 1593 | 2425 | 65.7% | -| ov_SC05_000 | 1596 | 1596 | 0 | 1599 | 2422 | 66.0% | -| ov_SC05_001 | 1592 | 1592 | 0 | 1597 | 2577 | 62.0% | -| ov_SC05_002 | 1592 | 1592 | 0 | 1595 | 2445 | 65.2% | -| ov_SC05_003 | 1592 | 1592 | 0 | 1593 | 2484 | 64.1% | -| ov_SC05_004 | 1592 | 1592 | 0 | 1594 | 2467 | 64.6% | -| ov_SC05_005 | 1592 | 1592 | 0 | 1593 | 2494 | 63.9% | -| ov_SC05_006 | 1592 | 1592 | 0 | 1592 | 2432 | 65.5% | -| ov_SC05_007 | 1592 | 1592 | 0 | 1597 | 2485 | 64.3% | -| ov_SC05_008 | 1592 | 1592 | 0 | 1594 | 2546 | 62.6% | -| ov_SC05_009 | 1592 | 1592 | 0 | 1596 | 2440 | 65.4% | -| ov_SC05_010 | 1592 | 1592 | 0 | 1596 | 2591 | 61.6% | -| ov_SC05_011 | 1592 | 1592 | 0 | 1593 | 2411 | 66.1% | -| ov_SC05_017 | 1588 | 1588 | 0 | 1600 | 2845 | 56.2% | -| ov_SC05_018 | 1592 | 1592 | 0 | 1605 | 2676 | 60.0% | -| ov_SC05_019 | 1592 | 1592 | 0 | 1593 | 2425 | 65.7% | -| ov_SC06_000 | 1596 | 1596 | 0 | 1604 | 2692 | 59.6% | -| ov_SC06_006 | 1592 | 1592 | 0 | 1593 | 2514 | 63.4% | -| ov_SC06_008 | 1594 | 1594 | 0 | 1600 | 2544 | 62.9% | -| ov_SC06_010 | 1592 | 1592 | 0 | 1597 | 2520 | 63.4% | -| ov_SC06_011 | 1592 | 1592 | 0 | 1596 | 2471 | 64.6% | -| ov_SC06_013 | 1592 | 1592 | 0 | 1593 | 2427 | 65.6% | -| ov_SC06_014 | 1592 | 1592 | 0 | 1594 | 2455 | 64.9% | -| ov_SC06_015 | 1592 | 1592 | 0 | 1592 | 2423 | 65.7% | -| ov_SC06_016 | 1592 | 1592 | 0 | 1594 | 2552 | 62.5% | -| ov_SC06_018 | 1592 | 1592 | 0 | 1600 | 2668 | 60.0% | -| ov_SC06_020 | 1592 | 1592 | 0 | 1593 | 2521 | 63.2% | -| ov_SC06_022 | 1592 | 1592 | 0 | 1600 | 2645 | 60.5% | -| ov_SC06_024 | 1592 | 1592 | 0 | 1598 | 2670 | 59.9% | -| ov_SC06_025 | 1592 | 1592 | 0 | 1597 | 2575 | 62.0% | -| ov_SC06_027 | 1592 | 1592 | 0 | 1593 | 2410 | 66.1% | -| ov_SC06_029 | 1592 | 1592 | 0 | 1604 | 2665 | 60.2% | -| ov_SC06_030 | 1592 | 1592 | 0 | 1592 | 2459 | 64.7% | -| ov_SC06_032 | 1592 | 1592 | 0 | 1599 | 2661 | 60.1% | -| ov_SC06_033 | 1592 | 1592 | 0 | 1599 | 2634 | 60.7% | -| ov_SC07_000 | 1596 | 1596 | 0 | 1598 | 2522 | 63.4% | -| ov_SC07_001 | 1592 | 1592 | 0 | 1594 | 2457 | 64.9% | -| ov_SC07_002 | 1592 | 1592 | 0 | 1596 | 2582 | 61.8% | -| ov_SC07_008 | 1592 | 1592 | 0 | 1592 | 2388 | 66.7% | -| ov_SC07_009 | 1592 | 1592 | 0 | 1594 | 2432 | 65.5% | +| ov_SC01_000 | 1599 | 1599 | 0 | 1599 | 2403 | 66.5% | +| ov_SC01_001 | 1599 | 1599 | 0 | 1601 | 2467 | 64.9% | +| ov_SC01_004 | 1591 | 1591 | 0 | 1592 | 2416 | 65.9% | +| ov_SC01_005 | 1598 | 1598 | 0 | 1605 | 2504 | 64.1% | +| ov_SC01_006 | 1598 | 1598 | 0 | 1605 | 2504 | 64.1% | +| ov_SC01_008 | 1591 | 1591 | 0 | 1593 | 2428 | 65.6% | +| ov_SC01_009 | 1591 | 1591 | 0 | 1592 | 2510 | 63.4% | +| ov_SC01_074 | 1591 | 1591 | 0 | 1593 | 2427 | 65.6% | +| ov_SC01_077 | 2101 | 1559 | 0 | 2103 | 2586 | 81.3% | +| ov_SC01_080 | 1595 | 1595 | 0 | 1595 | 2515 | 63.4% | +| ov_SC01_084 | 1595 | 1595 | 0 | 1600 | 2581 | 62.0% | +| ov_SC02_000 | 1599 | 1599 | 0 | 1606 | 2684 | 59.8% | +| ov_SC02_003 | 1599 | 1599 | 0 | 1606 | 2684 | 59.8% | +| ov_SC02_004 | 1595 | 1595 | 0 | 1595 | 2403 | 66.4% | +| ov_SC02_005 | 1591 | 1591 | 0 | 1601 | 2930 | 54.6% | +| ov_SC02_011 | 1597 | 1597 | 0 | 1609 | 2896 | 55.6% | +| ov_SC02_015 | 1597 | 1597 | 0 | 1597 | 2416 | 66.1% | +| ov_SC02_016 | 1597 | 1597 | 0 | 1600 | 2548 | 62.8% | +| ov_SC02_017 | 1597 | 1597 | 0 | 1605 | 2735 | 58.7% | +| ov_SC02_021 | 1597 | 1597 | 0 | 1597 | 2439 | 65.5% | +| ov_SC02_026 | 1595 | 1595 | 0 | 1601 | 2575 | 62.2% | +| ov_SC02_027 | 1595 | 1595 | 0 | 1604 | 2695 | 59.5% | +| ov_SC02_028 | 1595 | 1595 | 0 | 1605 | 2704 | 59.4% | +| ov_SC02_031 | 1595 | 1595 | 0 | 1601 | 2565 | 62.4% | +| ov_SC02_035 | 1595 | 1595 | 0 | 1598 | 2523 | 63.3% | +| ov_SC02_039 | 1595 | 1595 | 0 | 1595 | 2418 | 66.0% | +| ov_SC02_041 | 1595 | 1595 | 0 | 1598 | 2563 | 62.3% | +| ov_SC03_001 | 1595 | 1595 | 0 | 1613 | 2870 | 56.2% | +| ov_SC03_002 | 1599 | 1599 | 0 | 1615 | 2632 | 61.4% | +| ov_SC03_003 | 1595 | 1595 | 0 | 1596 | 2425 | 65.8% | +| ov_SC03_006 | 1601 | 1601 | 0 | 1610 | 2768 | 58.2% | +| ov_SC03_007 | 1595 | 1595 | 0 | 1599 | 2626 | 60.9% | +| ov_SC03_010 | 1595 | 1595 | 0 | 1595 | 2472 | 64.5% | +| ov_SC03_011 | 1595 | 1595 | 0 | 1601 | 2530 | 63.3% | +| ov_SC03_012 | 1595 | 1595 | 0 | 1596 | 2408 | 66.3% | +| ov_SC03_013 | 1595 | 1595 | 0 | 1595 | 2495 | 63.9% | +| ov_SC03_014 | 1595 | 1595 | 0 | 1605 | 2688 | 59.7% | +| ov_SC03_015 | 1595 | 1595 | 0 | 1605 | 2688 | 59.7% | +| ov_SC03_023 | 1595 | 1595 | 0 | 1596 | 2437 | 65.5% | +| ov_SC03_024 | 1595 | 1595 | 0 | 1607 | 2644 | 60.8% | +| ov_SC03_028 | 1595 | 1595 | 0 | 1599 | 2667 | 60.0% | +| ov_SC03_029 | 1597 | 1597 | 0 | 1607 | 2647 | 60.7% | +| ov_SC03_030 | 1599 | 1599 | 0 | 1601 | 2498 | 64.1% | +| ov_SC03_031 | 1595 | 1595 | 0 | 1599 | 2517 | 63.5% | +| ov_SC03_089 | 1595 | 1595 | 0 | 1602 | 2584 | 62.0% | +| ov_SC03_090 | 1595 | 1595 | 0 | 1603 | 2628 | 61.0% | +| ov_SC03_091 | 1595 | 1595 | 0 | 1603 | 2643 | 60.7% | +| ov_SC03_092 | 1595 | 1595 | 0 | 1607 | 2590 | 62.0% | +| ov_SC03_093 | 1595 | 1595 | 0 | 1599 | 2566 | 62.3% | +| ov_SC03_094 | 1595 | 1595 | 0 | 1601 | 2579 | 62.1% | +| ov_SC03_095 | 1595 | 1595 | 0 | 1598 | 2477 | 64.5% | +| ov_SC03_096 | 1595 | 1595 | 0 | 1598 | 2468 | 64.7% | +| ov_SC03_097 | 1595 | 1595 | 0 | 1602 | 2606 | 61.5% | +| ov_SC03_098 | 1595 | 1595 | 0 | 1598 | 2544 | 62.8% | +| ov_SC03_099 | 1595 | 1595 | 0 | 1598 | 2507 | 63.7% | +| ov_SC03_100 | 1595 | 1595 | 0 | 1599 | 2542 | 62.9% | +| ov_SC03_101 | 1595 | 1595 | 0 | 1599 | 2531 | 63.2% | +| ov_SC03_102 | 1595 | 1595 | 0 | 1598 | 2495 | 64.0% | +| ov_SC03_103 | 1597 | 1597 | 0 | 1600 | 2513 | 63.7% | +| ov_SC03_104 | 1595 | 1595 | 0 | 1602 | 2619 | 61.2% | +| ov_SC03_105 | 1595 | 1595 | 0 | 1602 | 2600 | 61.6% | +| ov_SC03_108 | 1595 | 1595 | 0 | 1595 | 2446 | 65.2% | +| ov_SC03_109 | 1595 | 1595 | 0 | 1597 | 2426 | 65.8% | +| ov_SC03_110 | 1595 | 1595 | 0 | 1595 | 2471 | 64.5% | +| ov_SC03_111 | 1595 | 1595 | 0 | 1598 | 2513 | 63.6% | +| ov_SC03_112 | 1597 | 1597 | 0 | 1599 | 2529 | 63.2% | +| ov_SC03_113 | 1597 | 1597 | 0 | 1600 | 2471 | 64.8% | +| ov_SC03_114 | 1595 | 1595 | 0 | 1597 | 2417 | 66.1% | +| ov_SC03_115 | 1595 | 1595 | 0 | 1597 | 2475 | 64.5% | +| ov_SC03_116 | 1595 | 1595 | 0 | 1598 | 2441 | 65.5% | +| ov_SC03_117 | 1595 | 1595 | 0 | 1601 | 2560 | 62.5% | +| ov_SC03_118 | 1595 | 1595 | 0 | 1608 | 2688 | 59.8% | +| ov_SC03_119 | 1595 | 1595 | 0 | 1608 | 2688 | 59.8% | +| ov_SC03_121 | 1595 | 1595 | 0 | 1598 | 2462 | 64.9% | +| ov_SC03_124 | 1591 | 1591 | 0 | 1611 | 2744 | 58.7% | +| ov_SC03_125 | 1595 | 1595 | 0 | 1607 | 2591 | 62.0% | +| ov_SC03_126 | 1595 | 1595 | 0 | 1596 | 2425 | 65.8% | +| ov_SC04_000 | 1599 | 1599 | 0 | 1608 | 2547 | 63.1% | +| ov_SC04_002 | 1595 | 1595 | 0 | 1599 | 2639 | 60.6% | +| ov_SC04_003 | 1595 | 1595 | 0 | 1599 | 2505 | 63.8% | +| ov_SC04_004 | 1595 | 1595 | 0 | 1597 | 2561 | 62.4% | +| ov_SC04_005 | 1595 | 1595 | 0 | 1601 | 2615 | 61.2% | +| ov_SC04_006 | 1595 | 1595 | 0 | 1597 | 2456 | 65.0% | +| ov_SC04_007 | 1595 | 1595 | 0 | 1599 | 2572 | 62.2% | +| ov_SC04_008 | 1595 | 1595 | 0 | 1595 | 2417 | 66.0% | +| ov_SC04_009 | 1595 | 1595 | 0 | 1598 | 2443 | 65.4% | +| ov_SC04_010 | 1595 | 1595 | 0 | 1596 | 2421 | 65.9% | +| ov_SC04_011 | 1595 | 1595 | 0 | 1601 | 2806 | 57.1% | +| ov_SC04_012 | 1595 | 1595 | 0 | 1596 | 2422 | 65.9% | +| ov_SC04_015 | 1595 | 1595 | 0 | 1607 | 2614 | 61.5% | +| ov_SC04_016 | 1595 | 1595 | 0 | 1597 | 2442 | 65.4% | +| ov_SC04_018 | 1595 | 1595 | 0 | 1608 | 2858 | 56.3% | +| ov_SC04_019 | 1595 | 1595 | 0 | 1608 | 2858 | 56.3% | +| ov_SC04_020 | 1595 | 1595 | 0 | 1607 | 2570 | 62.5% | +| ov_SC04_021 | 1595 | 1595 | 0 | 1596 | 2425 | 65.8% | +| ov_SC05_000 | 1599 | 1599 | 0 | 1602 | 2422 | 66.1% | +| ov_SC05_001 | 1595 | 1595 | 0 | 1600 | 2577 | 62.1% | +| ov_SC05_002 | 1595 | 1595 | 0 | 1598 | 2445 | 65.4% | +| ov_SC05_003 | 1595 | 1595 | 0 | 1596 | 2484 | 64.3% | +| ov_SC05_004 | 1595 | 1595 | 0 | 1597 | 2467 | 64.7% | +| ov_SC05_005 | 1595 | 1595 | 0 | 1596 | 2494 | 64.0% | +| ov_SC05_006 | 1595 | 1595 | 0 | 1595 | 2432 | 65.6% | +| ov_SC05_007 | 1595 | 1595 | 0 | 1600 | 2485 | 64.4% | +| ov_SC05_008 | 1595 | 1595 | 0 | 1597 | 2546 | 62.7% | +| ov_SC05_009 | 1595 | 1595 | 0 | 1599 | 2440 | 65.5% | +| ov_SC05_010 | 1595 | 1595 | 0 | 1599 | 2591 | 61.7% | +| ov_SC05_011 | 1595 | 1595 | 0 | 1596 | 2411 | 66.2% | +| ov_SC05_017 | 1591 | 1591 | 0 | 1603 | 2845 | 56.3% | +| ov_SC05_018 | 1595 | 1595 | 0 | 1608 | 2676 | 60.1% | +| ov_SC05_019 | 1595 | 1595 | 0 | 1596 | 2425 | 65.8% | +| ov_SC06_000 | 1599 | 1599 | 0 | 1607 | 2692 | 59.7% | +| ov_SC06_006 | 1595 | 1595 | 0 | 1596 | 2514 | 63.5% | +| ov_SC06_008 | 1597 | 1597 | 0 | 1603 | 2544 | 63.0% | +| ov_SC06_010 | 1595 | 1595 | 0 | 1600 | 2520 | 63.5% | +| ov_SC06_011 | 1595 | 1595 | 0 | 1599 | 2471 | 64.7% | +| ov_SC06_013 | 1595 | 1595 | 0 | 1596 | 2427 | 65.8% | +| ov_SC06_014 | 1595 | 1595 | 0 | 1597 | 2455 | 65.1% | +| ov_SC06_015 | 1595 | 1595 | 0 | 1595 | 2423 | 65.8% | +| ov_SC06_016 | 1595 | 1595 | 0 | 1597 | 2552 | 62.6% | +| ov_SC06_018 | 1595 | 1595 | 0 | 1603 | 2668 | 60.1% | +| ov_SC06_020 | 1595 | 1595 | 0 | 1596 | 2521 | 63.3% | +| ov_SC06_022 | 1595 | 1595 | 0 | 1603 | 2645 | 60.6% | +| ov_SC06_024 | 1595 | 1595 | 0 | 1601 | 2670 | 60.0% | +| ov_SC06_025 | 1595 | 1595 | 0 | 1600 | 2575 | 62.1% | +| ov_SC06_027 | 1595 | 1595 | 0 | 1596 | 2410 | 66.2% | +| ov_SC06_029 | 1595 | 1595 | 0 | 1607 | 2665 | 60.3% | +| ov_SC06_030 | 1595 | 1595 | 0 | 1595 | 2459 | 64.9% | +| ov_SC06_032 | 1595 | 1595 | 0 | 1602 | 2661 | 60.2% | +| ov_SC06_033 | 1595 | 1595 | 0 | 1602 | 2634 | 60.8% | +| ov_SC07_000 | 1599 | 1599 | 0 | 1601 | 2522 | 63.5% | +| ov_SC07_001 | 1595 | 1595 | 0 | 1597 | 2457 | 65.0% | +| ov_SC07_002 | 1595 | 1595 | 0 | 1599 | 2582 | 61.9% | +| ov_SC07_008 | 1595 | 1595 | 0 | 1595 | 2388 | 66.8% | +| ov_SC07_009 | 1595 | 1595 | 0 | 1597 | 2432 | 65.7% | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 609623b9df..cbc6bf26bf 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -31,10 +31,16 @@ HEAD = the commit below. Grinder still running (token-free, banked 0 — the per **★ ENABLER FIX (committed this session):** `worker_wave.js` now derives each agent's `match_one` self-check `--asm-subdir` from `t.asm` (was hardcoded to the MAIN subdir → every `_a` agent self-check crashed on a missing `.s` → blind drafting). THIS produced the high close rate (16/24); without it the `_a` wave drafts blind. -**★ NEXT — two robustness fixes so future `_a` waves AUTO-realize ×134 (then SCALE ~60 more `_a` fns = multi-% runway):** -1. **`dedup_propagate`: drop-the-straggler, not all-or-nothing.** On a batch byte-gate fail, identify + drop the culprit fn(s) (the byte-gate is truth — a false-reach fn should be skipped, not poison the batch), proceed with the clean subset. Plus permanently exclude the -O0 overlay-local cluster from `--auto-from`. -2. **`gate_stage`: surface dedup_propagate failures** (check return code / log output) so "propagated: 0" can never silently hide a real gain again. -Then loop `_a` waves (each auto-realizing ×134). **Pending Drew's direction** (he asked to report the yield before scaling). +**★ FIXES DONE + VALIDATED (this session) — the `_a` pipeline is now HANDS-FREE:** +1. **`gate_stage` surfaces propagation failures** (`commit:0269`): `prop_error` + `.run/auto/last_propagate_error.log` — no more silent swallow (it caught wave-2's failure live). +2. **`dedup_propagate` excludes -O0 overlay-local fns from `--auto-from`** (`commit:0269`): `*_o0.c` defs (incl. func_8013C360) never cross-overlay-propagate (find_site-detected; --addr still forces). +3. **`dedup_propagate` DROP-STRAGGLER retry** (refactor): on a byte-gate fail it isolates the culprit(s) for the failing overlay (per-fn trial), drops them (kept ×1), and retries the survivors — handles BOTH straggler classes (-O0 byte-mismatch + cross-overlay loose-typing compile-error) failing ANY overlay. Byte-gate stays sole arbiter; the plan strictly shrinks so it always terminates. + +**★ WAVE-2 (validated the fixes end-to-end):** 24 fresh `_a` targets → 13 self-MATCH → gate banked **6** (the `_a` path SKIPS sig_unify, so def-side near-misses don't auto-recover → lower bank rate than main). Drop-straggler `--auto-from` then auto-dropped 2 loose-typing stragglers (func_8012E5CC/func_8012C750 — compile-fail ov_SC01_000, kept ×1) + propagated **3 clean ×134** (`commit:0271`). The 11 near-misses are permuter-class schedule/regalloc walls (grinder fuel; 7 were last wave's re-attempts, still walls). + +**★ SESSION ARC: 62.31% → 62.82% (+0.51%):** wave-1 +10 ×134 (`commit:0267`) · wave-2 +6 ×1 (`commit:0270`) +3 ×134 (`commit:0271`). 136/136 byte-identical, 0 NON_MATCHING throughout. + +**★ NEXT — the `_a` scaling loop is now hands-free (~55 fresh `_a` reach-134 fns remain):** `wave_targets --pool tractable --region a` → worker_wave → `gate_stage --src-file --commit` (auto-drops stragglers + auto-propagates clean ×134). ~+0.2–0.4% fleet/wave. **Improvement idea:** a def-side recovery that doesn't drop `_a` drafts would lift the `_a` bank rate (sig_unify-skip is the current cap). **Pending Drew's direction** (continue scaling vs checkpoint/close). --- diff --git a/tools/dedup_propagate.py b/tools/dedup_propagate.py index e07eb9d338..a601a102d5 100644 --- a/tools/dedup_propagate.py +++ b/tools/dedup_propagate.py @@ -383,99 +383,132 @@ def main(): print("(--check-only: no files touched)") return - # ---- apply (in-memory snapshot of every file we touch, for fail-closed restore) + # ---- apply machinery (extracted so the drop-straggler retry can re-apply a sub-plan). header_path = ROOT / a.header - touched = {} # path -> original text (None if newly created) + DEFAULT_H = ("/* src/shared/engine_core.h — Phase 15 shared engine-core bodies (cross-overlay dedup, §14).\n" + " * Each DEFINE_func_XXXX() expands to the WHOLE matched body once; instantiated in place at the\n" + " * func_XXXX site in every overlay that shares it (address order preserved). Registry +\n" + " * byte-honesty: config/dedup.us.yaml + tools/dedup_integrate.py. Tool-generated; do not hand-edit. */\n" + "#ifndef SHARED_ENGINE_CORE_H\n#define SHARED_ENGINE_CORE_H\n#include \"common.h\"\n\n#endif\n") + MACRO_RE = re.compile(r'^\s*DEFINE_func_([0-9A-Fa-f]+)\(\)') - def edit(path, newtext): - if path not in touched: - touched[path] = path.read_text() if path.exists() else None - path.write_text(newtext) + def apply_plan(subplan, restrict=None): + """Author each fn's macro into engine_core.h + instantiate it at its site in every member + overlay (optionally restricted to a set — the per-fn straggler trial uses one overlay). Edit + each member overlay ONCE (group by overlay; stub lines replace 1:1, inline defs splice in + REVERSE order). Returns (touched, changed); caller byte-gates `changed` then restore(touched).""" + touched = {} + def _edit(path, newtext): + if path not in touched: + touched[path] = path.read_text() if path.exists() else None + path.write_text(newtext) + htext = header_path.read_text() if header_path.exists() else DEFAULT_H + for p in subplan: + if f"DEFINE_{sym(p['addr'])}()" not in htext: + htext = htext.replace("\n#endif\n", "\n" + make_macro(p["addr"], p["body"]) + "\n#endif\n") + _edit(header_path, htext) + by_ov = {} + for p in subplan: + for ov in p["members"]: + if restrict and ov not in restrict: + continue + by_ov.setdefault(ov, []).append(p) + changed = [] + for ov in sorted(by_ov): + remaining = {p["addr"]: p for p in by_ov[ov]} # targets not yet placed in a file + ovc = False + for cp, asm_sub in overlay_files(ov): # main + Phase-19 split files (_a/_o0) + if not remaining: + break + lines = ensure_include(cp.read_text(), a.header).splitlines(keepends=True) + sp = re.compile(rf'^\s*INCLUDE_ASM\("asm/{re.escape(ov)}/nonmatchings/{re.escape(asm_sub)}",\s*func_([0-9A-Fa-f]+)\);\s*$') + stub_idx, macro_set = {}, set() + for i, l in enumerate(lines): + ms = sp.match(l) + if ms: stub_idx[int(ms.group(1), 16)] = i; continue + mm = MACRO_RE.match(l) + if mm: macro_set.add(int(mm.group(1), 16)) + joined = "".join(lines) + line_repls, def_ranges = {}, [] + for ad in list(remaining): + if ad in macro_set: + del remaining[ad]; continue # already instantiated in this file (idempotent) + repl = f"DEFINE_{sym(ad)}() /* dedup: shared engine-core @0x{ad:08X} (src/shared) */\n" + if ad in stub_idx: + line_repls[stub_idx[ad]] = repl; del remaining[ad]; ovc = True + else: + site = find_site(joined, ov, ad) # inline def in THIS file? (else try the next split file) + if site and site[0] == "def": + def_ranges.append((site[1], site[2], repl)); del remaining[ad]; ovc = True + if line_repls or def_ranges: + for idx, repl in line_repls.items(): + lines[idx] = repl + for start, end, repl in sorted(def_ranges, key=lambda x: -x[0]): + lines[start:end + 1] = [repl] + _edit(cp, "".join(lines)) + if ovc: + changed.append(ov) + return touched, changed - # author macros - htext = header_path.read_text() if header_path.exists() else \ - ("/* src/shared/engine_core.h — Phase 15 shared engine-core bodies (cross-overlay dedup, §14).\n" - " * Each DEFINE_func_XXXX() expands to the WHOLE matched body once; instantiated in place at the\n" - " * func_XXXX site in every overlay that shares it (address order preserved). Registry +\n" - " * byte-honesty: config/dedup.us.yaml + tools/dedup_integrate.py. Tool-generated; do not hand-edit. */\n" - "#ifndef SHARED_ENGINE_CORE_H\n#define SHARED_ENGINE_CORE_H\n#include \"common.h\"\n\n#endif\n") - for p in plan: - if f"DEFINE_{sym(p['addr'])}()" not in htext: - macro = make_macro(p["addr"], p["body"]) - htext = htext.replace("\n#endif\n", "\n" + macro + "\n#endif\n") - edit(header_path, htext) - - def restore(): + def restore(touched): for path, orig in touched.items(): if orig is None: path.unlink(missing_ok=True) else: path.write_text(orig) - # ---- edit each member overlay ONCE (group targets by overlay -> one read/write per file, not per - # (function,overlay) — essential at fleet scale). Stub lines replace 1:1 (no line shift); the source - # overlay's inline defs splice by range in REVERSE line order (so earlier indices stay valid). - by_ov = {} - for p in plan: - for ov in p["members"]: - by_ov.setdefault(ov, []).append(p) - MACRO_RE = re.compile(r'^\s*DEFINE_func_([0-9A-Fa-f]+)\(\)') - changed = [] - for ov in sorted(by_ov): - remaining = {p["addr"]: p for p in by_ov[ov]} # targets not yet placed in a file - ovc = False - for cp, asm_sub in overlay_files(ov): # main + Phase-19 split files (_a/_o0) - if not remaining: - break - lines = ensure_include(cp.read_text(), a.header).splitlines(keepends=True) - sp = re.compile(rf'^\s*INCLUDE_ASM\("asm/{re.escape(ov)}/nonmatchings/{re.escape(asm_sub)}",\s*func_([0-9A-Fa-f]+)\);\s*$') - stub_idx, macro_set = {}, set() - for i, l in enumerate(lines): - ms = sp.match(l) - if ms: stub_idx[int(ms.group(1), 16)] = i; continue - mm = MACRO_RE.match(l) - if mm: macro_set.add(int(mm.group(1), 16)) - joined = "".join(lines) - line_repls, def_ranges = {}, [] - for ad in list(remaining): - if ad in macro_set: - del remaining[ad]; continue # already instantiated in this file (idempotent) - repl = f"DEFINE_{sym(ad)}() /* dedup: shared engine-core @0x{ad:08X} (src/shared) */\n" - if ad in stub_idx: - line_repls[stub_idx[ad]] = repl; del remaining[ad]; ovc = True - else: - site = find_site(joined, ov, ad) # inline def in THIS file? (else try the next split file) - if site and site[0] == "def": - def_ranges.append((site[1], site[2], repl)); del remaining[ad]; ovc = True - if line_repls or def_ranges: - for idx, repl in line_repls.items(): - lines[idx] = repl - for start, end, repl in sorted(def_ranges, key=lambda x: -x[0]): - lines[start:end + 1] = [repl] - edit(cp, "".join(lines)) - if ovc: - changed.append(ov) - - # structural check the byte-gate CANNOT catch (a leftover stub is itself byte-identical): every - # claimed member must now instantiate the macro and have no stub. One read per changed overlay. - incasm = lambda ad: re.compile(rf'INCLUDE_ASM\("[^"]+",\s*{sym(ad)}\)') - for ov in changed: - t = source_text(ov) # all split files (post-edit, from disk) - for p in by_ov[ov]: - if f"DEFINE_{sym(p['addr'])}()" not in t: - restore(); sys.exit(f"[FAIL] {ov}: 0x{p['addr']:08X} not instantiated — REVERTED") - if incasm(p["addr"]).search(t): - restore(); sys.exit(f"[FAIL] {ov}: 0x{p['addr']:08X} stub still present — REVERTED") - - # byte-gate only the overlays that actually changed (an already-macro member didn't change). - if not a.no_gate: + def struct_check(subplan, changed, touched): + # the byte-gate CANNOT catch a leftover stub (it is itself byte-identical): every claimed + # member must now instantiate the macro and have no stub. One read per changed overlay. + incasm = lambda ad: re.compile(rf'INCLUDE_ASM\("[^"]+",\s*{sym(ad)}\)') for ov in changed: - ok, log = byte_gate(ov) - if not ok: - tail = "\n".join(log.splitlines()[-12:]) - print(f"[FAIL] {ov} not byte-identical — REVERTING ALL.\n{tail}") - restore(); sys.exit(1) - print(f"[ OK ] {len(changed)} overlays byte-identical after propagation") + t = source_text(ov) # all split files (post-edit, from disk) + for p in (pp for pp in subplan if ov in pp["members"]): + if f"DEFINE_{sym(p['addr'])}()" not in t: + restore(touched); sys.exit(f"[FAIL] {ov}: 0x{p['addr']:08X} not instantiated — REVERTED") + if incasm(p["addr"]).search(t): + restore(touched); sys.exit(f"[FAIL] {ov}: 0x{p['addr']:08X} stub still present — REVERTED") + + # ---- apply with DROP-STRAGGLER retry. A fn whose shared C body, in some OTHER overlay's TU, + # byte-mismatches (-O0 per-overlay %lo data) or compile-errors (cross-overlay loose-typed callee + # decls — cont.4 wave-2) would, under an all-or-nothing batch revert, poison every CLEAN match. + # So on a byte-gate failure: isolate the culprit(s) for the failing overlay (per-fn trial), drop + # them (they stay matched ×1 in the source), and retry the batch with the survivors. The byte-gate + # stays the sole arbiter (G3/P9) — a dropped fn is never banked anywhere it isn't byte-identical. + while plan: + touched, changed = apply_plan(plan) + struct_check(plan, changed, touched) + if a.no_gate: + break + fail_ov = None + for ov in changed: + if not byte_gate(ov)[0]: + fail_ov = ov; break + if fail_ov is None: + print(f"[ OK ] {len(changed)} overlays byte-identical after propagation") + break + restore(touched) + survivors, dropped = [], [] + for p in plan: + if fail_ov not in p["members"]: + survivors.append(p); continue + t2, c2 = apply_plan([p], restrict={fail_ov}) + pok = byte_gate(fail_ov)[0] if fail_ov in c2 else True + restore(t2) + (survivors if pok else dropped).append(p) + if dropped: + print(f"[drop] {fail_ov}: {len(dropped)} cross-overlay straggler(s) " + f"(loose-typing/overlay-local, kept ×1): " + ", ".join(f"0x{p['addr']:08X}" for p in dropped)) + else: + # fail_ov fails with the full batch but no single fn is a culprit -> a multi-fn interaction; + # conservatively drop every fn targeting fail_ov (rare; kept ×1) so the rest can proceed. + tofail = [p for p in plan if fail_ov in p["members"]] + print(f"[drop] {fail_ov}: byte-gate fails with no single-fn culprit (interaction) — " + f"dropping its {len(tofail)} fn(s), kept ×1") + survivors = [p for p in plan if fail_ov not in p["members"]] + plan = survivors + if not plan: + sys.exit("[error] all candidates dropped — no cleanly-shareable function") # ---- register groups (compact shorthand: position-locked -> vram + binaries list) groups = [dict(id=f"E_{sym(p['addr'])}", tier=a.tier, hash=p["hash"],