Files
BFM-decomp/docs/worklist.md
T
Drew T a302908f24 fix(phase-26a): A3 — target selection was blind to 91.6% of the remaining work; now derived
The audit's CRITICAL finding, fixed at the root. Both tools now derive the corpus from
tools/corpus.py instead of keeping their own decaying copy of the tree layout.

build_fuel_manifest.live_stubs() — a hardcoded 3-file dict {<ov>.c, _a.c, _o0.c}. ov_SC01_077 has
FOURTEEN .c files, so it saw 30 of 264 stubs AND REPORTED SUCCESS. Everything downstream consumes
this manifest — worklist.py (100% of its rows), wave_targets.py (100% of its pools) — so:

    targets            30  ->  263
    reach-134 targets  10  ->  127      (the ENTIRE high-ROI band was invisible)
    remaining gain  83,305 ->  994,633 instructions

994,633 is the A2 audit's predicted figure TO THE UNIT — a fourth independent confirmation
(auditor -> skeptic -> corpus.py -> this). Four of the five highest-leverage functions in the whole
project sit in split regions no tool could see; the top one, func_80178004 (165 ins x reach 134 =
22,110), had never been nominated by anything.

It rotted SILENTLY: .run/fuel_manifest.json (Jul 8) recorded 130 stubs; the same code today returns
30, because the Phase-26 jr splits moved ~100 stubs out from under a dict literal last edited in
Phase 22. Nobody noticed, because a target that is never nominated produces SILENCE, not an error.

wave_targets.REGION_SUB / asm_for() — a 3-entry dict with a silent fallback to the main subdir.
ov_SC01_077 has TWELVE asm subdirs, so 78 of the 87 targets any --class wave emitted handed a
drafter an asm path THAT DOES NOT EXIST. The drafter then drafts against nothing, and the wasted
attempt is booked in the backlog as a *matching* failure — which feeds reserved_walls() and
PERMANENTLY BLACKLISTS a function that was never actually attempted. A silent skip compounding into
a false wall. Now 263/263 asm paths resolve, 0 missing; asm_for() raises rather than guess.
Also: --region's 3-value whitelist defaulted to 'main', which sees 13 of 264 stubs even with a
correct manifest -> default 'any', free-form.

R33 throughout: the INCLUDE_ASM line is SELF-DESCRIBING (its first argument IS the asm subdir,
because splat wrote it there), so both dicts were second copies of a fact the tree already states.
A dict literal is strictly worse than the filesystem AND it fails OPEN. Never re-introduce one.

No build impact (selection/report tools only); docs/worklist.md regenerated with the honest numbers.
2026-07-14 09:22:31 -06:00

233 lines
30 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Worklist — remaining functions ranked by byte-weighted project gain
> Generated by `tools/worklist.py` from `.run/fuel_manifest.json` + `.run/backlog.jsonl`. Ranked by **byte-weighted gain** `gain_ins = reach × nins` (fleet instructions made byte-identical once matched **and** propagated ×134 — the decomp.dev-comparable metric the giants move, NOT function-count). `%rem` = share of ALL remaining gain; `cum%` = running total (shows how few giants capture most of it). `close` = backlog match_one mismatch count (lower = nearer; blank = not yet attempted). Byte-gate (harvest_verify) is the sole arbiter (G3/P9).
**Live stubs:** 263 · **total remaining gain:** 994,633 ins (3,978,532 bytes ×-fleet)
## Idiom-class summary (the groups)
| class | count | gain_ins | % of remaining |
|-------|------:|---------:|---------------:|
| GIANT | 2 | 48,642 | 4.9% |
| STRUCT | 69 | 40,281 | 4.0% |
| PINS | 24 | 87,388 | 8.8% |
| WAVE | 146 | 755,917 | 76.0% |
| O0 | 7 | 4,704 | 0.5% |
| O1 | 1 | 4,556 | 0.5% |
| STUB | 14 | 53,145 | 5.3% |
## Top 40 remaining gains (all classes)
| # | name | class | reach | nins | gain_ins | %rem | cum% | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_801412A8 | GIANT | 134 | 198 | 26532 | 2.67 | 2.7 | Y | main | 110 | 110 mismatch (count-exact 198/198). S11 LUID(x)alloc: register-assignment permutation + prim2 store-schedule.… | `.run/backlog_drafts/func_801412A8.c` |
| 2 | func_80178004 | GIANT | 134 | 165 | 22110 | 2.22 | 4.9 | Y | jr_801734BC | 0 | none — MATCH (full register pins per sibling func_80177EA4; running-ptr $s2 to stop unroll-rebase; | `.run/backlog_drafts/func_80178004.c` |
| 3 | func_8014F4C0 | WAVE | 134 | 141 | 18894 | 1.90 | 6.8 | Y | after | 127 | residual: 127 mismatch | `.run/backlog_drafts/func_8014F4C0.c` |
| 4 | func_8014ADE0 | WAVE | 134 | 139 | 18626 | 1.87 | 8.7 | Y | after | 19 | 16 ins off — all compiler-internal ties: (1) 0xAAA8 const lands $v0 vs target $v1; | `.run/backlog_drafts/func_8014ADE0.c` |
| 5 | func_80137DD4 | STRUCT | 134 | 129 | 17286 | 1.74 | 10.4 | Y | jr_8012ACE0 | 107 | regalloc fully matches (frame -0x30; s4/s3/s5=params, s2=mask, s1=ptr w/ in-place +0x24 reuse, s0=acc+reused … | `.run/backlog_drafts/func_80137DD4.c` |
| 6 | func_80174CB0 | WAVE | 134 | 123 | 16482 | 1.66 | 12.1 | Y | jr_801734BC | 0 | close=0 match_one MATCH but its anon typedef is named 'Buf' which COLLIDES with the existing 'Buf' (s16 h[8],… | `.run/backlog_drafts/func_80174CB0.c` |
| 7 | func_801325B8 | WAVE | 134 | 113 | 15142 | 1.52 | 13.6 | Y | jr_8012ACE0 | 4 | 4/113 — prologue save-order of the $s0(cur/p3) vs $s5(p1) pair; gcc emits | `.run/backlog_drafts/func_801325B8.c` |
| 8 | func_801330E0 | STUB | 134 | 110 | 14740 | 1.48 | 15.1 | Y | jr_8012ACE0 | 79 | none — MATCH (110/110 words byte-identical via objcopy raw .text, reloc-masked on jal+%hi/%lo(D_800AF648)). m… | `.run/backlog_drafts/func_801330E0.c` |
| 9 | func_8014E284 | WAVE | 134 | 108 | 14472 | 1.46 | 16.5 | Y | after | 83 | WAVE: 83 mismatch | `.run/backlog_drafts/func_8014E284.c` |
| 10 | func_8012CC88 | WAVE | 134 | 105 | 14070 | 1.41 | 17.9 | Y | jr_8012ACE0 | 0 | none — MATCH (105 ins, relocation-masked) | `.run/backlog_drafts/func_8012CC88.c` |
| 11 | func_80169228 | WAVE | 134 | 105 | 14070 | 1.41 | 19.3 | Y | jr_8015AE2C | 0 | none — MATCH (105 ins, relocation-masked). Key levers: arg0/p pinned $s1/$s0, | `.run/backlog_drafts/func_80169228.c` |
| 12 | func_80167714 | WAVE | 134 | 104 | 13936 | 1.40 | 20.7 | Y | jr_8015AE2C | 0 | none — MATCH (104 ins) | `.run/backlog_drafts/func_80167714.c` |
| 13 | func_801463A0 | WAVE | 134 | 101 | 13534 | 1.36 | 22.1 | Y | after | 0 | none — MATCH (101 ins, match_one); real symbol names; misaligned 8B copy + s16 stores + masked B9C last | `.run/backlog_drafts/func_801463A0.c` |
| 14 | func_80177940 | WAVE | 134 | 101 | 13534 | 1.36 | 23.5 | Y | jr_801734BC | 65 | prologue+setup (35 ins) byte-match exactly; loop body diverges on gcc loop-invariant hoist ORDERING (schedule… | `.run/backlog_drafts/func_80177940.c` |
| 15 | func_801387B8 | WAVE | 134 | 100 | 13400 | 1.35 | 24.8 | Y | jr_801380E0 | 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 l… | `.run/backlog_drafts/func_801387B8.c` |
| 16 | func_801379FC | WAVE | 134 | 97 | 12998 | 1.31 | 26.1 | Y | jr_8012ACE0 | 0 | none — MATCH (match_one 97/97) | `.run/backlog_drafts/func_801379FC.c` |
| 17 | func_8014CD80 | WAVE | 134 | 97 | 12998 | 1.31 | 27.4 | Y | after | | none — MATCH (97 ins). iVar3 pinned to $v1 (register __asm__("$3")) so | `.run/backlog_drafts/func_8014CD80.c` |
| 18 | func_80150170 | WAVE | 134 | 95 | 12730 | 1.28 | 28.7 | Y | after | | none — MATCH (95/95). Keys: (1) two parallel 3-halfword groups via chained assign `sp10.x = sp18.x = v` (sp18… | `.run/backlog_drafts/func_80150170.c` |
| 19 | func_8014D12C | WAVE | 134 | 93 | 12462 | 1.25 | 30.0 | Y | after | 53 | WAVE: 53 mismatch | `.run/backlog_drafts/func_8014D12C.c` |
| 20 | func_8014FFDC | WAVE | 134 | 93 | 12462 | 1.25 | 31.2 | Y | after | 1 | none — MATCH | `.run/backlog_drafts/func_8014FFDC.c` |
| 21 | func_801502EC | WAVE | 134 | 93 | 12462 | 1.25 | 32.5 | Y | after | 95 | WAVE: 95 mismatch | `.run/backlog_drafts/func_801502EC.c` |
| 22 | func_8014C6F4 | WAVE | 134 | 91 | 12194 | 1.23 | 33.7 | Y | after | 83 | WAVE: 83 mismatch | `.run/backlog_drafts/func_8014C6F4.c` |
| 23 | func_80173CB4 | WAVE | 134 | 90 | 12060 | 1.21 | 34.9 | Y | jr_801734BC | | none — MATCH (switch form keeps cases unmerged; final block: reuse one temp for the D_8012750C test + the fun… | `.run/backlog_drafts/func_80173CB4.c` |
| 24 | func_80158638 | STUB | 134 | 87 | 11658 | 1.17 | 36.1 | Y | jr_8015444C | 1 | STUB: 1 mismatch | `.run/backlog_drafts/func_80158638.c` |
| 25 | func_8012B4B8 | WAVE | 134 | 84 | 11256 | 1.13 | 37.2 | Y | jr_8012ACE0 | 0 | none — MATCH | `.run/backlog_drafts/func_8012B4B8.c` |
| 26 | func_8014D4C0 | WAVE | 134 | 84 | 11256 | 1.13 | 38.3 | Y | after | 65 | WAVE: 65 mismatch | `.run/backlog_drafts/func_8014D4C0.c` |
| 27 | func_80156670 | WAVE | 134 | 83 | 11122 | 1.12 | 39.5 | Y | jr_8015444C | | none — MATCH (83 ins). Key: hoist `iVar1 = uVar3*4;` as its OWN statement before the if so gcc schedules `sll… | `.run/backlog_drafts/func_80156670.c` |
| 28 | func_8014CF04 | WAVE | 134 | 82 | 10988 | 1.10 | 40.6 | Y | after | 73 | WAVE: 73 mismatch | `.run/backlog_drafts/func_8014CF04.c` |
| 29 | func_8012E138 | WAVE | 134 | 81 | 10854 | 1.09 | 41.7 | Y | jr_8012ACE0 | 0 | none — MATCH (81/81 ins, match_one proxy); reloaded ptr pinned to $a0 | `.run/backlog_drafts/func_8012E138.c` |
| 30 | func_8014D2A0 | WAVE | 134 | 80 | 10720 | 1.08 | 42.7 | Y | after | 27 | none — MATCH (80 ins, relocation-masked); loop-guard idiom per engine_core DEFINE_func_80164ACC | `.run/backlog_drafts/func_8014D2A0.c` |
| 31 | func_8012A1BC | WAVE | 134 | 78 | 10452 | 1.05 | 43.8 | Y | a | 42 | 42/78 — block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoi… | `.run/backlog_drafts/func_8012A1BC.c` |
| 32 | func_80137178 | WAVE | 134 | 78 | 10452 | 1.05 | 44.8 | Y | jr_8012ACE0 | 15 | reg values all correct; prologue independent-addiu order + lazy sw placement differ | `.run/backlog_drafts/func_80137178.c` |
| 33 | func_8016163C | WAVE | 134 | 78 | 10452 | 1.05 | 45.9 | Y | jr_8015AE2C | 50 | none — MATCH (78 ins). First arm calls func_801599A4 with NO arg (asm nop delay slot) via fn-ptr cast ((void(… | `.run/backlog_drafts/func_8016163C.c` |
| 34 | func_80163534 | WAVE | 134 | 76 | 10184 | 1.02 | 46.9 | Y | jr_8015AE2C | | mismatch=13, a single 1-position scheduling tie. Instrs 1-30 byte-perfect; all registers correct | `.run/backlog_drafts/func_80163534.c` |
| 35 | func_8014D610 | WAVE | 134 | 74 | 9916 | 1.00 | 47.9 | Y | after | | none — MATCH (74 ins). for-loop + continue, single IV pointer p; gcc derives the $s0 = p+0x75 second inductio… | `.run/backlog_drafts/func_8014D610.c` |
| 36 | func_8012E014 | WAVE | 134 | 73 | 9782 | 0.98 | 48.9 | Y | jr_8012ACE0 | 0 | none — MATCH (expected; straightforward struct-field + global-copy body) | `.run/backlog_drafts/func_8012E014.c` |
| 37 | func_80132F40 | STRUCT | 134 | 72 | 9648 | 0.97 | 49.9 | Y | jr_8012ACE0 | | gcc gives src (sp+0x10) a 5th saved reg ($s3, frame 0x38 not 0x40); target rematerializes | `.run/backlog_drafts/func_80132F40.c` |
| 38 | func_80164418 | WAVE | 134 | 70 | 9380 | 0.94 | 50.8 | Y | jr_8015AE2C | 0 | none — MATCH (s16 stack array forces the spill; 2nd ratan2 reuses /dy/ in $a1) | `.run/backlog_drafts/func_80164418.c` |
| 39 | func_80161774 | WAVE | 134 | 69 | 9246 | 0.93 | 51.7 | Y | jr_8015AE2C | 53 | none — MATCH (69 ins, match_one verified; clean nested-if; param_1 -> $s0 call-crossing) | `.run/backlog_drafts/func_80161774.c` |
| 40 | func_80175308 | WAVE | 134 | 67 | 8978 | 0.90 | 52.6 | Y | jr_801734BC | 61 | WAVE: 61 mismatch | `.run/backlog_drafts/func_80175308.c` |
## GIANT hand-decomp queue — 2 fns, 4.9% of all remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_801412A8 | GIANT | 134 | 198 | 26532 | 2.67 | Y | main | 110 | 110 mismatch (count-exact 198/198). S11 LUID(x)alloc: register-assignment permutation + prim2 store-schedule.… | `.run/backlog_drafts/func_801412A8.c` |
| 2 | func_80178004 | GIANT | 134 | 165 | 22110 | 2.22 | Y | jr_801734BC | 0 | none — MATCH (full register pins per sibling func_80177EA4; running-ptr $s2 to stop unroll-rebase; | `.run/backlog_drafts/func_80178004.c` |
## Idiom-group tables
### STRUCT — 69 fns, 4.0% of remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_80137DD4 | STRUCT | 134 | 129 | 17286 | 1.74 | Y | jr_8012ACE0 | 107 | regalloc fully matches (frame -0x30; s4/s3/s5=params, s2=mask, s1=ptr w/ in-place +0x24 reuse, s0=acc+reused … | `.run/backlog_drafts/func_80137DD4.c` |
| 2 | func_80132F40 | STRUCT | 134 | 72 | 9648 | 0.97 | Y | jr_8012ACE0 | | gcc gives src (sp+0x10) a 5th saved reg ($s3, frame 0x38 not 0x40); target rematerializes | `.run/backlog_drafts/func_80132F40.c` |
| 3 | func_801719A4 | STRUCT | 134 | 24 | 3216 | 0.32 | Y | jr_8016AB6C | 25 | none — MATCH (24 ins, relocation-masked) | `.run/backlog_drafts/func_801719A4.c` |
| 4 | func_8017C974 | STRUCT | 1 | 947 | 947 | 0.10 | Y | jr_80178D40 | | | |
| 5 | func_8018103C | STRUCT | 1 | 579 | 579 | 0.06 | Y | jr_80178D40 | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_8018103C.c` |
| 6 | func_8017A4AC | STRUCT | 1 | 536 | 536 | 0.05 | Y | jr_80178D40 | | | |
| 7 | func_8013F350 | STRUCT | 1 | 490 | 490 | 0.05 | Y | main | | | |
| 8 | func_80131340 | STRUCT | 1 | 424 | 424 | 0.04 | n | jr_8012ACE0 | | | |
| 9 | func_80159C84 | STRUCT | 1 | 337 | 337 | 0.03 | Y | jr_8015444C | | | |
| 10 | func_80183324 | STRUCT | 1 | 324 | 324 | 0.03 | Y | jr_80182268 | | | |
| 11 | func_80135EB0 | STRUCT | 1 | 289 | 289 | 0.03 | n | jr_8012ACE0 | | | |
| 12 | func_8015B950 | STRUCT | 1 | 271 | 271 | 0.03 | Y | jr_8015AE2C | | | |
| 13 | func_8017FD14 | STRUCT | 1 | 249 | 249 | 0.03 | Y | jr_80178D40 | | | |
| 14 | func_8015C32C | STRUCT | 1 | 222 | 222 | 0.02 | Y | jr_8015AE2C | | | |
| 15 | func_8015EA3C | STRUCT | 1 | 204 | 204 | 0.02 | Y | jr_8015AE2C | | | |
| 16 | func_8015D738 | STRUCT | 1 | 201 | 201 | 0.02 | Y | jr_8015AE2C | | | |
| 17 | func_80181BE4 | STRUCT | 1 | 201 | 201 | 0.02 | Y | jr_80178D40 | | | |
| 18 | func_8015F448 | STRUCT | 1 | 188 | 188 | 0.02 | Y | jr_8015AE2C | | | |
| 19 | func_8014032C | STRUCT | 1 | 183 | 183 | 0.02 | Y | main | | | |
| 20 | func_80135A4C | STRUCT | 1 | 181 | 181 | 0.02 | n | jr_8012ACE0 | | | |
| 21 | func_8017AE2C | STRUCT | 1 | 174 | 174 | 0.02 | Y | jr_80178D40 | | | |
| 22 | func_80154C24 | STRUCT | 1 | 173 | 173 | 0.02 | Y | jr_8015444C | | | |
| 23 | func_8018308C | STRUCT | 1 | 166 | 166 | 0.02 | Y | jr_80182268 | | | |
| 24 | func_80160534 | STRUCT | 1 | 161 | 161 | 0.02 | Y | jr_8015AE2C | | | |
| 25 | func_80180C90 | STRUCT | 1 | 160 | 160 | 0.02 | Y | jr_80178D40 | | | |
| 26 | func_801299C8 | STRUCT | 1 | 158 | 158 | 0.02 | n | a | | | |
| 27 | func_80135260 | STRUCT | 1 | 136 | 136 | 0.01 | n | jr_8012ACE0 | | | |
| 28 | func_80183834 | STRUCT | 1 | 135 | 135 | 0.01 | Y | jr_80182268 | | | |
| 29 | func_80181948 | STRUCT | 1 | 132 | 132 | 0.01 | Y | jr_80178D40 | | | |
| 30 | func_80185E68 | STRUCT | 1 | 132 | 132 | 0.01 | Y | jr_80182268 | 131 | STRUCT: 131 mismatch | `.run/backlog_drafts/func_80185E68.c` |
| 31 | func_801555F4 | STRUCT | 1 | 131 | 131 | 0.01 | Y | jr_8015444C | | | |
| 32 | func_8015CD20 | STRUCT | 1 | 129 | 129 | 0.01 | Y | jr_8015AE2C | | | |
| 33 | func_8012AAAC | STRUCT | 1 | 125 | 125 | 0.01 | n | a | | | |
| 34 | func_80140608 | STRUCT | 1 | 123 | 123 | 0.01 | Y | main | | | |
| 35 | func_801588CC | STRUCT | 1 | 122 | 122 | 0.01 | Y | jr_8015444C | | | |
| 36 | func_80181F08 | STRUCT | 1 | 117 | 117 | 0.01 | Y | jr_80178D40 | | | |
| 37 | func_80135888 | STRUCT | 1 | 113 | 113 | 0.01 | n | jr_8012ACE0 | | | |
| 38 | func_80179B74 | STRUCT | 1 | 111 | 111 | 0.01 | Y | jr_80178D40 | | | |
| 39 | func_801594E8 | STRUCT | 1 | 108 | 108 | 0.01 | Y | jr_8015444C | | | |
| 40 | func_80182C9C | STRUCT | 1 | 101 | 101 | 0.01 | Y | jr_80182268 | | none — MATCH (101 ins). Inner-switch break-to-shared-tail must be written as | `.run/backlog_drafts/func_80182C9C.c` |
*(+29 more STRUCT fns — see `.run/worklist.json`)*
### PINS — 24 fns, 8.8% of remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_8014E5B4 | PINS | 134 | 59 | 7906 | 0.79 | Y | after | 23 | none — MATCH | `.run/backlog_drafts/func_8014E5B4.c` |
| 2 | func_80151C54 | PINS | 134 | 52 | 6968 | 0.70 | Y | after | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151C54.c` |
| 3 | func_80136DFC | PINS | 134 | 50 | 6700 | 0.67 | Y | jr_8012ACE0 | 0 | none — MATCH | `.run/backlog_drafts/func_80136DFC.c` |
| 4 | func_80151B98 | PINS | 134 | 47 | 6298 | 0.63 | Y | after | 15 | PINS: 15 mismatch | `.run/backlog_drafts/func_80151B98.c` |
| 5 | func_80129C40 | PINS | 134 | 46 | 6164 | 0.62 | Y | a | 0 | none — MATCH (array-of-struct %lo-fold for the two 3-element 0xA4-stride bases) | `.run/backlog_drafts/func_80129C40.c` |
| 6 | func_80163764 | PINS | 134 | 42 | 5628 | 0.57 | Y | jr_8015AE2C | 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` |
| 7 | func_801522CC | PINS | 134 | 41 | 5494 | 0.55 | Y | after | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_801522CC.c` |
| 8 | func_80152C80 | PINS | 134 | 41 | 5494 | 0.55 | Y | after | | none — MATCH expected (linear call/store sequence, no regalloc tension) | `.run/backlog_drafts/func_80152C80.c` |
| 9 | func_80146AFC | PINS | 134 | 40 | 5360 | 0.54 | Y | after | 13 | none — MATCH | `.run/backlog_drafts/func_80146AFC.c` |
| 10 | func_80131A34 | PINS | 134 | 37 | 4958 | 0.50 | Y | jr_8012ACE0 | 3 | 3-off — (a) prologue saves $ra before $s0 (target: $s0 then $ra) and (b) return-0 path reuses $a1's proven-ze… | `.run/backlog_drafts/func_80131A34.c` |
| 11 | func_80151664 | PINS | 134 | 35 | 4690 | 0.47 | Y | after | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80151664.c` |
| 12 | func_80170CF0 | PINS | 134 | 30 | 4020 | 0.40 | Y | jr_8016AB6C | | 4-ins PROLOGUE-ORDER residual (body insns 4-29 byte-identical). My cc1 hoists the funcptr lui/lw ABOVE the fr… | `.run/backlog_drafts/func_80170CF0.c` |
| 13 | func_80141B90 | PINS | 134 | 29 | 3886 | 0.39 | Y | main | 24 | none — MATCH (29 ins); array-of-int %lo-fold + call + u16 if-block; volatile-double reserves the target's 8-b… | `.run/backlog_drafts/func_80141B90.c` |
| 14 | func_8016F0E4 | PINS | 134 | 26 | 3484 | 0.35 | Y | jr_8016AB6C | 1 | none — MATCH (26 ins); natural C form, param_1 auto-allocated to $s0 | `.run/backlog_drafts/func_8016F0E4.c` |
| 15 | func_801733FC | PINS | 134 | 25 | 3350 | 0.34 | Y | jr_8016AB6C | 0 | none — modeled on sibling func_80173460 (packed 8-byte struct copy + two s16=1 stores) | `.run/backlog_drafts/func_801733FC.c` |
| 16 | func_80131CA8 | PINS | 134 | 19 | 2546 | 0.26 | Y | jr_8012ACE0 | 0 | none — MATCH (call-through-fnptr dispatcher: explicit return 1/return 0) | `.run/backlog_drafts/func_80131CA8.c` |
| 17 | func_80156600 | PINS | 134 | 18 | 2412 | 0.24 | Y | jr_8015444C | | none — MATCH (simple counted scan, do-while form per Ghidra-C) | `.run/backlog_drafts/func_80156600.c` |
| 18 | func_80161208 | PINS | 134 | 14 | 1876 | 0.19 | Y | jr_8015AE2C | 0 | none — MATCH expected (param saved across call → natural $s0, no pin needed) | `.run/backlog_drafts/func_80161208.c` |
| 19 | func_80184C0C | PINS | 1 | 48 | 48 | 0.00 | Y | jr_80182268 | 1 | none — MATCH (array-of-struct %lo-fold for &D_8018AEB8[idx], stride 0x34) | `.run/backlog_drafts/func_80184C0C.c` |
| 20 | func_80161C24 | PINS | 1 | 29 | 29 | 0.00 | Y | jr_8015AE2C | 1 | none — MATCH (array-of-struct %lo-fold; even/odd u16 fields at off 0/2, stride 4) | `.run/backlog_drafts/func_80161C24.c` |
| 21 | func_80182988 | PINS | 1 | 22 | 22 | 0.00 | Y | jr_80182268 | 6 | none — MATCH (0x5c store must be unsigned short so 0xaa10 stays +43536 → ori, not addiu/sign-extend) | `.run/backlog_drafts/func_80182988.c` |
| 22 | func_80157D20 | PINS | 1 | 21 | 21 | 0.00 | Y | jr_8015444C | 0 | none — MATCH expected (call, indexed u16-global load as 2nd arg, then call; param_1 saved across all three ca… | `.run/backlog_drafts/func_80157D20.c` |
| 23 | func_80161CD0 | PINS | 1 | 20 | 20 | 0.00 | Y | jr_8015AE2C | 14 | param_2 must survive the call in $s0; try plain C first then pin to $16 | `.run/backlog_drafts/func_80161CD0.c` |
| 24 | func_80161D20 | PINS | 1 | 14 | 14 | 0.00 | Y | jr_8015AE2C | 1 | none — MATCH (array-of-u16 %lo-fold, §18) | `.run/backlog_drafts/func_80161D20.c` |
### WAVE — 146 fns, 76.0% of remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_8014F4C0 | WAVE | 134 | 141 | 18894 | 1.90 | Y | after | 127 | residual: 127 mismatch | `.run/backlog_drafts/func_8014F4C0.c` |
| 2 | func_8014ADE0 | WAVE | 134 | 139 | 18626 | 1.87 | Y | after | 19 | 16 ins off — all compiler-internal ties: (1) 0xAAA8 const lands $v0 vs target $v1; | `.run/backlog_drafts/func_8014ADE0.c` |
| 3 | func_80174CB0 | WAVE | 134 | 123 | 16482 | 1.66 | Y | jr_801734BC | 0 | close=0 match_one MATCH but its anon typedef is named 'Buf' which COLLIDES with the existing 'Buf' (s16 h[8],… | `.run/backlog_drafts/func_80174CB0.c` |
| 4 | func_801325B8 | WAVE | 134 | 113 | 15142 | 1.52 | Y | jr_8012ACE0 | 4 | 4/113 — prologue save-order of the $s0(cur/p3) vs $s5(p1) pair; gcc emits | `.run/backlog_drafts/func_801325B8.c` |
| 5 | func_8014E284 | WAVE | 134 | 108 | 14472 | 1.46 | Y | after | 83 | WAVE: 83 mismatch | `.run/backlog_drafts/func_8014E284.c` |
| 6 | func_8012CC88 | WAVE | 134 | 105 | 14070 | 1.41 | Y | jr_8012ACE0 | 0 | none — MATCH (105 ins, relocation-masked) | `.run/backlog_drafts/func_8012CC88.c` |
| 7 | func_80169228 | WAVE | 134 | 105 | 14070 | 1.41 | Y | jr_8015AE2C | 0 | none — MATCH (105 ins, relocation-masked). Key levers: arg0/p pinned $s1/$s0, | `.run/backlog_drafts/func_80169228.c` |
| 8 | func_80167714 | WAVE | 134 | 104 | 13936 | 1.40 | Y | jr_8015AE2C | 0 | none — MATCH (104 ins) | `.run/backlog_drafts/func_80167714.c` |
| 9 | func_801463A0 | WAVE | 134 | 101 | 13534 | 1.36 | Y | after | 0 | none — MATCH (101 ins, match_one); real symbol names; misaligned 8B copy + s16 stores + masked B9C last | `.run/backlog_drafts/func_801463A0.c` |
| 10 | func_80177940 | WAVE | 134 | 101 | 13534 | 1.36 | Y | jr_801734BC | 65 | prologue+setup (35 ins) byte-match exactly; loop body diverges on gcc loop-invariant hoist ORDERING (schedule… | `.run/backlog_drafts/func_80177940.c` |
| 11 | func_801387B8 | WAVE | 134 | 100 | 13400 | 1.35 | Y | jr_801380E0 | 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 l… | `.run/backlog_drafts/func_801387B8.c` |
| 12 | func_801379FC | WAVE | 134 | 97 | 12998 | 1.31 | Y | jr_8012ACE0 | 0 | none — MATCH (match_one 97/97) | `.run/backlog_drafts/func_801379FC.c` |
| 13 | func_8014CD80 | WAVE | 134 | 97 | 12998 | 1.31 | Y | after | | none — MATCH (97 ins). iVar3 pinned to $v1 (register __asm__("$3")) so | `.run/backlog_drafts/func_8014CD80.c` |
| 14 | func_80150170 | WAVE | 134 | 95 | 12730 | 1.28 | Y | after | | none — MATCH (95/95). Keys: (1) two parallel 3-halfword groups via chained assign `sp10.x = sp18.x = v` (sp18… | `.run/backlog_drafts/func_80150170.c` |
| 15 | func_8014D12C | WAVE | 134 | 93 | 12462 | 1.25 | Y | after | 53 | WAVE: 53 mismatch | `.run/backlog_drafts/func_8014D12C.c` |
| 16 | func_8014FFDC | WAVE | 134 | 93 | 12462 | 1.25 | Y | after | 1 | none — MATCH | `.run/backlog_drafts/func_8014FFDC.c` |
| 17 | func_801502EC | WAVE | 134 | 93 | 12462 | 1.25 | Y | after | 95 | WAVE: 95 mismatch | `.run/backlog_drafts/func_801502EC.c` |
| 18 | func_8014C6F4 | WAVE | 134 | 91 | 12194 | 1.23 | Y | after | 83 | WAVE: 83 mismatch | `.run/backlog_drafts/func_8014C6F4.c` |
| 19 | func_80173CB4 | WAVE | 134 | 90 | 12060 | 1.21 | Y | jr_801734BC | | none — MATCH (switch form keeps cases unmerged; final block: reuse one temp for the D_8012750C test + the fun… | `.run/backlog_drafts/func_80173CB4.c` |
| 20 | func_8012B4B8 | WAVE | 134 | 84 | 11256 | 1.13 | Y | jr_8012ACE0 | 0 | none — MATCH | `.run/backlog_drafts/func_8012B4B8.c` |
| 21 | func_8014D4C0 | WAVE | 134 | 84 | 11256 | 1.13 | Y | after | 65 | WAVE: 65 mismatch | `.run/backlog_drafts/func_8014D4C0.c` |
| 22 | func_80156670 | WAVE | 134 | 83 | 11122 | 1.12 | Y | jr_8015444C | | none — MATCH (83 ins). Key: hoist `iVar1 = uVar3*4;` as its OWN statement before the if so gcc schedules `sll… | `.run/backlog_drafts/func_80156670.c` |
| 23 | func_8014CF04 | WAVE | 134 | 82 | 10988 | 1.10 | Y | after | 73 | WAVE: 73 mismatch | `.run/backlog_drafts/func_8014CF04.c` |
| 24 | func_8012E138 | WAVE | 134 | 81 | 10854 | 1.09 | Y | jr_8012ACE0 | 0 | none — MATCH (81/81 ins, match_one proxy); reloaded ptr pinned to $a0 | `.run/backlog_drafts/func_8012E138.c` |
| 25 | func_8014D2A0 | WAVE | 134 | 80 | 10720 | 1.08 | Y | after | 27 | none — MATCH (80 ins, relocation-masked); loop-guard idiom per engine_core DEFINE_func_80164ACC | `.run/backlog_drafts/func_8014D2A0.c` |
| 26 | func_8012A1BC | WAVE | 134 | 78 | 10452 | 1.05 | Y | a | 42 | 42/78 — block-copy bytes correct (char[8] => lwl/lwr/swl/swr); residual is gcc's load-hoist split. Target hoi… | `.run/backlog_drafts/func_8012A1BC.c` |
| 27 | func_80137178 | WAVE | 134 | 78 | 10452 | 1.05 | Y | jr_8012ACE0 | 15 | reg values all correct; prologue independent-addiu order + lazy sw placement differ | `.run/backlog_drafts/func_80137178.c` |
| 28 | func_8016163C | WAVE | 134 | 78 | 10452 | 1.05 | Y | jr_8015AE2C | 50 | none — MATCH (78 ins). First arm calls func_801599A4 with NO arg (asm nop delay slot) via fn-ptr cast ((void(… | `.run/backlog_drafts/func_8016163C.c` |
| 29 | func_80163534 | WAVE | 134 | 76 | 10184 | 1.02 | Y | jr_8015AE2C | | mismatch=13, a single 1-position scheduling tie. Instrs 1-30 byte-perfect; all registers correct | `.run/backlog_drafts/func_80163534.c` |
| 30 | func_8014D610 | WAVE | 134 | 74 | 9916 | 1.00 | Y | after | | none — MATCH (74 ins). for-loop + continue, single IV pointer p; gcc derives the $s0 = p+0x75 second inductio… | `.run/backlog_drafts/func_8014D610.c` |
| 31 | func_8012E014 | WAVE | 134 | 73 | 9782 | 0.98 | Y | jr_8012ACE0 | 0 | none — MATCH (expected; straightforward struct-field + global-copy body) | `.run/backlog_drafts/func_8012E014.c` |
| 32 | func_80164418 | WAVE | 134 | 70 | 9380 | 0.94 | Y | jr_8015AE2C | 0 | none — MATCH (s16 stack array forces the spill; 2nd ratan2 reuses /dy/ in $a1) | `.run/backlog_drafts/func_80164418.c` |
| 33 | func_80161774 | WAVE | 134 | 69 | 9246 | 0.93 | Y | jr_8015AE2C | 53 | none — MATCH (69 ins, match_one verified; clean nested-if; param_1 -> $s0 call-crossing) | `.run/backlog_drafts/func_80161774.c` |
| 34 | func_80175308 | WAVE | 134 | 67 | 8978 | 0.90 | Y | jr_801734BC | 61 | WAVE: 61 mismatch | `.run/backlog_drafts/func_80175308.c` |
| 35 | func_801775E0 | WAVE | 134 | 67 | 8978 | 0.90 | Y | jr_801734BC | 1 | 1 ins — target `sb $v0,0x6($s0)` vs mine `sb $v0,26($s1)` (same store P1+0x1a; gcc address-CSE picks $s1 base… | `.run/backlog_drafts/func_801775E0.c` |
| 36 | func_80130C08 | WAVE | 134 | 65 | 8710 | 0.88 | Y | jr_8012ACE0 | 5 | tail shares one jal func_80131CA8 between the a1=5 and a1=0x38 arms via `j .L80130CEC` with a DUPLICATED `mov… | `.run/backlog_drafts/func_80130C08.c` |
| 37 | func_80133298 | WAVE | 134 | 65 | 8710 | 0.88 | Y | jr_8012ACE0 | 0 | none — MATCH (65 ins, relocation-masked) | `.run/backlog_drafts/func_80133298.c` |
| 38 | func_80140D68 | WAVE | 134 | 65 | 8710 | 0.88 | Y | main | 5 | 5-ins near-miss — gcc hoists `lui 0xff00` (the 0xFF000000 mask) one slot too early in the first AddPrim block… | `.run/backlog_drafts/func_80140D68.c` |
| 39 | func_8014A738 | WAVE | 134 | 62 | 8308 | 0.84 | Y | after | | none — MATCH | `.run/backlog_drafts/func_8014A738.c` |
| 40 | func_80136F3C | WAVE | 134 | 61 | 8174 | 0.82 | Y | jr_8012ACE0 | 10 | 10/61 — regalloc EXACT (param-copy + corner register-pins). residual = gcc list-scheduler permutation of the … | `.run/backlog_drafts/func_80136F3C.c` |
*(+106 more WAVE fns — see `.run/worklist.json`)*
### O0 — 7 fns, 0.5% of remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_8013C08C | O0 | 134 | 27 | 3618 | 0.36 | Y | o0 | | | |
| 2 | func_8013C414 | O0 | 1 | 329 | 329 | 0.03 | Y | o0 | 322 | none — MATCH (329 ins, relocation-masked) | `.run/backlog_drafts/func_8013C414.c` |
| 3 | func_8013B83C | O0 | 1 | 272 | 272 | 0.03 | Y | o0 | | | |
| 4 | func_8013BD74 | O0 | 1 | 198 | 198 | 0.02 | Y | o0 | 192 | none — MATCH | `.run/backlog_drafts/func_8013BD74.c` |
| 5 | func_8013C0F8 | O0 | 1 | 154 | 154 | 0.02 | Y | o0 | 153 | none — MATCH (154 ins). Levers: (1) local_c/local_10 = STRUCT pointers so field offsets FOLD into lw/lbu off(… | `.run/backlog_drafts/func_8013C0F8.c` |
| 6 | func_8013B6A0 | O0 | 1 | 67 | 67 | 0.01 | Y | o0 | | | |
| 7 | func_8013B598 | O0 | 1 | 66 | 66 | 0.01 | Y | o0 | | | |
### O1 — 1 fns, 0.5% of remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_80161A90 | O1 | 134 | 34 | 4556 | 0.46 | Y | jr_8015AE2C | | none — MATCH (34 ins) at the overlay's STANDARD -O2 (match_one reports MATCH). NO -O1 split needed. | `.run/backlog_drafts/func_80161A90.c` |
### STUB — 14 fns, 5.3% of remaining gain
| # | name | class | reach | nins | gain_ins | %rem | cached | region | close | where it stuck | best draft |
|--:|------|-------|------:|-----:|---------:|-----:|--------|--------|------:|----------------|------------|
| 1 | func_801330E0 | STUB | 134 | 110 | 14740 | 1.48 | Y | jr_8012ACE0 | 79 | none — MATCH (110/110 words byte-identical via objcopy raw .text, reloc-masked on jal+%hi/%lo(D_800AF648)). m… | `.run/backlog_drafts/func_801330E0.c` |
| 2 | func_80158638 | STUB | 134 | 87 | 11658 | 1.17 | Y | jr_8015444C | 1 | STUB: 1 mismatch | `.run/backlog_drafts/func_80158638.c` |
| 3 | func_80173BC0 | STUB | 134 | 41 | 5494 | 0.55 | Y | jr_801734BC | | none — MATCH. Keys: invert mask branch (else-block = 80174650 path so func_8013E588 | `.run/backlog_drafts/func_80173BC0.c` |
| 4 | func_8012A6D0 | STUB | 134 | 34 | 4556 | 0.46 | Y | a | 0 | none — MATCH (sum order p[2]^2 + p[0]^2, then ratan2(p1[1]-p2[1], (s16)dist)) | `.run/backlog_drafts/func_8012A6D0.c` |
| 5 | func_8012EFB8 | STUB | 134 | 32 | 4288 | 0.43 | Y | jr_8012ACE0 | 11 | none — MATCH (32 ins, byte-verified via objdump -dz; match_one's default objdump elides the 2 consecutive rtp… | `.run/backlog_drafts/func_8012EFB8.c` |
| 6 | func_8016BA68 | STUB | 134 | 29 | 3886 | 0.39 | Y | jr_8016AB6C | 1 | STUB: 1 mismatch | `.run/backlog_drafts/func_8016BA68.c` |
| 7 | func_80146C3C | STUB | 134 | 23 | 3082 | 0.31 | Y | after | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80146C3C.c` |
| 8 | func_80162CCC | STUB | 134 | 23 | 3082 | 0.31 | Y | jr_8015AE2C | 0 | match_one MATCH but gate rejected (declaration/TU plumbing) | `.run/backlog_drafts/func_80162CCC.c` |
| 9 | func_8014C568 | STUB | 134 | 13 | 1742 | 0.18 | Y | after | 0 | none — MATCH expected; straightforward ratan2 wrapper with two s16 deltas & 0xFFF | `.run/backlog_drafts/func_8014C568.c` |
| 10 | func_8013CB84 | STUB | 1 | 249 | 249 | 0.03 | Y | main | | | |
| 11 | func_8013D53C | STUB | 1 | 240 | 240 | 0.02 | Y | main | | | |
| 12 | func_80138C60 | STUB | 1 | 62 | 62 | 0.01 | n | jr_801380E0 | | | |
| 13 | func_8017D900 | STUB | 1 | 35 | 35 | 0.00 | Y | jr_80178D40 | 0 | none — expect MATCH (STUB: ordered global stores + single tail call, sibling of func_8017D840) | `.run/backlog_drafts/func_8017D900.c` |
| 14 | func_8017D98C | STUB | 1 | 31 | 31 | 0.00 | Y | jr_80178D40 | 0 | none — MATCH (expected): straight global stores + tail call; const 0x140 reused for two halves | `.run/backlog_drafts/func_8017D98C.c` |