re: the ISL stream is flat -- refute the "needs coroutine entry points" blocker
Two files (isl_report.py's docstring and structures/isl-builtins.md) recorded the same blocker on a faithful per-phase condition listing: that it needs the coroutine entry points from start_coroutine's operand. Measured against isl.call_sites(), which enumerates by scanning the encoding rather than by decoding and so is an independent denominator: linear + jumps, stopping at ret (what the tool did) 133 / 2846 = 4.7% linear + jumps, continuing past ret 2275 / 2846 = 79.9% ... + following start_coroutine (the recorded fix) 2355 / 2846 = 82.7% plain linear decode, no control flow at all 2846 / 2846 = 100.0% Following the coroutine entries buys 2.8 points. Disc-wide, a plain linear decode from the first phase base reaches 25705/25705 call sites over all 28 stages, and 28/28 decode clean to code_end with no desync. The real bug was isl.dis ending on `if op == 20: break`. Op 20 is `ret`, but this is a coroutine VM -- the thread suspends and resumes at the FOLLOWING instruction, so code continues past it. dis() now takes stop_at_ret (default True, preserving the old output: data/isl-stage02.txt regenerates byte-identical) and isl.linear_offsets() is the correct walk. By-product, kept with its control: start_coroutine's target is staged slot 0 -- 73/83 phase-1 sites land on a valid instruction, against a 38.7% chance rate for an arbitrary 4-aligned offset. New artefact data/isl-stage02-phase-ends.txt with a committed generator (isl_report.py phase-ends). It shows END_PHASE's call site is the WRONG place to read a clear condition: all 12 Stage-02 sites sit in one stereotyped outro. Not settled, and stated as such: op10/op13/op14/op21/op23 are unread handlers, so the condition in the poll loop upstream cannot be named yet.
This commit is contained in:
@@ -601,8 +601,12 @@ Counting call sites in `Stage02.ssb` (`data/isl-stage02.txt`, regenerated by
|
||||
⚠️ The sibling artefact `data/isl-stage02-conditions.txt` **predates the name
|
||||
corrections above** — it still prints `yield`, `await_label` and `push_trigger`,
|
||||
and its operand rendering predates the staging fix. It has no committed
|
||||
generator; reproducing it needs the coroutine entry points, which
|
||||
`start_coroutine`'s operand carries and the tool does not yet follow.
|
||||
generator. ~~reproducing it needs the coroutine entry points, which
|
||||
`start_coroutine`'s operand carries and the tool does not yet follow.~~
|
||||
🔴 **That reason is REFUTED** — see [isl-stream-is-flat](../isl-stream-is-flat.md).
|
||||
The stream is flat; a plain linear decode reaches **25705/25705** call sites
|
||||
across all 28 stages. What broke the naive decode was `isl.dis` stopping at
|
||||
op 20 (`ret`), which in a coroutine VM is a *yield*, not an end of code.
|
||||
|
||||
| built-in | sites |
|
||||
|---|---|
|
||||
|
||||
Reference in New Issue
Block a user