← 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, median ms) operator_typecheck 6.9× over N 200→1600 0.0 193 387 200 400 800 1600 N operator_typecheck — parseTranslationUnit operator_typecheck — SemanticChecking operator_typecheck — generateIR operator_typecheck — frontEndExecute (self) operator_typecheck — generateOutput (self) operator_typecheck — compileInner (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–1600101.021.000523582.04×

Growth attribution (N=200 → N=1600)

compileInner grows by 306 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
SemanticChecking25150+12541%0.98×0.97
generateIR18139+12039%1.03×1.00
generateOutput (self)646+4013%1.26×1.16
parseTranslationUnit221+186%1.07×1.06

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

Sweep numbers (median ms)

NcompileInnerSemanticCheckingfrontEndExecute
200522546
400924281
80017577154
1600358150312