← back

autodiff

n differentiable functions arranged in bounded-depth groups, each group differentiated in both forward and reverse mode, plus a differentiable generic. Stresses the autodiff IR transform (inside linkAndOptimizeIR) and the front-end checking of [Differentiable]. Scales by breadth. Scaling null: n scales group breadth with depth bounded by _GROUP_DEPTH, so ideal autodiff cost is O(n).

bucket: autodiff  ·  compile mode: target  ·  flags: -target spirv -emit-spirv-directly  ·  default N: 200

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

autodiff — Across releases (median ms) autodiff 0.71× 0.0 2496 4992 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 autodiff — parseTranslationUnit autodiff — SemanticChecking autodiff — generateIR autodiff — frontEndExecute (self) autodiff — specializeModule autodiff — simplifyIR autodiff — linkIR autodiff — unrollLoopsInModule autodiff — legalizeResourceTypes autodiff — legalizeExistentialTypeLayout autodiff — performMandatoryEarlyInlining autodiff — performForceInlining autodiff — linkAndOptimizeIR (self) autodiff — generateOutput (self) autodiff — 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)

autodiff — Daily tip-of-tree (last 30 days) (median ms) autodiff 0.96× 0.0 430 859 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 autodiff — parseTranslationUnit autodiff — SemanticChecking autodiff — generateIR autodiff — frontEndExecute (self) autodiff — specializeModule autodiff — simplifyIR autodiff — linkIR autodiff — unrollLoopsInModule autodiff — legalizeResourceTypes autodiff — legalizeExistentialTypeLayout autodiff — performMandatoryEarlyInlining autodiff — performForceInlining autodiff — linkAndOptimizeIR (self) autodiff — generateOutput (self) autodiff — 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: 793.2 → 765.1 ms  -3.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
linkAndOptimizeIR (self)-10.2 ms-17.9%-1.3pp
generateOutput (self)-5.6 ms-2.0%-0.7pp
specializeModule-2.7 ms-1.1%-0.3pp
legalizeResourceTypes-2.5 ms-33.9%-0.3pp
legalizeExistentialTypeLayout-2.5 ms-28.4%-0.3pp
SemanticChecking-2.0 ms-2.7%-0.3pp
(remaining 9 buckets)-2.6 ms-0.3pp
loadBuiltinModule-6.8 ms-6.5%
readSerializedModuleAST-4.2 ms-12.3%
readSerializedModuleIR-2.9 ms-5.5%

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

boundary% vs prev daycommitstop buckets (own %)
none

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

Compiled Slang source

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

autodiff.slang (494 lines)

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

[Differentiable]
float leaf(float x) { return x * x + sin(x) * cos(x); }

[Differentiable]
float chain_0(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_1(float x) { return chain_0(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_2(float x) { return chain_1(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_3(float x) { return chain_2(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_4(float x) { return chain_3(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_5(float x) { return chain_4(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_6(float x) { return chain_5(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_7(float x) { return chain_6(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_8(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_9(float x) { return chain_8(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_10(float x) { return chain_9(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_11(float x) { return chain_10(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_12(float x) { return chain_11(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_13(float x) { return chain_12(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_14(float x) { return chain_13(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_15(float x) { return chain_14(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_16(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_17(float x) { return chain_16(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_18(float x) { return chain_17(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_19(float x) { return chain_18(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_20(float x) { return chain_19(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_21(float x) { return chain_20(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_22(float x) { return chain_21(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_23(float x) { return chain_22(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_24(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_25(float x) { return chain_24(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_26(float x) { return chain_25(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_27(float x) { return chain_26(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_28(float x) { return chain_27(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_29(float x) { return chain_28(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_30(float x) { return chain_29(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_31(float x) { return chain_30(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_32(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_33(float x) { return chain_32(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_34(float x) { return chain_33(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_35(float x) { return chain_34(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_36(float x) { return chain_35(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_37(float x) { return chain_36(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_38(float x) { return chain_37(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_39(float x) { return chain_38(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_40(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_41(float x) { return chain_40(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_42(float x) { return chain_41(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_43(float x) { return chain_42(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_44(float x) { return chain_43(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_45(float x) { return chain_44(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_46(float x) { return chain_45(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_47(float x) { return chain_46(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_48(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_49(float x) { return chain_48(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_50(float x) { return chain_49(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_51(float x) { return chain_50(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_52(float x) { return chain_51(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_53(float x) { return chain_52(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_54(float x) { return chain_53(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_55(float x) { return chain_54(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_56(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_57(float x) { return chain_56(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_58(float x) { return chain_57(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_59(float x) { return chain_58(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_60(float x) { return chain_59(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_61(float x) { return chain_60(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_62(float x) { return chain_61(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_63(float x) { return chain_62(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_64(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_65(float x) { return chain_64(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_66(float x) { return chain_65(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_67(float x) { return chain_66(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_68(float x) { return chain_67(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_69(float x) { return chain_68(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_70(float x) { return chain_69(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_71(float x) { return chain_70(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_72(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_73(float x) { return chain_72(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_74(float x) { return chain_73(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_75(float x) { return chain_74(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_76(float x) { return chain_75(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_77(float x) { return chain_76(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_78(float x) { return chain_77(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_79(float x) { return chain_78(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_80(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_81(float x) { return chain_80(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_82(float x) { return chain_81(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_83(float x) { return chain_82(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_84(float x) { return chain_83(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_85(float x) { return chain_84(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_86(float x) { return chain_85(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_87(float x) { return chain_86(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_88(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_89(float x) { return chain_88(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_90(float x) { return chain_89(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_91(float x) { return chain_90(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_92(float x) { return chain_91(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_93(float x) { return chain_92(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_94(float x) { return chain_93(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_95(float x) { return chain_94(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_96(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_97(float x) { return chain_96(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_98(float x) { return chain_97(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_99(float x) { return chain_98(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_100(float x) { return chain_99(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_101(float x) { return chain_100(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_102(float x) { return chain_101(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_103(float x) { return chain_102(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_104(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_105(float x) { return chain_104(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_106(float x) { return chain_105(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_107(float x) { return chain_106(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_108(float x) { return chain_107(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_109(float x) { return chain_108(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_110(float x) { return chain_109(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_111(float x) { return chain_110(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_112(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_113(float x) { return chain_112(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_114(float x) { return chain_113(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_115(float x) { return chain_114(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_116(float x) { return chain_115(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_117(float x) { return chain_116(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_118(float x) { return chain_117(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_119(float x) { return chain_118(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_120(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_121(float x) { return chain_120(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_122(float x) { return chain_121(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_123(float x) { return chain_122(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_124(float x) { return chain_123(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_125(float x) { return chain_124(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_126(float x) { return chain_125(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_127(float x) { return chain_126(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_128(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_129(float x) { return chain_128(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_130(float x) { return chain_129(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_131(float x) { return chain_130(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_132(float x) { return chain_131(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_133(float x) { return chain_132(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_134(float x) { return chain_133(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_135(float x) { return chain_134(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_136(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_137(float x) { return chain_136(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_138(float x) { return chain_137(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_139(float x) { return chain_138(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_140(float x) { return chain_139(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_141(float x) { return chain_140(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_142(float x) { return chain_141(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_143(float x) { return chain_142(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_144(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_145(float x) { return chain_144(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_146(float x) { return chain_145(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_147(float x) { return chain_146(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_148(float x) { return chain_147(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_149(float x) { return chain_148(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_150(float x) { return chain_149(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_151(float x) { return chain_150(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_152(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_153(float x) { return chain_152(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_154(float x) { return chain_153(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_155(float x) { return chain_154(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_156(float x) { return chain_155(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_157(float x) { return chain_156(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_158(float x) { return chain_157(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_159(float x) { return chain_158(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_160(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_161(float x) { return chain_160(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_162(float x) { return chain_161(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_163(float x) { return chain_162(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_164(float x) { return chain_163(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_165(float x) { return chain_164(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_166(float x) { return chain_165(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_167(float x) { return chain_166(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_168(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_169(float x) { return chain_168(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_170(float x) { return chain_169(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_171(float x) { return chain_170(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_172(float x) { return chain_171(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_173(float x) { return chain_172(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_174(float x) { return chain_173(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_175(float x) { return chain_174(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_176(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_177(float x) { return chain_176(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_178(float x) { return chain_177(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_179(float x) { return chain_178(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_180(float x) { return chain_179(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_181(float x) { return chain_180(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_182(float x) { return chain_181(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_183(float x) { return chain_182(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_184(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_185(float x) { return chain_184(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_186(float x) { return chain_185(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_187(float x) { return chain_186(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_188(float x) { return chain_187(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_189(float x) { return chain_188(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_190(float x) { return chain_189(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_191(float x) { return chain_190(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_192(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_193(float x) { return chain_192(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_194(float x) { return chain_193(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_195(float x) { return chain_194(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_196(float x) { return chain_195(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_197(float x) { return chain_196(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_198(float x) { return chain_197(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_199(float x) { return chain_198(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }

[Differentiable]
T poly<T : IDifferentiable & IFloat>(T x) { return x * x * x + x; }

[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 tid : SV_DispatchThreadID)
{
    float x = outBuf[tid.x];
    float acc = 0.0;
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_7)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_7)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_15)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_15)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_23)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_23)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_31)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_31)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_39)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_39)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_47)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_47)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_55)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_55)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_63)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_63)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_71)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_71)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_79)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_79)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_87)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_87)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_95)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_95)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_103)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_103)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_111)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_111)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_119)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_119)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_127)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_127)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_135)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_135)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_143)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_143)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_151)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_151)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_159)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_159)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_167)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_167)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_175)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_175)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_183)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_183)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_191)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_191)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_199)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_199)(diffPair(x, 1.0)).d; }
    acc += fwd_diff(poly<float>)(diffPair(x, 1.0)).d;
    outBuf[0] = acc;
}