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
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.
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 day | commits | top buckets (own %) |
|---|---|---|---|
| 2026-07-30 → 2026-07-31 | +8.7% | 7c58a326b..c3791ed4e | |
| 2026-08-09 → 2026-08-10 | +6.2% | 716ec597f..716ec597f |
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
the complete compiled source, shown in full
// 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); }