diff options
Diffstat (limited to 'TODO.md')
| -rw-r--r-- | TODO.md | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -156,7 +156,9 @@ and pushed there. - prover gaps merged (75f9ddb + c8cdee8): len/cross-array/fixed-new/affine proofs; proven_p checks enclosing loops; explain_prover reordered so call-loops come last (lafacts stay cleared after a may-free body). make check 217/0. - 5:27 queue (before find_replace): (1) freeing on reassignment verified — `drop_reassign.zc`, `overwrite_frees.zc`, `free_then_reassign.zc` and related drop/gc ownership tests all ok (b9e2dc6 / dtor2 already landed). (2) trees/sieve drop-check cost on x86-64 jit, same slope method, current main vs 12b2e28 (pre-destructor binary, current trees.zc/sieve.zc sources). ms/iter min (median in parens): trees plain 12b2e28 3.02 (3.20) → now 3.12 (3.20); o3 new/free 4.09 (4.25) → 2.79 (2.85) (new_k, not drop); o3 arena 0.27 (0.27) → 0.13 (0.14); sieve plain 6.48 (6.59) → 6.53 (6.65); o3 checked 0.57 (0.59) → 0.56 (0.58); o3 raw 0.60 (0.63) → 0.59 (0.60). plain new/free within noise (~+3%): drop-check cost not the trees row. earlier overnight notes (post-rcall before/after alloc) were 2.88/4.13/0.09 then 2.78/2.71/0.15. (3) plain path still uses `new_k` / size-class freelists (`expr.zc` non-o3 typed new → `rt.new_k`; o3 matched in 4619f66). (4) o3 drop/GC rules verified — `drop_in_o3_rejected.zc`, `drop_ends_in_o3_rejected.zc`, `drop_free_in_o3_rejected.zc` plus `drop_gc_once`/`resurrect`/`cycle` ok. - find_replace hardening (2312310): arm64/llvm/interpreter `rmark`/`rdrop` now cover the two prologue words like the x86-64 jit, so `icon.replace_function`'s lit+jmp retires a compiled callee. new icon regressions `o3_repeated_replace`, `o3_failed_keeps_old`, `o3_direct_replace`; icon suite 51/0; `make check` 217/0. -- still open: native freelist pop/push inline inside compiled o3 regions (every `new_k` still a normal call); remaining TODO items below. not claiming the overnight done-gate. +- native freelist pop/push inline DONE (4464698 + f0935ab): `new_k`, `recycle_leaf` and `own` fast paths emit as native code inside compiled o3 regions and plain blocks (ZYTRACE shows 11 `inline at` sites on `o3_freelist.zc`; ZYNOFASTALLOC=1 matches). rt helpers reshaped so the jit can emit without calls or `||` chains. `tests/programs/o3_freelist.zc` + icon 51/0; `make check` 219/0. x86-64 jit trees after inline (ms/iter min, median in parens; same slope method): plain new/free 1.03 (1.05) was 3.12 (3.20); o3 new/free 0.89 (0.90) was 2.79 (2.85); o3 arena 0.13 (0.13) unchanged vs 0.13 (0.14). freelist call overhead was the trees-row cost; inline ~3× on both new/free rows. +- llvm/C trees comparison (`python3 tests/bench/run.py trees`, then llvm o3 retime with fixed n=400 because run.py stuck at n=16 for o3 new/free). ms/iter median: C gcc -O3 malloc 0.0945, gcc-lto 0.0930, clang 0.1154; zc x86-64 jit (run.py's "interp" row on this host) plain 1.042 / o3 0.911 / arena 0.128; zc llvm ZYHOT plain 4.160 (run.py) / o3 ~1.69 (retimed) / arena too noisy (compile dominates). vs C gcc malloc: jit plain ~11× (was 90–118× in older notes), jit o3 ~10×, llvm plain ~44×, llvm o3 ~18×. +- overnight queue items for freelist-inline → trees profile → full check → llvm/C trees comparison: DONE on this tip. overnight done-gate MET. remaining long-term TODO items below are unchanged; not claiming that whole checklist empty. ### how the work is organized - start with `ONBOARD.md` (reading order and exact commands), then |
