1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# Historical allocation cohorts
English | [日本語](README.ja.md)
`cohorts.tsv` freezes 199 compilation entries matching Chapter 24's
`SpillStats`: 39, 52, 26, 24, and 58 entries for cohorts 20-24. The source files
are deduplicated by contents and named for their first referring test. The
manifest preserves test identity, target, ABI, and the original stopping phase.
`Win64` becomes `win64`, the Chapter 25 ABI spelling. Argument type is i64 and
the replay seed is 123 throughout.
The original 212 entries were captured from the Chapter 24 tests before the
allocator audit's new correctness regressions. The 2026-10-07 refresh adds
Chapter22Test.testNarrowCReturns on x86 SystemV and Win64, matching the two
entries already measured in Chapters 22-24. The source is unchanged; only the
manifest's ABI spelling changes. The [cross-chapter matrix](../../../../../../../../docs/regalloc-spills.md)
checks matching test/CPU/ABI membership, including repeated compilations.
The same refresh removes all 15 Jig entries: six from cohort 23 and nine from
cohort 24. Jig methods are ignored scratch pads for debugging, not regression
tests or allocation benchmarks. Their frozen source copies were removed too.
These inputs are a stable comparison corpus; changing one
requires explaining the resulting break in comparability. Synthetic allocator
and instruction regressions do not contribute allocations to these cohorts.
Chapter 25 cannot parse all earlier sources unchanged. Adaptations are explicit:
- String, Scan, and linked S constructors replace `new S { field=...; }` with
declared constructors and arguments. The explicit-receiver scanner functions
become instance methods, preserving their operations.
- The saved `Chapter21Test-testStringExport`, `Chapter21AllocTest-testString`,
and `Chapter23AllocTest-testString` sources declare
`new String = { u8[] data -> cs=data; };` to initialize the required non-null
`cs` field. This repairs ten replay entries (four, three, and three), without
changing their equality/hash bodies or manifest membership. These adapted
sources are a new comparison baseline; their totals cannot be compared as
identical inputs with the earlier constructor-free fixtures.
- The two short-circuit RHS initializer loops become equivalent guarded blocks,
preserving allocation, side effects, and the final result. Their RHS assigns
the field value directly: Simple's `||` returns an operand, not a normalized
boolean. The 2026-10-07 cleanup removes an erroneous `!!` in those adaptations;
both fixtures return 44 for even arguments and 1 for odd arguments.
- Simple I/O cases include the old `write` binding and print helper directly.
Bubble Sort includes the old library bodies, with namespace prefixes flattened,
explicit constructors, and mutable replacement buffers. This retains the old
workload instead of substituting Chapter 25's substantially revised example.
- Local implementation names are private in eleven fixtures: the four Newton
variants that call their helper from the top level, Chapter 20's MergeSort,
String and Cast programs, and Chapter 22's three sign-extension programs and
InfiniteReturn. Their helpers/classes acquire an underscore prefix; operations,
inputs and final results are unchanged. This avoids exporting implementation
functions and allocation factories solely because Chapter 25 treats top-level
declarations as module members. Export/API fixtures, including NewtonExport,
StringExport, Person and the C-return wrappers, retain their public names.
These visibility adaptations change the generated workload and are recorded
separately from the allocator improvement in the cross-chapter comparison.
- The remaining visibility cleanup makes local classes/functions private in
AntiDeps1, Infinite, the Chapter 21/23 allocation String cases, the Chapter 23
scanner/pointer/short-circuit/function cases, and Stack3/Stack5. Bubble Sort's
copied library implementation is private; its `main` stays public. The three
adapted String API fixtures end in `return 0;`, avoiding an accidental return
of the last declared function. Their equality/hash APIs stay public, and the
named StringExport fixture also keeps its public String factory. No cohort
entries, workload operations, or intentional export APIs are removed.
- Other source texts are retained.
All entries replay **through RegAlloc**, checking scheduled register constraints.
The historical phase column is provenance, not a promise to run those old native
harnesses in Chapter 25. The adapted Bubble Sort retains its historical
`i32 errno="C"` declaration for allocation comparability. Direct data bindings
now encode on all three targets, but this declaration cannot link to a libc
whose errno is thread-local or accessor-based. Current system-library code uses
`libc.errno()` instead. Do not count this corpus as historical runtime coverage.
`SpillStats` then compiles the current system library through encoding at seed
456, and runs Chapter25Test with its existing seeds and native checks. Together
these form cohort 25. A library or test failure makes the report fail; partial
totals cannot establish an improvement. The ordinary full chapter suite remains
the execution validation for the current compiler.
|