c1_sampler2.py launches CL.Exe CREATE_SUSPENDED so the main thread handle is
owned outright - no Toolhelp, no OpenThread, which is what defeated the first
version - then tight-loops Suspend/Wow64GetThreadContext/Resume and
accumulates over N compiles. It works: 333,991 C1 samples for m6only.c vs
163,140 for the control over 6 runs each, showing C1 does ~2x the work when
the inline expression is present.
Two traps caught by verification, not assumed:
- int3-padding "function starts" are labels, not entry points; five
top-ranked ones took zero breakpoint hits. Raw sampled EIPs are the valid
targets.
- the top differential EIPs are hot shared parser code: breakpointing the
five highest-excess raw EIPs fires in BOTH compiles at the 250-hit cap, so
the "excess" is largely volume, not expression specificity.
dbg32 now prints hit counts with 8 hex digits instead of 1 (250 printed as
"a" before), so differential counting is possible at all.
Requirements for a next attempt recorded: count-only mode with a raised cap,
a work-matched control (same expression, non-commutative operators), and
call-target attribution instead of int3 boundaries.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
c1_sampler.py profiles m6only.c against m6none.c (identical headers and
locals, cross product removed) so header parsing cancels and expression
building stands out. It collects zero samples today, diagnosed rather than
assumed: OpenThread fails for all four threads, and the loop gets a single
pass before the sub-second compile exits, so Toolhelp-based sampling from
64-bit Python is far too coarse either way.
Fix for both recorded: launch CL suspended via CreateProcess to hold the
thread handle directly (no Toolhelp, no OpenThread), then tight-loop and
accumulate across many compiles - the approach the older acc_sampler used.
Cheaper alternative also recorded: a differential BREAKPOINT profile with
dbg32, which already fires on C1, trading many runs for a proven harness.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every earlier caller and helper sweep this session ran in the refuted
grouped-dot basin and was void. Re-run against unmodified production
headers: dot expression trees, the attested historical spellings from the
corpus census, call-site order and naming, dataflow/use-count changes
(reading the cross from s_plane.n, build order, crossing into t_plane.n),
scale_vector3d structure, and cross_product3d implementations. None moves
the 20 lines; roughly 65 shapes now measured across every structural class.
Sweep harnesses preserved so the negatives are reproducible rather than
just asserted.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Single-function target m6only.c isolates the cross-product operand tie.
Measured: the FP path runs through byte emitter 0x107455e6 (called from
0x10744452) with edi holding a live IR node; opcode at node[+4] (0x24e),
operand pointer at node[+0x18], member leaves one 0x60 stride apart. The
assembled function is findable in the arena by pattern scan - prologue at
buffer+0 and the tied fld at buffer+0x18 - so the deciding bytes are
addressable at run time. Node/buffer offsets are deterministic; only the
arena base shifts per run.
Negatives recorded: all previously-mapped FP decision sites (0x10745628,
0x10744304, 0x10735135) take zero hits here - they were mapped from an
ai_debug compile and are path-specific. And the emitter's hits are NOT
1:1 with FP instructions (4 of 12 displacement positions match), so an
earlier node differential keyed on hit order was invalid and is discarded.
Next instrument: runtime-resolved watchpoints in dbg32, watching the
displacement byte at buffer+0x1a to get the operand encoder.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
micro.c::micro_m6 is a 96-byte reproduction of the cross-product operand
tie; probe_cross.c reproduces the full caller context. probelab.py compiles
either with the unit's real flags and disassembles one function, so the
next session can iterate in seconds instead of minutes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Carry forward three Units reconstruction advances, complete hs_library_external at 36/36 target-owned functions and 3824/3824 padded bytes, and admit it as Matching.
Also harden parked-function validation for assembly transcriptions and enable MSVC header dependency tracking. Full 568-object builds and all 205 tooling tests pass; the parked manifest has zero stale or invalid entries.