# Record 2026-09-08 — hp moves to gcc 14

Host hp (Xeon Gold 6154, skylake-avx512, isolcpus 9–17). Same day, same tree, same harness
throughout unless stated.

## Decision

gcc-toolset-14 (14.2.1) is the engine's default compiler wherever it is installed
(`toolchain.mk`; an explicit `CXX=` still wins). Grounds: the twelve-primitive floor sweep
(`floor-primitives-hp.tsv`) shows no compiler version winning the set, gcc 14 takes the
full engine flag set, and it wins three of the shipped kernel defaults over gcc 11.

## Tuner under gcc 14

Two runs (`make tune-validate TUNE_CORE=17 TUNE_ARGS="--reps 7"`), both ALL MATCH against
`expected/skylake-avx512.txt`, agreeing on all twelve probes. Divergences from gcc 11:
parse_mode unrolled, memcpy_tiny descend, int_format sse2_clang_asm, int_parse keeps the
swar8 default, decimal_format clean_arms (first gcc to leave `current`), structural index
avx2 with the plain-body parser ON (first gcc to enable it). The per-(arch, compiler)
default table gained the gcc 14 rows; its former `gcc < 15 → scalar` int_parse branch had
been handing gcc 14 a kernel 23% slower than the default it measures. First committed hp
profile: `tools/libhft-tune/profiles/hp-skylake-avx512-lowlat/` (opt-in).

The tuner's gate also caught a wrong fix of mine from the same morning: the tag parser's
contract is six digits (leading zeros are legal FIX), and the unrolled shape had never met
it; both shapes now do, and the self-test builds both.

## Whole-engine A/B, compiler only (cpp/vma mono, 32 sessions, closed loop)

| build | p50 µs | p99 µs | p999 µs | max µs |
|---|---|---|---|---|
| gcc 11.5, today | 41.35 | 591.35 | 766.59 | 970.80 |
| gcc 14.2, today, sample 1 | 40.16 | 568.42 | 755.90 | 903.70 |
| gcc 14.2, today, sample 2 | 40.37 | 571.42 | 720.07 | 956.22 |
| gcc 11.5, 2026-09-07 baseline on the page | 60.06 | 710.03 | 1038.87 | 1317.19 |

The two gcc 14 samples agree within 0.5% on p50 and p99; gcc 11 is 2.5–3% slower on p50
and 3.5–4% on p99. That is the compiler's whole-engine effect: small, consistent, real.
The third that separates today's cell from yesterday's baseline is not the compiler: the
harness, client model and tree moved between the two. Every cell on
`latency-matrix-hp.html` therefore predates the current harness and is being re-measured
(closed mode, kernel/vma/socketxtreme), cells landing on the page as they complete.

## Rust Phase 0 (same day)

M0 layout-noise floor and M1 wire floor: see `RUST-FLAVOUR-PLAN.md`, "Phase 0 status".
