← all workloads

operator_typecheck

`n` functions, each a long arithmetic expression whose operands alternate among float/int/uint (typed locals and literals of differing kinds). Every `+`/`-`/`*` must resolve the builtin arithmetic operator overload set and insert an implicit conversion to the common type — the "checking the types of 1 and 2 in 1 + 2" cost, multiplied across many nodes. Contrast `parse`, whose same-type float expressions skip overload ranking. Module mode -> the signal is SemanticChecking, not codegen. Scaling null: n scales fixed-length expressions; ideal typecheck cost is O(n).

bucket: typecheck  ·  mode: module  ·  flags: (none)

Phase composition vs N (stacked sub-counters)

compileInner split into phase buckets (named leaves + (self) residuals) stacked across the sweep sizes — the top edge is compileInner, so you can see which phase drives the scaling.

operator_typecheck — phase composition vs N (v2026.13.1, median ms) operator_typecheck 6.8× over N 200→1600 0.0 189 377 200 400 800 1600 N operator_typecheck — parseTranslationUnit operator_typecheck — SemanticChecking operator_typecheck — generateIR operator_typecheck — frontEndExecute (self) operator_typecheck — generateOutput (self) phase buckets parseTranslationUnit SemanticChecking generateIR frontEndExecute (self) specializeModule simplifyIR linkIR unrollLoopsInModule legalizeResourceTypes legalizeExistentialTypeLayout performMandatoryEarlyInlining performForceInlining linkAndOptimizeIR (self) emitEntryPointsSourceFromIR generateOutput (self) compileInner (self)

Scaling analysis

floor-subtracted power-law fit (t − floor) = a·Nk; floor = the minimal workload (fixed per-compile cost), k the global exponent, top-2× the local high-end doubling ratio.

N rangefloor (ms)k (work)fit R²t(Nmin)t(Nmax)top-2×
200–1600111.011.000523492.01×

Growth attribution (N=200 → N=1600)

compileInner grows by 298 ms across the sweep; the mutually-exclusive phase buckets below partition that growth exactly (no nested-timer double counting). × lin is the same metric as the top-level panels, per bucket: the end point vs a linear expectation anchored to the bucket's share of the minimal floor and fitted on the low-N half — 1.0 = grew exactly linearly, >1 bends up. The super-linearity lives where × lin (and k) are red.

buckett@N=200t@N=1600Δ msshare× lin∝Nk
SemanticChecking25146+12141%0.96×0.95
generateIR18137+11840%1.01×0.99
generateOutput (self)647+4114%1.24×1.16
parseTranslationUnit220+186%1.07×1.06

Near-constant (≤2% of growth each): frontEndExecute (self) (0→0 ms).

Sweep numbers (median ms)

NcompileInnerSemanticCheckingfrontEndExecute
200522546
400924281
80017374152
1600349146304