← 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.13, median ms) specialization 13.4× over N 75→600 0.0 293 586 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–600101.380.994405432.99×

Growth attribution (N=75 → N=600)

compileInner grows by 502 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
generateOutput (self)7109+10220%2.31×1.48
legalizeExistentialTypeLayout196+9519%5.58×2.06
legalizeResourceTypes194+9319%6.22×2.14
linkAndOptimizeIR (self)590+8417%2.08×1.41
specializeModule544+398%1.01×1.01

Also growing (below top-5): simplifyIR (+29 ms, 6%), SemanticChecking (+25 ms, 5%), generateIR (+21 ms, 4%).

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) (1→0 ms), compileInner (self) (0→0 ms).

Sweep numbers (median ms)

NcompileInnerspecializeModulelinkAndOptimizeIR
7540518
150771141
30018222114
60054344370