Skip to content

Use list casing in asData pattern synonyms - #7866

Merged
zliu41 merged 1 commit into
masterfrom
zliu41/asdata-caselist
Jul 24, 2026
Merged

Use list casing in asData pattern synonyms#7866
zliu41 merged 1 commit into
masterfrom
zliu41/asdata-caselist

Conversation

@zliu41

@zliu41 zliu41 commented Jul 23, 2026

Copy link
Copy Markdown
Member

The asData destructors already use list casing, but the pattern synonyms don't, since unsafeCaseList is a CPS function that isn't compatible with ViewPatterns. But there's a quite simple solution: introduce an opaque, direct-style directUnsafeCaseList, and let the plugin rewrite it into unsafeCaseList. See Note [Use list casing in AsData pattern synonyms]. wrapUnsafeUncons and wrapTail are no longer needed.

This is almost always an improvement for V3, but not for V1/V2, since V1/V2 do not support builtin casing, so list casing is compiled to inefficient code using head and tail. We could re-introduce the existing codegen for V1/V2, but I think it's a low priority and I'd like to do that in a separate PR.

Also, list casing is easier to optimize using dropList (which basically entails a modified DeadCase pass), which should improve further.

@zliu41
zliu41 requested review from a team and SeungheonOh July 23, 2026 23:11
@github-actions

Copy link
Copy Markdown
Contributor

Execution Budget Golden Diff

1ef4b32 (master) vs 94bdf3a

output

plutus-benchmark/coop/test/9.6/authMpBurning.golden.eval

Metric Old New Δ%
CPU 154_933_352 126_037_483 -18.65%
Memory 763_666 692_234 -9.35%
Flat Size 5_344 5_217 -2.38%

plutus-benchmark/coop/test/9.6/authMpMinting.golden.eval

Metric Old New Δ%
CPU 357_859_014 298_091_211 -16.70%
Memory 1_775_056 1_624_672 -8.47%
Flat Size 6_741 6_614 -1.88%

plutus-benchmark/coop/test/9.6/certMpBurning.golden.eval

Metric Old New Δ%
CPU 1_825_154_094 1_794_001_445 -1.71%
Memory 10_650_918 10_623_346 -0.26%
Flat Size 7_990 7_845 -1.81%

plutus-benchmark/coop/test/9.6/certMpMinting.golden.eval

Metric Old New Δ%
CPU 387_254_706 344_306_025 -11.09%
Memory 1_944_856 1_905_388 -2.03%
Flat Size 8_513 8_368 -1.70%

plutus-benchmark/coop/test/9.6/fsMpBurning.golden.eval

Metric Old New Δ%
CPU 213_215_256 192_973_826 -9.49%
Memory 1_107_275 1_087_035 -1.83%
Flat Size 7_350 7_192 -2.15%

plutus-benchmark/coop/test/9.6/fsMpMinting.golden.eval

Metric Old New Δ%
CPU 547_921_462 508_110_602 -7.27%
Memory 2_920_667 2_884_387 -1.24%
Flat Size 9_168 9_010 -1.72%

plutus-benchmark/coop/test/9.6/mustBurnOwnSingleton.golden.eval

Metric Old New Δ%
CPU 110_170_490 92_159_954 -16.35%
Memory 555_205 512_197 -7.75%
Flat Size 3_785 3_657 -3.38%

plutus-benchmark/script-contexts/test/V1/9.6/checkScriptContext1-20.golden.eval

Metric Old New Δ%
CPU 108_179_082 85_902_920 -20.59%
Memory 529_794 462_058 -12.79%
Flat Size 1_449 1_295 -10.63%

plutus-benchmark/script-contexts/test/V1/9.6/checkScriptContext1-4.golden.eval

Metric Old New Δ%
CPU 31_467_834 25_550_696 -18.80%
Memory 149_922 138_058 -7.91%
Flat Size 1_063 909 -14.49%

plutus-benchmark/script-contexts/test/V1/9.6/checkScriptContext2-20.golden.eval

Metric Old New Δ%
CPU 100_850_248 78_510_086 -22.15%
Memory 497_752 429_616 -13.69%
Flat Size 1_371 1_215 -11.38%

plutus-benchmark/script-contexts/test/V1/9.6/checkScriptContext2-4.golden.eval

Metric Old New Δ%
CPU 29_342_328 23_361_190 -20.38%
Memory 140_312 128_048 -8.74%
Flat Size 985 829 -15.84%

plutus-benchmark/script-contexts/test/V1/Data/9.6/checkScriptContext1-20.golden.eval

Metric Old New Δ%
CPU 7_956_006 8_140_043 +2.31%
Memory 34_234 36_838 +7.61%
Flat Size 650 670 +3.08%

plutus-benchmark/script-contexts/test/V1/Data/9.6/checkScriptContext1-4.golden.eval

Metric Old New Δ%
CPU 2_752_678 2_936_715 +6.69%
Memory 11_802 14_406 +22.06%
Flat Size 264 284 +7.58%

plutus-benchmark/script-contexts/test/V2/9.6/checkScriptContext1-20.golden.eval

Metric Old New Δ%
CPU 119_672_664 92_522_616 -22.69%
Memory 577_706 500_762 -13.32%
Flat Size 1_526 1_397 -8.45%

plutus-benchmark/script-contexts/test/V2/9.6/checkScriptContext1-4.golden.eval

Metric Old New Δ%
CPU 35_067_000 27_680_984 -21.06%
Memory 165_898 150_650 -9.19%
Flat Size 1_092 963 -11.81%

plutus-benchmark/script-contexts/test/V2/9.6/checkScriptContext2-20.golden.eval

Metric Old New Δ%
CPU 112_311_830 85_145_782 -24.19%
Memory 545_464 468_420 -14.12%
Flat Size 1_446 1_319 -8.78%

plutus-benchmark/script-contexts/test/V2/9.6/checkScriptContext2-4.golden.eval

Metric Old New Δ%
CPU 32_909_494 25_507_478 -22.49%
Memory 156_088 140_740 -9.83%
Flat Size 1_012 885 -12.55%

plutus-benchmark/script-contexts/test/V2/9.6/dataFwdStakeTrick.golden.eval

Metric Old New Δ%
CPU 4_914_248 4_513_970 -8.15%
Memory 9_150 10_494 +14.69%
Flat Size 1_187 1_198 +0.93%

plutus-benchmark/script-contexts/test/V2/9.6/sopFwdStakeTrick.golden.eval

Metric Old New Δ%
CPU 140_532_860 113_382_812 -19.32%
Memory 690_558 613_614 -11.14%
Flat Size 2_168 2_040 -5.90%

plutus-benchmark/script-contexts/test/V2/Data/9.6/checkScriptContext1-20.golden.eval

Metric Old New Δ%
CPU 8_069_669 8_268_043 +2.46%
Memory 34_466 37_638 +9.20%
Flat Size 714 738 +3.36%

plutus-benchmark/script-contexts/test/V2/Data/9.6/checkScriptContext1-4.golden.eval

Metric Old New Δ%
CPU 2_866_341 3_064_715 +6.92%
Memory 12_034 15_206 +26.36%
Flat Size 280 304 +8.57%

plutus-benchmark/script-contexts/test/V3/9.6/checkScriptContext1-20.golden.eval

Metric Old New Δ%
CPU 121_846_507 93_083_581 -23.61%
Memory 586_122 504_894 -13.86%
Flat Size 2_317 2_079 -10.27%

plutus-benchmark/script-contexts/test/V3/9.6/checkScriptContext1-4.golden.eval

Metric Old New Δ%
CPU 38_008_843 29_009_949 -23.68%
Memory 179_114 159_582 -10.90%
Flat Size 1_883 1_645 -12.64%

plutus-benchmark/script-contexts/test/V3/9.6/checkScriptContext2-20.golden.eval

Metric Old New Δ%
CPU 114_453_673 85_690_747 -25.13%
Memory 553_680 472_452 -14.67%
Flat Size 2_239 2_002 -10.59%

plutus-benchmark/script-contexts/test/V3/9.6/checkScriptContext2-4.golden.eval

Metric Old New Δ%
CPU 35_819_337 26_820_443 -25.12%
Memory 169_104 149_572 -11.55%
Flat Size 1_805 1_568 -13.13%

plutus-benchmark/script-contexts/test/V3/Data/9.6/checkScriptContext1-20.golden.eval

Metric Old New Δ%
CPU 8_069_669 8_524_043 +5.63%
Memory 34_466 39_238 +13.85%
Flat Size 720 757 +5.14%

plutus-benchmark/script-contexts/test/V3/Data/9.6/checkScriptContext1-4.golden.eval

Metric Old New Δ%
CPU 2_866_341 3_320_715 +15.85%
Memory 12_034 16_806 +39.65%
Flat Size 286 323 +12.94%

plutus-benchmark/script-contexts/test/V3/Data/9.6/purposeIsWellFormed-4.golden.eval

Metric Old New Δ%
CPU 19_250_664 18_783_060 -2.43%
Memory 77_530 79_410 +2.42%
Flat Size 726 711 -2.07%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/geq1.golden.eval

Metric Old New Δ%
CPU 331_010_215 327_665_955 -1.01%
Memory 952_905 951_325 -0.17%
Flat Size 938 933 -0.53%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/geq2.golden.eval

Metric Old New Δ%
CPU 340_731_162 337_386_902 -0.98%
Memory 978_731 977_151 -0.16%
Flat Size 989 984 -0.51%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/geq3.golden.eval

Metric Old New Δ%
CPU 351_760_500 348_416_240 -0.95%
Memory 1_010_925 1_009_345 -0.16%
Flat Size 989 984 -0.51%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/geq4.golden.eval

Metric Old New Δ%
CPU 177_245_560 175_714_243 -0.86%
Memory 523_041 522_165 -0.17%
Flat Size 945 940 -0.53%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/geq5.golden.eval

Metric Old New Δ%
CPU 342_977_250 339_632_990 -0.98%
Memory 985_060 983_480 -0.16%
Flat Size 945 940 -0.53%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/gt1.golden.eval

Metric Old New Δ%
CPU 381_466_620 378_122_360 -0.88%
Memory 1_129_920 1_128_340 -0.14%
Flat Size 1_291 1_286 -0.39%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/gt2.golden.eval

Metric Old New Δ%
CPU 340_955_162 337_610_902 -0.98%
Memory 980_131 978_551 -0.16%
Flat Size 1_342 1_337 -0.37%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/gt3.golden.eval

Metric Old New Δ%
CPU 403_162_605 399_818_345 -0.83%
Memory 1_193_305 1_191_725 -0.13%
Flat Size 1_342 1_337 -0.37%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/gt4.golden.eval

Metric Old New Δ%
CPU 177_469_560 175_938_243 -0.86%
Memory 524_441 523_565 -0.17%
Flat Size 1_298 1_293 -0.39%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.12/gt5.golden.eval

Metric Old New Δ%
CPU 367_039_878 363_695_618 -0.91%
Memory 1_072_984 1_071_404 -0.15%
Flat Size 1_298 1_293 -0.39%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/geq1.golden.eval

Metric Old New Δ%
CPU 331_010_215 327_665_955 -1.01%
Memory 952_905 951_325 -0.17%
Flat Size 938 933 -0.53%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/geq2.golden.eval

Metric Old New Δ%
CPU 340_731_162 337_386_902 -0.98%
Memory 978_731 977_151 -0.16%
Flat Size 989 984 -0.51%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/geq3.golden.eval

Metric Old New Δ%
CPU 351_760_500 348_416_240 -0.95%
Memory 1_010_925 1_009_345 -0.16%
Flat Size 989 984 -0.51%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/geq4.golden.eval

Metric Old New Δ%
CPU 177_245_560 175_714_243 -0.86%
Memory 523_041 522_165 -0.17%
Flat Size 945 940 -0.53%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/geq5.golden.eval

Metric Old New Δ%
CPU 342_977_250 339_632_990 -0.98%
Memory 985_060 983_480 -0.16%
Flat Size 945 940 -0.53%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/gt1.golden.eval

Metric Old New Δ%
CPU 381_466_620 378_122_360 -0.88%
Memory 1_129_920 1_128_340 -0.14%
Flat Size 1_291 1_286 -0.39%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/gt2.golden.eval

Metric Old New Δ%
CPU 340_955_162 337_610_902 -0.98%
Memory 980_131 978_551 -0.16%
Flat Size 1_342 1_337 -0.37%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/gt3.golden.eval

Metric Old New Δ%
CPU 403_162_605 399_818_345 -0.83%
Memory 1_193_305 1_191_725 -0.13%
Flat Size 1_342 1_337 -0.37%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/gt4.golden.eval

Metric Old New Δ%
CPU 177_469_560 175_938_243 -0.86%
Memory 524_441 523_565 -0.17%
Flat Size 1_298 1_293 -0.39%

plutus-tx-plugin/test-ledger-api/Spec/Data/Budget/9.6/gt5.golden.eval

Metric Old New Δ%
CPU 367_039_878 363_695_618 -0.91%
Memory 1_072_984 1_071_404 -0.15%
Flat Size 1_298 1_293 -0.39%

plutus-tx-plugin/test/AsData/Budget/9.12/destructSum-manual.golden.eval

Metric Old New Δ%
CPU 6_145_583 4_868_705 -20.78%
Memory 23_595 21_411 -9.26%
Flat Size 233 223 -4.29%

plutus-tx-plugin/test/AsData/Budget/9.12/destructSum.golden.eval

Metric Old New Δ%
CPU 5_231_771 3_906_893 -25.32%
Memory 19_828 17_344 -12.53%
Flat Size 185 171 -7.57%

plutus-tx-plugin/test/AsData/Budget/9.12/onlyUseFirstField-manual.golden.eval

Metric Old New Δ%
CPU 416_582 301_432 -27.64%
Memory 1_996 1_764 -11.62%
Flat Size 34 33 -2.94%

plutus-tx-plugin/test/AsData/Budget/9.12/onlyUseFirstField.golden.eval

Metric Old New Δ%
CPU 416_582 301_432 -27.64%
Memory 1_996 1_764 -11.62%
Flat Size 34 33 -2.94%

plutus-tx-plugin/test/AsData/Budget/9.12/patternMatching.golden.eval

Metric Old New Δ%
CPU 3_761_121 3_058_682 -18.68%
Memory 12_208 10_716 -12.22%
Flat Size 138 125 -9.42%

plutus-tx-plugin/test/AsData/Budget/9.12/recordFields.golden.eval

Metric Old New Δ%
CPU 8_664_580 6_046_824 -30.21%
Memory 31_160 26_392 -15.30%
Flat Size 172 160 -6.98%

plutus-tx-plugin/test/AsData/Budget/9.6/destructSum-manual.golden.eval

Metric Old New Δ%
CPU 6_145_583 4_868_705 -20.78%
Memory 23_595 21_411 -9.26%
Flat Size 233 223 -4.29%

plutus-tx-plugin/test/AsData/Budget/9.6/destructSum.golden.eval

Metric Old New Δ%
CPU 5_231_771 3_906_893 -25.32%
Memory 19_828 17_344 -12.53%
Flat Size 185 171 -7.57%

plutus-tx-plugin/test/AsData/Budget/9.6/onlyUseFirstField-manual.golden.eval

Metric Old New Δ%
CPU 416_582 301_432 -27.64%
Memory 1_996 1_764 -11.62%
Flat Size 34 33 -2.94%

plutus-tx-plugin/test/AsData/Budget/9.6/onlyUseFirstField.golden.eval

Metric Old New Δ%
CPU 416_582 301_432 -27.64%
Memory 1_996 1_764 -11.62%
Flat Size 34 33 -2.94%

plutus-tx-plugin/test/AsData/Budget/9.6/patternMatching.golden.eval

Metric Old New Δ%
CPU 3_761_121 3_058_682 -18.68%
Memory 12_208 10_716 -12.22%
Flat Size 138 125 -9.42%

plutus-tx-plugin/test/AsData/Budget/9.6/recordFields.golden.eval

Metric Old New Δ%
CPU 8_664_580 6_046_824 -30.21%
Memory 31_160 26_392 -15.30%
Flat Size 172 160 -6.98%

plutus-tx-plugin/test/Budget/9.12/map3.golden.eval

Metric Old New Δ%
CPU 111_043_732 110_666_106 -0.34%
Memory 328_284 327_856 -0.13%
Flat Size 709 704 -0.71%

plutus-tx-plugin/test/Budget/9.12/toFromData.golden.eval

Metric Old New Δ%
CPU 96_100 176_100 +83.25%
Memory 700 1_200 +71.43%
Flat Size 15 24 +60.00%

plutus-tx-plugin/test/Budget/9.6/map3.golden.eval

Metric Old New Δ%
CPU 111_043_732 110_666_106 -0.34%
Memory 328_284 327_856 -0.13%
Flat Size 709 704 -0.71%

plutus-tx-plugin/test/Budget/9.6/toFromData.golden.eval

Metric Old New Δ%
CPU 96_100 176_100 +83.25%
Memory 700 1_200 +71.43%
Flat Size 15 24 +60.00%

plutus-tx-plugin/test/IsData/Budget/SoP/9.12/decodeMixedNone.golden.eval

Metric Old New Δ%
CPU 424_688 360_688 -15.07%
Memory 2_632 2_232 -15.20%
Flat Size 66 62 -6.06%

plutus-tx-plugin/test/IsData/Budget/SoP/9.12/decodeMixedTwo.golden.eval

Metric Old New Δ%
CPU 1_103_347 874_534 -20.74%
Memory 4_594 4_130 -10.10%
Flat Size 69 65 -5.80%

plutus-tx-plugin/test/IsData/Budget/SoP/9.6/decodeMixedNone.golden.eval

Metric Old New Δ%
CPU 424_688 360_688 -15.07%
Memory 2_632 2_232 -15.20%
Flat Size 66 62 -6.06%

plutus-tx-plugin/test/IsData/Budget/SoP/9.6/decodeMixedTwo.golden.eval

Metric Old New Δ%
CPU 1_103_347 874_534 -20.74%
Memory 4_594 4_130 -10.10%
Flat Size 69 65 -5.80%

This comment will get updated when changes are made.

@SeungheonOh SeungheonOh left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice if we can change TH itself so that it doesn't use ViewPattern. Being said, the changes looks good as is

(constr 1
[ (constr 0
[ (constr 0
[True, 1, (case 0 [(\ds -> False), (\ds -> True)] [])]) ]) ])) No newline at end of file

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not really a regression - it requires 13 simplifier iterations to reduce to optimal code; unfortunately the default is 12 iterations.

@zliu41
zliu41 merged commit f0e88dc into master Jul 24, 2026
9 checks passed
@zliu41
zliu41 deleted the zliu41/asdata-caselist branch July 24, 2026 02:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants