← back

minimal

Near-empty shader: isolates the fixed per-compile floor — core-module deserialization (readSerializedModuleIR/AST, loadBuiltinModule) plus linkIR of the user module against the core module — with negligible user-code work. This is the cleanest detector for "the standard library got heavier" regressions: when the core module grows, every compile pays here regardless of which language features it uses (the class of regression seen in the v2026.7 release, where an empty shader's linkIR rose ~27x).

bucket: core_link  ·  compile mode: target  ·  flags: -target spirv -emit-spirv-directly  ·  default N: 0

Phase composition across releases

Full sub-counter decomposition of compileInner — named leaf timers plus (self) residuals (a parent's time not covered by a named child, e.g. the autodiff transform in linkAndOptimizeIR (self)). Topmost band traces compileInner; hover a band for its phase.

Across releases

minimal — Across releases (median ms) minimal 1.79× 0.0 20 41 25.12 25.13 25.14 25.15 25.16 25.17 25.18 25.19 25.20 25.21 25.22 25.23 25.24 26.1 26.2 26.3 26.4 26.5 26.7 26.8 26.9 26.10 26.11 26.12 26.13 26.13.1 26.14 26.14.1 26.16 26.16.1 minimal — parseTranslationUnit minimal — SemanticChecking minimal — generateIR minimal — frontEndExecute (self) minimal — specializeModule minimal — simplifyIR minimal — linkIR minimal — unrollLoopsInModule minimal — legalizeResourceTypes minimal — legalizeExistentialTypeLayout minimal — performMandatoryEarlyInlining minimal — performForceInlining minimal — linkAndOptimizeIR (self) minimal — generateOutput (self) minimal — compileInner (self) phase buckets parseTranslationUnit SemanticChecking generateIR frontEndExecute (self) specializeModule simplifyIR linkIR unrollLoopsInModule legalizeResourceTypes legalizeExistentialTypeLayout performMandatoryEarlyInlining performForceInlining linkAndOptimizeIR (self) emitEntryPointsSourceFromIR generateOutput (self) compileInner (self)

Daily tip-of-tree (last 30 days)

minimal — Daily tip-of-tree (last 30 days) (median ms) minimal 1.04× 0.0 5.6 11 07-30 07-31 08-01 08-02 08-03 08-04 08-05 08-06 08-07 08-08 08-09 08-10 08-11 08-12 08-13 08-14 08-15 08-15 08-18 08-19 08-20 08-21 08-22 08-23 08-24 08-25 08-26 08-27 08-28 08-29 minimal — parseTranslationUnit minimal — SemanticChecking minimal — generateIR minimal — frontEndExecute (self) minimal — specializeModule minimal — simplifyIR minimal — linkIR minimal — legalizeResourceTypes minimal — legalizeExistentialTypeLayout minimal — linkAndOptimizeIR (self) minimal — generateOutput (self) minimal — compileInner (self) phase buckets parseTranslationUnit SemanticChecking generateIR frontEndExecute (self) specializeModule simplifyIR linkIR unrollLoopsInModule legalizeResourceTypes legalizeExistentialTypeLayout performMandatoryEarlyInlining performForceInlining linkAndOptimizeIR (self) emitEntryPointsSourceFromIR generateOutput (self) compileInner (self)

Daily window progress

Overall compileInner: 9.5 → 9.9 ms  +4.1%  (2026-07-30 7c58a326b → 2026-08-29 28c755b09)

Contributors — the mutually-exclusive phase buckets (named leaves + (self) residuals) that tile compileInner; the pp column sums to the overall %. Buckets moving the total by ≥0.2% are listed, the rest fold into the remainder row. Below them, every other reported counter (nested/overlapping, e.g. serialized-module reads — own change only):

counterΔown %of total
SemanticChecking+0.5 ms+9.8%+5.6pp
generateIR-0.3 ms-24.1%-2.7pp
compileInner (self)+0.1 ms+85.7%+0.6pp
frontEndExecute (self)+0.1 ms+31.6%+0.6pp
(remaining 8 buckets)+0.0 ms+0.0pp
loadBuiltinModule-8.2 ms-7.7%
readSerializedModuleIR-4.3 ms-7.9%
readSerializedModuleAST-4.1 ms-11.9%

Largest day steps (≥5% of the previous day, both directions; bisect with git log <c0>..<c1> -- source/):

boundary% vs prev daycommitstop buckets (own %)
2026-07-30 → 2026-07-31+8.7%7c58a326b..c3791ed4e
2026-08-09 → 2026-08-10+6.2%716ec597f..716ec597f

Reproduce

Run from the slang repo root. This regenerates the sources below and re-runs this workload's measurement; --gen-dir keeps the generated files (they go to a tempdir and are deleted otherwise).

python3 tools/compile-perf/bench.py --slangc /path/to/slangc --only minimal --label repro --gen-dir repro-minimal

Compiled Slang source

the complete compiled source, shown in full

minimal.slang (6 lines)

// AUTO-GENERATED by perf-suite/workloads.py - do not edit by hand.
RWStructuredBuffer<float> outBuf;

[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 tid : SV_DispatchThreadID) { outBuf[tid.x] = float(tid.x); }