← all workloads

specialization

A generic struct over a type parameter, instantiated at n distinct wrapper types. Forces specializeModule to clone the generic n ways. Scaling null: n scales instantiations of O(1) bodies; ideal specialization cost is O(n).

bucket: specialization  ·  mode: target  ·  flags: -target spirv -emit-spirv-directly

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.

specialization — phase composition vs N (v2026.5, median ms) specialization 14.7× over N 75→600 0.0 381 762 75 150 300 600 N specialization — parseTranslationUnit specialization — SemanticChecking specialization — generateIR specialization — frontEndExecute (self) specialization — specializeModule specialization — simplifyIR specialization — linkIR specialization — unrollLoopsInModule specialization — legalizeResourceTypes specialization — legalizeExistentialTypeLayout specialization — performMandatoryEarlyInlining specialization — performForceInlining specialization — linkAndOptimizeIR (self) specialization — generateOutput (self) specialization — 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×
75–60091.390.989487053.15×

Growth attribution (N=75 → N=600)

compileInner grows by 657 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=75t@N=600Δ msshare× lin∝Nk
simplifyIR6232+22634%3.42×1.74
generateOutput (self)8134+12719%2.60×1.53
legalizeExistentialTypeLayout294+9214%5.07×2.00
legalizeResourceTypes192+9114%5.71×2.10
specializeModule436+335%1.17×1.08

Also growing (below top-5): linkAndOptimizeIR (self) (+31 ms, 5%), SemanticChecking (+24 ms, 4%), generateIR (+21 ms, 3%).

Near-constant (≤2% of growth each): performMandatoryEarlyInlining (0→5 ms), linkIR (1→5 ms), parseTranslationUnit (1→3 ms), performForceInlining (0→1 ms), unrollLoopsInModule (0→1 ms), frontEndExecute (self) (0→0 ms), compileInner (self) (0→0 ms).

Sweep numbers (median ms)

NcompileInnerspecializeModulelinkAndOptimizeIR
7548419
15090847
30022417144
60070536503