← back

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  ·  compile mode: target  ·  flags: -target spirv -emit-spirv-directly  ·  default N: 300

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

specialization — Across releases (median ms) specialization 0.47× 0.0 200 399 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 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)

Daily tip-of-tree (last 30 days)

specialization — Daily tip-of-tree (last 30 days) (median ms) specialization 0.84× 0.0 68 136 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 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)

Daily window progress

Overall compileInner: 123.7 → 103.4 ms  -16.5%  (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
legalizeExistentialTypeLayout-15.8 ms-87.4%-12.8pp
linkAndOptimizeIR (self)-2.6 ms-20.6%-2.1pp
generateOutput (self)-1.7 ms-7.5%-1.4pp
SemanticChecking+0.6 ms+3.1%+0.5pp
specializeModule-0.5 ms-2.7%-0.4pp
legalizeResourceTypes-0.4 ms-20.0%-0.3pp
(remaining 9 buckets)-0.0 ms-0.0pp
loadBuiltinModule-5.4 ms-5.0%
readSerializedModuleIR-3.5 ms-6.4%

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

boundary% vs prev daycommitstop buckets (own %)
2026-08-04 → 2026-08-05-14.0%0864e60e6..ff45b15edlegalizeExistentialTypeLayout -88%, linkAndOptimizeIR (self) -8%

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 specialization --label repro --gen-dir repro-specialization

Compiled Slang source

the complete compiled source (N = 300), shown in full

specialization.slang (615 lines)

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

interface IVal { float get(); }

struct V0 : IVal { float get() { return 0.0 + 1.0; } }
struct V1 : IVal { float get() { return 1.0 + 1.0; } }
struct V2 : IVal { float get() { return 2.0 + 1.0; } }
struct V3 : IVal { float get() { return 3.0 + 1.0; } }
struct V4 : IVal { float get() { return 4.0 + 1.0; } }
struct V5 : IVal { float get() { return 5.0 + 1.0; } }
struct V6 : IVal { float get() { return 6.0 + 1.0; } }
struct V7 : IVal { float get() { return 7.0 + 1.0; } }
struct V8 : IVal { float get() { return 8.0 + 1.0; } }
struct V9 : IVal { float get() { return 9.0 + 1.0; } }
struct V10 : IVal { float get() { return 10.0 + 1.0; } }
struct V11 : IVal { float get() { return 11.0 + 1.0; } }
struct V12 : IVal { float get() { return 12.0 + 1.0; } }
struct V13 : IVal { float get() { return 13.0 + 1.0; } }
struct V14 : IVal { float get() { return 14.0 + 1.0; } }
struct V15 : IVal { float get() { return 15.0 + 1.0; } }
struct V16 : IVal { float get() { return 16.0 + 1.0; } }
struct V17 : IVal { float get() { return 17.0 + 1.0; } }
struct V18 : IVal { float get() { return 18.0 + 1.0; } }
struct V19 : IVal { float get() { return 19.0 + 1.0; } }
struct V20 : IVal { float get() { return 20.0 + 1.0; } }
struct V21 : IVal { float get() { return 21.0 + 1.0; } }
struct V22 : IVal { float get() { return 22.0 + 1.0; } }
struct V23 : IVal { float get() { return 23.0 + 1.0; } }
struct V24 : IVal { float get() { return 24.0 + 1.0; } }
struct V25 : IVal { float get() { return 25.0 + 1.0; } }
struct V26 : IVal { float get() { return 26.0 + 1.0; } }
struct V27 : IVal { float get() { return 27.0 + 1.0; } }
struct V28 : IVal { float get() { return 28.0 + 1.0; } }
struct V29 : IVal { float get() { return 29.0 + 1.0; } }
struct V30 : IVal { float get() { return 30.0 + 1.0; } }
struct V31 : IVal { float get() { return 31.0 + 1.0; } }
struct V32 : IVal { float get() { return 32.0 + 1.0; } }
struct V33 : IVal { float get() { return 33.0 + 1.0; } }
struct V34 : IVal { float get() { return 34.0 + 1.0; } }
struct V35 : IVal { float get() { return 35.0 + 1.0; } }
struct V36 : IVal { float get() { return 36.0 + 1.0; } }
struct V37 : IVal { float get() { return 37.0 + 1.0; } }
struct V38 : IVal { float get() { return 38.0 + 1.0; } }
struct V39 : IVal { float get() { return 39.0 + 1.0; } }
struct V40 : IVal { float get() { return 40.0 + 1.0; } }
struct V41 : IVal { float get() { return 41.0 + 1.0; } }
struct V42 : IVal { float get() { return 42.0 + 1.0; } }
struct V43 : IVal { float get() { return 43.0 + 1.0; } }
struct V44 : IVal { float get() { return 44.0 + 1.0; } }
struct V45 : IVal { float get() { return 45.0 + 1.0; } }
struct V46 : IVal { float get() { return 46.0 + 1.0; } }
struct V47 : IVal { float get() { return 47.0 + 1.0; } }
struct V48 : IVal { float get() { return 48.0 + 1.0; } }
struct V49 : IVal { float get() { return 49.0 + 1.0; } }
struct V50 : IVal { float get() { return 50.0 + 1.0; } }
struct V51 : IVal { float get() { return 51.0 + 1.0; } }
struct V52 : IVal { float get() { return 52.0 + 1.0; } }
struct V53 : IVal { float get() { return 53.0 + 1.0; } }
struct V54 : IVal { float get() { return 54.0 + 1.0; } }
struct V55 : IVal { float get() { return 55.0 + 1.0; } }
struct V56 : IVal { float get() { return 56.0 + 1.0; } }
struct V57 : IVal { float get() { return 57.0 + 1.0; } }
struct V58 : IVal { float get() { return 58.0 + 1.0; } }
struct V59 : IVal { float get() { return 59.0 + 1.0; } }
struct V60 : IVal { float get() { return 60.0 + 1.0; } }
struct V61 : IVal { float get() { return 61.0 + 1.0; } }
struct V62 : IVal { float get() { return 62.0 + 1.0; } }
struct V63 : IVal { float get() { return 63.0 + 1.0; } }
struct V64 : IVal { float get() { return 64.0 + 1.0; } }
struct V65 : IVal { float get() { return 65.0 + 1.0; } }
struct V66 : IVal { float get() { return 66.0 + 1.0; } }
struct V67 : IVal { float get() { return 67.0 + 1.0; } }
struct V68 : IVal { float get() { return 68.0 + 1.0; } }
struct V69 : IVal { float get() { return 69.0 + 1.0; } }
struct V70 : IVal { float get() { return 70.0 + 1.0; } }
struct V71 : IVal { float get() { return 71.0 + 1.0; } }
struct V72 : IVal { float get() { return 72.0 + 1.0; } }
struct V73 : IVal { float get() { return 73.0 + 1.0; } }
struct V74 : IVal { float get() { return 74.0 + 1.0; } }
struct V75 : IVal { float get() { return 75.0 + 1.0; } }
struct V76 : IVal { float get() { return 76.0 + 1.0; } }
struct V77 : IVal { float get() { return 77.0 + 1.0; } }
struct V78 : IVal { float get() { return 78.0 + 1.0; } }
struct V79 : IVal { float get() { return 79.0 + 1.0; } }
struct V80 : IVal { float get() { return 80.0 + 1.0; } }
struct V81 : IVal { float get() { return 81.0 + 1.0; } }
struct V82 : IVal { float get() { return 82.0 + 1.0; } }
struct V83 : IVal { float get() { return 83.0 + 1.0; } }
struct V84 : IVal { float get() { return 84.0 + 1.0; } }
struct V85 : IVal { float get() { return 85.0 + 1.0; } }
struct V86 : IVal { float get() { return 86.0 + 1.0; } }
struct V87 : IVal { float get() { return 87.0 + 1.0; } }
struct V88 : IVal { float get() { return 88.0 + 1.0; } }
struct V89 : IVal { float get() { return 89.0 + 1.0; } }
struct V90 : IVal { float get() { return 90.0 + 1.0; } }
struct V91 : IVal { float get() { return 91.0 + 1.0; } }
struct V92 : IVal { float get() { return 92.0 + 1.0; } }
struct V93 : IVal { float get() { return 93.0 + 1.0; } }
struct V94 : IVal { float get() { return 94.0 + 1.0; } }
struct V95 : IVal { float get() { return 95.0 + 1.0; } }
struct V96 : IVal { float get() { return 96.0 + 1.0; } }
struct V97 : IVal { float get() { return 97.0 + 1.0; } }
struct V98 : IVal { float get() { return 98.0 + 1.0; } }
struct V99 : IVal { float get() { return 99.0 + 1.0; } }
struct V100 : IVal { float get() { return 100.0 + 1.0; } }
struct V101 : IVal { float get() { return 101.0 + 1.0; } }
struct V102 : IVal { float get() { return 102.0 + 1.0; } }
struct V103 : IVal { float get() { return 103.0 + 1.0; } }
struct V104 : IVal { float get() { return 104.0 + 1.0; } }
struct V105 : IVal { float get() { return 105.0 + 1.0; } }
struct V106 : IVal { float get() { return 106.0 + 1.0; } }
struct V107 : IVal { float get() { return 107.0 + 1.0; } }
struct V108 : IVal { float get() { return 108.0 + 1.0; } }
struct V109 : IVal { float get() { return 109.0 + 1.0; } }
struct V110 : IVal { float get() { return 110.0 + 1.0; } }
struct V111 : IVal { float get() { return 111.0 + 1.0; } }
struct V112 : IVal { float get() { return 112.0 + 1.0; } }
struct V113 : IVal { float get() { return 113.0 + 1.0; } }
struct V114 : IVal { float get() { return 114.0 + 1.0; } }
struct V115 : IVal { float get() { return 115.0 + 1.0; } }
struct V116 : IVal { float get() { return 116.0 + 1.0; } }
struct V117 : IVal { float get() { return 117.0 + 1.0; } }
struct V118 : IVal { float get() { return 118.0 + 1.0; } }
struct V119 : IVal { float get() { return 119.0 + 1.0; } }
struct V120 : IVal { float get() { return 120.0 + 1.0; } }
struct V121 : IVal { float get() { return 121.0 + 1.0; } }
struct V122 : IVal { float get() { return 122.0 + 1.0; } }
struct V123 : IVal { float get() { return 123.0 + 1.0; } }
struct V124 : IVal { float get() { return 124.0 + 1.0; } }
struct V125 : IVal { float get() { return 125.0 + 1.0; } }
struct V126 : IVal { float get() { return 126.0 + 1.0; } }
struct V127 : IVal { float get() { return 127.0 + 1.0; } }
struct V128 : IVal { float get() { return 128.0 + 1.0; } }
struct V129 : IVal { float get() { return 129.0 + 1.0; } }
struct V130 : IVal { float get() { return 130.0 + 1.0; } }
struct V131 : IVal { float get() { return 131.0 + 1.0; } }
struct V132 : IVal { float get() { return 132.0 + 1.0; } }
struct V133 : IVal { float get() { return 133.0 + 1.0; } }
struct V134 : IVal { float get() { return 134.0 + 1.0; } }
struct V135 : IVal { float get() { return 135.0 + 1.0; } }
struct V136 : IVal { float get() { return 136.0 + 1.0; } }
struct V137 : IVal { float get() { return 137.0 + 1.0; } }
struct V138 : IVal { float get() { return 138.0 + 1.0; } }
struct V139 : IVal { float get() { return 139.0 + 1.0; } }
struct V140 : IVal { float get() { return 140.0 + 1.0; } }
struct V141 : IVal { float get() { return 141.0 + 1.0; } }
struct V142 : IVal { float get() { return 142.0 + 1.0; } }
struct V143 : IVal { float get() { return 143.0 + 1.0; } }
struct V144 : IVal { float get() { return 144.0 + 1.0; } }
struct V145 : IVal { float get() { return 145.0 + 1.0; } }
struct V146 : IVal { float get() { return 146.0 + 1.0; } }
struct V147 : IVal { float get() { return 147.0 + 1.0; } }
struct V148 : IVal { float get() { return 148.0 + 1.0; } }
struct V149 : IVal { float get() { return 149.0 + 1.0; } }
struct V150 : IVal { float get() { return 150.0 + 1.0; } }
struct V151 : IVal { float get() { return 151.0 + 1.0; } }
struct V152 : IVal { float get() { return 152.0 + 1.0; } }
struct V153 : IVal { float get() { return 153.0 + 1.0; } }
struct V154 : IVal { float get() { return 154.0 + 1.0; } }
struct V155 : IVal { float get() { return 155.0 + 1.0; } }
struct V156 : IVal { float get() { return 156.0 + 1.0; } }
struct V157 : IVal { float get() { return 157.0 + 1.0; } }
struct V158 : IVal { float get() { return 158.0 + 1.0; } }
struct V159 : IVal { float get() { return 159.0 + 1.0; } }
struct V160 : IVal { float get() { return 160.0 + 1.0; } }
struct V161 : IVal { float get() { return 161.0 + 1.0; } }
struct V162 : IVal { float get() { return 162.0 + 1.0; } }
struct V163 : IVal { float get() { return 163.0 + 1.0; } }
struct V164 : IVal { float get() { return 164.0 + 1.0; } }
struct V165 : IVal { float get() { return 165.0 + 1.0; } }
struct V166 : IVal { float get() { return 166.0 + 1.0; } }
struct V167 : IVal { float get() { return 167.0 + 1.0; } }
struct V168 : IVal { float get() { return 168.0 + 1.0; } }
struct V169 : IVal { float get() { return 169.0 + 1.0; } }
struct V170 : IVal { float get() { return 170.0 + 1.0; } }
struct V171 : IVal { float get() { return 171.0 + 1.0; } }
struct V172 : IVal { float get() { return 172.0 + 1.0; } }
struct V173 : IVal { float get() { return 173.0 + 1.0; } }
struct V174 : IVal { float get() { return 174.0 + 1.0; } }
struct V175 : IVal { float get() { return 175.0 + 1.0; } }
struct V176 : IVal { float get() { return 176.0 + 1.0; } }
struct V177 : IVal { float get() { return 177.0 + 1.0; } }
struct V178 : IVal { float get() { return 178.0 + 1.0; } }
struct V179 : IVal { float get() { return 179.0 + 1.0; } }
struct V180 : IVal { float get() { return 180.0 + 1.0; } }
struct V181 : IVal { float get() { return 181.0 + 1.0; } }
struct V182 : IVal { float get() { return 182.0 + 1.0; } }
struct V183 : IVal { float get() { return 183.0 + 1.0; } }
struct V184 : IVal { float get() { return 184.0 + 1.0; } }
struct V185 : IVal { float get() { return 185.0 + 1.0; } }
struct V186 : IVal { float get() { return 186.0 + 1.0; } }
struct V187 : IVal { float get() { return 187.0 + 1.0; } }
struct V188 : IVal { float get() { return 188.0 + 1.0; } }
struct V189 : IVal { float get() { return 189.0 + 1.0; } }
struct V190 : IVal { float get() { return 190.0 + 1.0; } }
struct V191 : IVal { float get() { return 191.0 + 1.0; } }
struct V192 : IVal { float get() { return 192.0 + 1.0; } }
struct V193 : IVal { float get() { return 193.0 + 1.0; } }
struct V194 : IVal { float get() { return 194.0 + 1.0; } }
struct V195 : IVal { float get() { return 195.0 + 1.0; } }
struct V196 : IVal { float get() { return 196.0 + 1.0; } }
struct V197 : IVal { float get() { return 197.0 + 1.0; } }
struct V198 : IVal { float get() { return 198.0 + 1.0; } }
struct V199 : IVal { float get() { return 199.0 + 1.0; } }
struct V200 : IVal { float get() { return 200.0 + 1.0; } }
struct V201 : IVal { float get() { return 201.0 + 1.0; } }
struct V202 : IVal { float get() { return 202.0 + 1.0; } }
struct V203 : IVal { float get() { return 203.0 + 1.0; } }
struct V204 : IVal { float get() { return 204.0 + 1.0; } }
struct V205 : IVal { float get() { return 205.0 + 1.0; } }
struct V206 : IVal { float get() { return 206.0 + 1.0; } }
struct V207 : IVal { float get() { return 207.0 + 1.0; } }
struct V208 : IVal { float get() { return 208.0 + 1.0; } }
struct V209 : IVal { float get() { return 209.0 + 1.0; } }
struct V210 : IVal { float get() { return 210.0 + 1.0; } }
struct V211 : IVal { float get() { return 211.0 + 1.0; } }
struct V212 : IVal { float get() { return 212.0 + 1.0; } }
struct V213 : IVal { float get() { return 213.0 + 1.0; } }
struct V214 : IVal { float get() { return 214.0 + 1.0; } }
struct V215 : IVal { float get() { return 215.0 + 1.0; } }
struct V216 : IVal { float get() { return 216.0 + 1.0; } }
struct V217 : IVal { float get() { return 217.0 + 1.0; } }
struct V218 : IVal { float get() { return 218.0 + 1.0; } }
struct V219 : IVal { float get() { return 219.0 + 1.0; } }
struct V220 : IVal { float get() { return 220.0 + 1.0; } }
struct V221 : IVal { float get() { return 221.0 + 1.0; } }
struct V222 : IVal { float get() { return 222.0 + 1.0; } }
struct V223 : IVal { float get() { return 223.0 + 1.0; } }
struct V224 : IVal { float get() { return 224.0 + 1.0; } }
struct V225 : IVal { float get() { return 225.0 + 1.0; } }
struct V226 : IVal { float get() { return 226.0 + 1.0; } }
struct V227 : IVal { float get() { return 227.0 + 1.0; } }
struct V228 : IVal { float get() { return 228.0 + 1.0; } }
struct V229 : IVal { float get() { return 229.0 + 1.0; } }
struct V230 : IVal { float get() { return 230.0 + 1.0; } }
struct V231 : IVal { float get() { return 231.0 + 1.0; } }
struct V232 : IVal { float get() { return 232.0 + 1.0; } }
struct V233 : IVal { float get() { return 233.0 + 1.0; } }
struct V234 : IVal { float get() { return 234.0 + 1.0; } }
struct V235 : IVal { float get() { return 235.0 + 1.0; } }
struct V236 : IVal { float get() { return 236.0 + 1.0; } }
struct V237 : IVal { float get() { return 237.0 + 1.0; } }
struct V238 : IVal { float get() { return 238.0 + 1.0; } }
struct V239 : IVal { float get() { return 239.0 + 1.0; } }
struct V240 : IVal { float get() { return 240.0 + 1.0; } }
struct V241 : IVal { float get() { return 241.0 + 1.0; } }
struct V242 : IVal { float get() { return 242.0 + 1.0; } }
struct V243 : IVal { float get() { return 243.0 + 1.0; } }
struct V244 : IVal { float get() { return 244.0 + 1.0; } }
struct V245 : IVal { float get() { return 245.0 + 1.0; } }
struct V246 : IVal { float get() { return 246.0 + 1.0; } }
struct V247 : IVal { float get() { return 247.0 + 1.0; } }
struct V248 : IVal { float get() { return 248.0 + 1.0; } }
struct V249 : IVal { float get() { return 249.0 + 1.0; } }
struct V250 : IVal { float get() { return 250.0 + 1.0; } }
struct V251 : IVal { float get() { return 251.0 + 1.0; } }
struct V252 : IVal { float get() { return 252.0 + 1.0; } }
struct V253 : IVal { float get() { return 253.0 + 1.0; } }
struct V254 : IVal { float get() { return 254.0 + 1.0; } }
struct V255 : IVal { float get() { return 255.0 + 1.0; } }
struct V256 : IVal { float get() { return 256.0 + 1.0; } }
struct V257 : IVal { float get() { return 257.0 + 1.0; } }
struct V258 : IVal { float get() { return 258.0 + 1.0; } }
struct V259 : IVal { float get() { return 259.0 + 1.0; } }
struct V260 : IVal { float get() { return 260.0 + 1.0; } }
struct V261 : IVal { float get() { return 261.0 + 1.0; } }
struct V262 : IVal { float get() { return 262.0 + 1.0; } }
struct V263 : IVal { float get() { return 263.0 + 1.0; } }
struct V264 : IVal { float get() { return 264.0 + 1.0; } }
struct V265 : IVal { float get() { return 265.0 + 1.0; } }
struct V266 : IVal { float get() { return 266.0 + 1.0; } }
struct V267 : IVal { float get() { return 267.0 + 1.0; } }
struct V268 : IVal { float get() { return 268.0 + 1.0; } }
struct V269 : IVal { float get() { return 269.0 + 1.0; } }
struct V270 : IVal { float get() { return 270.0 + 1.0; } }
struct V271 : IVal { float get() { return 271.0 + 1.0; } }
struct V272 : IVal { float get() { return 272.0 + 1.0; } }
struct V273 : IVal { float get() { return 273.0 + 1.0; } }
struct V274 : IVal { float get() { return 274.0 + 1.0; } }
struct V275 : IVal { float get() { return 275.0 + 1.0; } }
struct V276 : IVal { float get() { return 276.0 + 1.0; } }
struct V277 : IVal { float get() { return 277.0 + 1.0; } }
struct V278 : IVal { float get() { return 278.0 + 1.0; } }
struct V279 : IVal { float get() { return 279.0 + 1.0; } }
struct V280 : IVal { float get() { return 280.0 + 1.0; } }
struct V281 : IVal { float get() { return 281.0 + 1.0; } }
struct V282 : IVal { float get() { return 282.0 + 1.0; } }
struct V283 : IVal { float get() { return 283.0 + 1.0; } }
struct V284 : IVal { float get() { return 284.0 + 1.0; } }
struct V285 : IVal { float get() { return 285.0 + 1.0; } }
struct V286 : IVal { float get() { return 286.0 + 1.0; } }
struct V287 : IVal { float get() { return 287.0 + 1.0; } }
struct V288 : IVal { float get() { return 288.0 + 1.0; } }
struct V289 : IVal { float get() { return 289.0 + 1.0; } }
struct V290 : IVal { float get() { return 290.0 + 1.0; } }
struct V291 : IVal { float get() { return 291.0 + 1.0; } }
struct V292 : IVal { float get() { return 292.0 + 1.0; } }
struct V293 : IVal { float get() { return 293.0 + 1.0; } }
struct V294 : IVal { float get() { return 294.0 + 1.0; } }
struct V295 : IVal { float get() { return 295.0 + 1.0; } }
struct V296 : IVal { float get() { return 296.0 + 1.0; } }
struct V297 : IVal { float get() { return 297.0 + 1.0; } }
struct V298 : IVal { float get() { return 298.0 + 1.0; } }
struct V299 : IVal { float get() { return 299.0 + 1.0; } }

struct Box<T : IVal> { T v; float compute() { return v.get() * 2.0 + v.get(); } }

[shader("compute")]
[numthreads(1,1,1)]
void computeMain()
{
    float acc = 0.0;
    { Box<V0> b; acc += b.compute(); }
    { Box<V1> b; acc += b.compute(); }
    { Box<V2> b; acc += b.compute(); }
    { Box<V3> b; acc += b.compute(); }
    { Box<V4> b; acc += b.compute(); }
    { Box<V5> b; acc += b.compute(); }
    { Box<V6> b; acc += b.compute(); }
    { Box<V7> b; acc += b.compute(); }
    { Box<V8> b; acc += b.compute(); }
    { Box<V9> b; acc += b.compute(); }
    { Box<V10> b; acc += b.compute(); }
    { Box<V11> b; acc += b.compute(); }
    { Box<V12> b; acc += b.compute(); }
    { Box<V13> b; acc += b.compute(); }
    { Box<V14> b; acc += b.compute(); }
    { Box<V15> b; acc += b.compute(); }
    { Box<V16> b; acc += b.compute(); }
    { Box<V17> b; acc += b.compute(); }
    { Box<V18> b; acc += b.compute(); }
    { Box<V19> b; acc += b.compute(); }
    { Box<V20> b; acc += b.compute(); }
    { Box<V21> b; acc += b.compute(); }
    { Box<V22> b; acc += b.compute(); }
    { Box<V23> b; acc += b.compute(); }
    { Box<V24> b; acc += b.compute(); }
    { Box<V25> b; acc += b.compute(); }
    { Box<V26> b; acc += b.compute(); }
    { Box<V27> b; acc += b.compute(); }
    { Box<V28> b; acc += b.compute(); }
    { Box<V29> b; acc += b.compute(); }
    { Box<V30> b; acc += b.compute(); }
    { Box<V31> b; acc += b.compute(); }
    { Box<V32> b; acc += b.compute(); }
    { Box<V33> b; acc += b.compute(); }
    { Box<V34> b; acc += b.compute(); }
    { Box<V35> b; acc += b.compute(); }
    { Box<V36> b; acc += b.compute(); }
    { Box<V37> b; acc += b.compute(); }
    { Box<V38> b; acc += b.compute(); }
    { Box<V39> b; acc += b.compute(); }
    { Box<V40> b; acc += b.compute(); }
    { Box<V41> b; acc += b.compute(); }
    { Box<V42> b; acc += b.compute(); }
    { Box<V43> b; acc += b.compute(); }
    { Box<V44> b; acc += b.compute(); }
    { Box<V45> b; acc += b.compute(); }
    { Box<V46> b; acc += b.compute(); }
    { Box<V47> b; acc += b.compute(); }
    { Box<V48> b; acc += b.compute(); }
    { Box<V49> b; acc += b.compute(); }
    { Box<V50> b; acc += b.compute(); }
    { Box<V51> b; acc += b.compute(); }
    { Box<V52> b; acc += b.compute(); }
    { Box<V53> b; acc += b.compute(); }
    { Box<V54> b; acc += b.compute(); }
    { Box<V55> b; acc += b.compute(); }
    { Box<V56> b; acc += b.compute(); }
    { Box<V57> b; acc += b.compute(); }
    { Box<V58> b; acc += b.compute(); }
    { Box<V59> b; acc += b.compute(); }
    { Box<V60> b; acc += b.compute(); }
    { Box<V61> b; acc += b.compute(); }
    { Box<V62> b; acc += b.compute(); }
    { Box<V63> b; acc += b.compute(); }
    { Box<V64> b; acc += b.compute(); }
    { Box<V65> b; acc += b.compute(); }
    { Box<V66> b; acc += b.compute(); }
    { Box<V67> b; acc += b.compute(); }
    { Box<V68> b; acc += b.compute(); }
    { Box<V69> b; acc += b.compute(); }
    { Box<V70> b; acc += b.compute(); }
    { Box<V71> b; acc += b.compute(); }
    { Box<V72> b; acc += b.compute(); }
    { Box<V73> b; acc += b.compute(); }
    { Box<V74> b; acc += b.compute(); }
    { Box<V75> b; acc += b.compute(); }
    { Box<V76> b; acc += b.compute(); }
    { Box<V77> b; acc += b.compute(); }
    { Box<V78> b; acc += b.compute(); }
    { Box<V79> b; acc += b.compute(); }
    { Box<V80> b; acc += b.compute(); }
    { Box<V81> b; acc += b.compute(); }
    { Box<V82> b; acc += b.compute(); }
    { Box<V83> b; acc += b.compute(); }
    { Box<V84> b; acc += b.compute(); }
    { Box<V85> b; acc += b.compute(); }
    { Box<V86> b; acc += b.compute(); }
    { Box<V87> b; acc += b.compute(); }
    { Box<V88> b; acc += b.compute(); }
    { Box<V89> b; acc += b.compute(); }
    { Box<V90> b; acc += b.compute(); }
    { Box<V91> b; acc += b.compute(); }
    { Box<V92> b; acc += b.compute(); }
    { Box<V93> b; acc += b.compute(); }
    { Box<V94> b; acc += b.compute(); }
    { Box<V95> b; acc += b.compute(); }
    { Box<V96> b; acc += b.compute(); }
    { Box<V97> b; acc += b.compute(); }
    { Box<V98> b; acc += b.compute(); }
    { Box<V99> b; acc += b.compute(); }
    { Box<V100> b; acc += b.compute(); }
    { Box<V101> b; acc += b.compute(); }
    { Box<V102> b; acc += b.compute(); }
    { Box<V103> b; acc += b.compute(); }
    { Box<V104> b; acc += b.compute(); }
    { Box<V105> b; acc += b.compute(); }
    { Box<V106> b; acc += b.compute(); }
    { Box<V107> b; acc += b.compute(); }
    { Box<V108> b; acc += b.compute(); }
    { Box<V109> b; acc += b.compute(); }
    { Box<V110> b; acc += b.compute(); }
    { Box<V111> b; acc += b.compute(); }
    { Box<V112> b; acc += b.compute(); }
    { Box<V113> b; acc += b.compute(); }
    { Box<V114> b; acc += b.compute(); }
    { Box<V115> b; acc += b.compute(); }
    { Box<V116> b; acc += b.compute(); }
    { Box<V117> b; acc += b.compute(); }
    { Box<V118> b; acc += b.compute(); }
    { Box<V119> b; acc += b.compute(); }
    { Box<V120> b; acc += b.compute(); }
    { Box<V121> b; acc += b.compute(); }
    { Box<V122> b; acc += b.compute(); }
    { Box<V123> b; acc += b.compute(); }
    { Box<V124> b; acc += b.compute(); }
    { Box<V125> b; acc += b.compute(); }
    { Box<V126> b; acc += b.compute(); }
    { Box<V127> b; acc += b.compute(); }
    { Box<V128> b; acc += b.compute(); }
    { Box<V129> b; acc += b.compute(); }
    { Box<V130> b; acc += b.compute(); }
    { Box<V131> b; acc += b.compute(); }
    { Box<V132> b; acc += b.compute(); }
    { Box<V133> b; acc += b.compute(); }
    { Box<V134> b; acc += b.compute(); }
    { Box<V135> b; acc += b.compute(); }
    { Box<V136> b; acc += b.compute(); }
    { Box<V137> b; acc += b.compute(); }
    { Box<V138> b; acc += b.compute(); }
    { Box<V139> b; acc += b.compute(); }
    { Box<V140> b; acc += b.compute(); }
    { Box<V141> b; acc += b.compute(); }
    { Box<V142> b; acc += b.compute(); }
    { Box<V143> b; acc += b.compute(); }
    { Box<V144> b; acc += b.compute(); }
    { Box<V145> b; acc += b.compute(); }
    { Box<V146> b; acc += b.compute(); }
    { Box<V147> b; acc += b.compute(); }
    { Box<V148> b; acc += b.compute(); }
    { Box<V149> b; acc += b.compute(); }
    { Box<V150> b; acc += b.compute(); }
    { Box<V151> b; acc += b.compute(); }
    { Box<V152> b; acc += b.compute(); }
    { Box<V153> b; acc += b.compute(); }
    { Box<V154> b; acc += b.compute(); }
    { Box<V155> b; acc += b.compute(); }
    { Box<V156> b; acc += b.compute(); }
    { Box<V157> b; acc += b.compute(); }
    { Box<V158> b; acc += b.compute(); }
    { Box<V159> b; acc += b.compute(); }
    { Box<V160> b; acc += b.compute(); }
    { Box<V161> b; acc += b.compute(); }
    { Box<V162> b; acc += b.compute(); }
    { Box<V163> b; acc += b.compute(); }
    { Box<V164> b; acc += b.compute(); }
    { Box<V165> b; acc += b.compute(); }
    { Box<V166> b; acc += b.compute(); }
    { Box<V167> b; acc += b.compute(); }
    { Box<V168> b; acc += b.compute(); }
    { Box<V169> b; acc += b.compute(); }
    { Box<V170> b; acc += b.compute(); }
    { Box<V171> b; acc += b.compute(); }
    { Box<V172> b; acc += b.compute(); }
    { Box<V173> b; acc += b.compute(); }
    { Box<V174> b; acc += b.compute(); }
    { Box<V175> b; acc += b.compute(); }
    { Box<V176> b; acc += b.compute(); }
    { Box<V177> b; acc += b.compute(); }
    { Box<V178> b; acc += b.compute(); }
    { Box<V179> b; acc += b.compute(); }
    { Box<V180> b; acc += b.compute(); }
    { Box<V181> b; acc += b.compute(); }
    { Box<V182> b; acc += b.compute(); }
    { Box<V183> b; acc += b.compute(); }
    { Box<V184> b; acc += b.compute(); }
    { Box<V185> b; acc += b.compute(); }
    { Box<V186> b; acc += b.compute(); }
    { Box<V187> b; acc += b.compute(); }
    { Box<V188> b; acc += b.compute(); }
    { Box<V189> b; acc += b.compute(); }
    { Box<V190> b; acc += b.compute(); }
    { Box<V191> b; acc += b.compute(); }
    { Box<V192> b; acc += b.compute(); }
    { Box<V193> b; acc += b.compute(); }
    { Box<V194> b; acc += b.compute(); }
    { Box<V195> b; acc += b.compute(); }
    { Box<V196> b; acc += b.compute(); }
    { Box<V197> b; acc += b.compute(); }
    { Box<V198> b; acc += b.compute(); }
    { Box<V199> b; acc += b.compute(); }
    { Box<V200> b; acc += b.compute(); }
    { Box<V201> b; acc += b.compute(); }
    { Box<V202> b; acc += b.compute(); }
    { Box<V203> b; acc += b.compute(); }
    { Box<V204> b; acc += b.compute(); }
    { Box<V205> b; acc += b.compute(); }
    { Box<V206> b; acc += b.compute(); }
    { Box<V207> b; acc += b.compute(); }
    { Box<V208> b; acc += b.compute(); }
    { Box<V209> b; acc += b.compute(); }
    { Box<V210> b; acc += b.compute(); }
    { Box<V211> b; acc += b.compute(); }
    { Box<V212> b; acc += b.compute(); }
    { Box<V213> b; acc += b.compute(); }
    { Box<V214> b; acc += b.compute(); }
    { Box<V215> b; acc += b.compute(); }
    { Box<V216> b; acc += b.compute(); }
    { Box<V217> b; acc += b.compute(); }
    { Box<V218> b; acc += b.compute(); }
    { Box<V219> b; acc += b.compute(); }
    { Box<V220> b; acc += b.compute(); }
    { Box<V221> b; acc += b.compute(); }
    { Box<V222> b; acc += b.compute(); }
    { Box<V223> b; acc += b.compute(); }
    { Box<V224> b; acc += b.compute(); }
    { Box<V225> b; acc += b.compute(); }
    { Box<V226> b; acc += b.compute(); }
    { Box<V227> b; acc += b.compute(); }
    { Box<V228> b; acc += b.compute(); }
    { Box<V229> b; acc += b.compute(); }
    { Box<V230> b; acc += b.compute(); }
    { Box<V231> b; acc += b.compute(); }
    { Box<V232> b; acc += b.compute(); }
    { Box<V233> b; acc += b.compute(); }
    { Box<V234> b; acc += b.compute(); }
    { Box<V235> b; acc += b.compute(); }
    { Box<V236> b; acc += b.compute(); }
    { Box<V237> b; acc += b.compute(); }
    { Box<V238> b; acc += b.compute(); }
    { Box<V239> b; acc += b.compute(); }
    { Box<V240> b; acc += b.compute(); }
    { Box<V241> b; acc += b.compute(); }
    { Box<V242> b; acc += b.compute(); }
    { Box<V243> b; acc += b.compute(); }
    { Box<V244> b; acc += b.compute(); }
    { Box<V245> b; acc += b.compute(); }
    { Box<V246> b; acc += b.compute(); }
    { Box<V247> b; acc += b.compute(); }
    { Box<V248> b; acc += b.compute(); }
    { Box<V249> b; acc += b.compute(); }
    { Box<V250> b; acc += b.compute(); }
    { Box<V251> b; acc += b.compute(); }
    { Box<V252> b; acc += b.compute(); }
    { Box<V253> b; acc += b.compute(); }
    { Box<V254> b; acc += b.compute(); }
    { Box<V255> b; acc += b.compute(); }
    { Box<V256> b; acc += b.compute(); }
    { Box<V257> b; acc += b.compute(); }
    { Box<V258> b; acc += b.compute(); }
    { Box<V259> b; acc += b.compute(); }
    { Box<V260> b; acc += b.compute(); }
    { Box<V261> b; acc += b.compute(); }
    { Box<V262> b; acc += b.compute(); }
    { Box<V263> b; acc += b.compute(); }
    { Box<V264> b; acc += b.compute(); }
    { Box<V265> b; acc += b.compute(); }
    { Box<V266> b; acc += b.compute(); }
    { Box<V267> b; acc += b.compute(); }
    { Box<V268> b; acc += b.compute(); }
    { Box<V269> b; acc += b.compute(); }
    { Box<V270> b; acc += b.compute(); }
    { Box<V271> b; acc += b.compute(); }
    { Box<V272> b; acc += b.compute(); }
    { Box<V273> b; acc += b.compute(); }
    { Box<V274> b; acc += b.compute(); }
    { Box<V275> b; acc += b.compute(); }
    { Box<V276> b; acc += b.compute(); }
    { Box<V277> b; acc += b.compute(); }
    { Box<V278> b; acc += b.compute(); }
    { Box<V279> b; acc += b.compute(); }
    { Box<V280> b; acc += b.compute(); }
    { Box<V281> b; acc += b.compute(); }
    { Box<V282> b; acc += b.compute(); }
    { Box<V283> b; acc += b.compute(); }
    { Box<V284> b; acc += b.compute(); }
    { Box<V285> b; acc += b.compute(); }
    { Box<V286> b; acc += b.compute(); }
    { Box<V287> b; acc += b.compute(); }
    { Box<V288> b; acc += b.compute(); }
    { Box<V289> b; acc += b.compute(); }
    { Box<V290> b; acc += b.compute(); }
    { Box<V291> b; acc += b.compute(); }
    { Box<V292> b; acc += b.compute(); }
    { Box<V293> b; acc += b.compute(); }
    { Box<V294> b; acc += b.compute(); }
    { Box<V295> b; acc += b.compute(); }
    { Box<V296> b; acc += b.compute(); }
    { Box<V297> b; acc += b.compute(); }
    { Box<V298> b; acc += b.compute(); }
    { Box<V299> b; acc += b.compute(); }
    outBuf[0] = acc;
}