Home / Input Output / plutus
Mar 26, 9-10 PM (0)
Mar 26, 10-11 PM (0)
Mar 26, 11-12 AM (0)
Mar 27, 12-1 AM (0)
Mar 27, 1-2 AM (0)
Mar 27, 2-3 AM (0)
Mar 27, 3-4 AM (0)
Mar 27, 4-5 AM (0)
Mar 27, 5-6 AM (0)
Mar 27, 6-7 AM (0)
Mar 27, 7-8 AM (0)
Mar 27, 8-9 AM (2)
Mar 27, 9-10 AM (0)
Mar 27, 10-11 AM (0)
Mar 27, 11-12 PM (0)
Mar 27, 12-1 PM (0)
Mar 27, 1-2 PM (0)
Mar 27, 2-3 PM (2)
Mar 27, 3-4 PM (2)
Mar 27, 4-5 PM (0)
Mar 27, 5-6 PM (0)
Mar 27, 6-7 PM (0)
Mar 27, 7-8 PM (1)
Mar 27, 8-9 PM (0)
Mar 27, 9-10 PM (0)
Mar 27, 10-11 PM (1)
Mar 27, 11-12 AM (0)
Mar 28, 12-1 AM (0)
Mar 28, 1-2 AM (0)
Mar 28, 2-3 AM (0)
Mar 28, 3-4 AM (0)
Mar 28, 4-5 AM (0)
Mar 28, 5-6 AM (0)
Mar 28, 6-7 AM (0)
Mar 28, 7-8 AM (0)
Mar 28, 8-9 AM (0)
Mar 28, 9-10 AM (0)
Mar 28, 10-11 AM (0)
Mar 28, 11-12 PM (0)
Mar 28, 12-1 PM (0)
Mar 28, 1-2 PM (0)
Mar 28, 2-3 PM (0)
Mar 28, 3-4 PM (0)
Mar 28, 4-5 PM (0)
Mar 28, 5-6 PM (0)
Mar 28, 6-7 PM (0)
Mar 28, 7-8 PM (0)
Mar 28, 8-9 PM (0)
Mar 28, 9-10 PM (0)
Mar 28, 10-11 PM (0)
Mar 28, 11-12 AM (0)
Mar 29, 12-1 AM (0)
Mar 29, 1-2 AM (0)
Mar 29, 2-3 AM (1)
Mar 29, 3-4 AM (0)
Mar 29, 4-5 AM (0)
Mar 29, 5-6 AM (0)
Mar 29, 6-7 AM (0)
Mar 29, 7-8 AM (0)
Mar 29, 8-9 AM (0)
Mar 29, 9-10 AM (0)
Mar 29, 10-11 AM (0)
Mar 29, 11-12 PM (0)
Mar 29, 12-1 PM (0)
Mar 29, 1-2 PM (0)
Mar 29, 2-3 PM (0)
Mar 29, 3-4 PM (0)
Mar 29, 4-5 PM (0)
Mar 29, 5-6 PM (0)
Mar 29, 6-7 PM (0)
Mar 29, 7-8 PM (0)
Mar 29, 8-9 PM (0)
Mar 29, 9-10 PM (0)
Mar 29, 10-11 PM (0)
Mar 29, 11-12 AM (0)
Mar 30, 12-1 AM (0)
Mar 30, 1-2 AM (0)
Mar 30, 2-3 AM (0)
Mar 30, 3-4 AM (0)
Mar 30, 4-5 AM (0)
Mar 30, 5-6 AM (0)
Mar 30, 6-7 AM (0)
Mar 30, 7-8 AM (0)
Mar 30, 8-9 AM (0)
Mar 30, 9-10 AM (0)
Mar 30, 10-11 AM (0)
Mar 30, 11-12 PM (0)
Mar 30, 12-1 PM (0)
Mar 30, 1-2 PM (1)
Mar 30, 2-3 PM (3)
Mar 30, 3-4 PM (7)
Mar 30, 4-5 PM (5)
Mar 30, 5-6 PM (2)
Mar 30, 6-7 PM (1)
Mar 30, 7-8 PM (0)
Mar 30, 8-9 PM (0)
Mar 30, 9-10 PM (0)
Mar 30, 10-11 PM (6)
Mar 30, 11-12 AM (1)
Mar 31, 12-1 AM (3)
Mar 31, 1-2 AM (0)
Mar 31, 2-3 AM (2)
Mar 31, 3-4 AM (0)
Mar 31, 4-5 AM (0)
Mar 31, 5-6 AM (0)
Mar 31, 6-7 AM (0)
Mar 31, 7-8 AM (2)
Mar 31, 8-9 AM (1)
Mar 31, 9-10 AM (1)
Mar 31, 10-11 AM (3)
Mar 31, 11-12 PM (0)
Mar 31, 12-1 PM (7)
Mar 31, 1-2 PM (0)
Mar 31, 2-3 PM (0)
Mar 31, 3-4 PM (0)
Mar 31, 4-5 PM (0)
Mar 31, 5-6 PM (0)
Mar 31, 6-7 PM (0)
Mar 31, 7-8 PM (0)
Mar 31, 8-9 PM (0)
Mar 31, 9-10 PM (0)
Mar 31, 10-11 PM (0)
Mar 31, 11-12 AM (1)
Apr 01, 12-1 AM (0)
Apr 01, 1-2 AM (0)
Apr 01, 2-3 AM (0)
Apr 01, 3-4 AM (0)
Apr 01, 4-5 AM (0)
Apr 01, 5-6 AM (1)
Apr 01, 6-7 AM (0)
Apr 01, 7-8 AM (0)
Apr 01, 8-9 AM (0)
Apr 01, 9-10 AM (0)
Apr 01, 10-11 AM (1)
Apr 01, 11-12 PM (2)
Apr 01, 12-1 PM (1)
Apr 01, 1-2 PM (2)
Apr 01, 2-3 PM (0)
Apr 01, 3-4 PM (0)
Apr 01, 4-5 PM (0)
Apr 01, 5-6 PM (0)
Apr 01, 6-7 PM (0)
Apr 01, 7-8 PM (0)
Apr 01, 8-9 PM (0)
Apr 01, 9-10 PM (0)
Apr 01, 10-11 PM (0)
Apr 01, 11-12 AM (0)
Apr 02, 12-1 AM (0)
Apr 02, 1-2 AM (0)
Apr 02, 2-3 AM (0)
Apr 02, 3-4 AM (0)
Apr 02, 4-5 AM (0)
Apr 02, 5-6 AM (0)
Apr 02, 6-7 AM (0)
Apr 02, 7-8 AM (0)
Apr 02, 8-9 AM (3)
Apr 02, 9-10 AM (1)
Apr 02, 10-11 AM (3)
Apr 02, 11-12 PM (1)
Apr 02, 12-1 PM (2)
Apr 02, 1-2 PM (5)
Apr 02, 2-3 PM (0)
Apr 02, 3-4 PM (0)
Apr 02, 4-5 PM (0)
Apr 02, 5-6 PM (0)
Apr 02, 6-7 PM (0)
Apr 02, 7-8 PM (0)
Apr 02, 8-9 PM (0)
Apr 02, 9-10 PM (0)
77 commits this week Mar 26, 2026 - Apr 02, 2026
Update indexByteString cost model parameters from fresh benchmarks
Re-ran costing benchmarks on plutus-bench for IndexByteString after
the denotation change in #7699. Updated CSV with 150 fresh data points
and CPU cost parameters in all three model variants (A, B, C):
13,169 -> 183,300 picoseconds (constant_cost).

The increase is due to benchmarking environment drift since the original
March 2024 measurements, not the code change itself. The denotation
change shows a ~3.5% improvement vs the old code on the same machine.
fix(Compiler/Expr): replace caseInteger list-indexing fallback with equalsInteger chain (#7693)
* test(IsData/Budget): add SoP mode budget test for unsafeFromBuiltinData

Adds a minimal test that compiles unsafeFromBuiltinData on a 3-constructor
type in the default SumsOfProducts mode (no BuiltinCasing pragma).
This captures the caseInteger fallback regression for comparison.

* test(IsData/Budget): add GHC 9.12 golden files

* test(IsData/Budget): regenerate golden UPLC with correct formatting

* test(IsData/Budget): generate baseline golden files with caseInteger disabled

Temporarily set `if False` in unsafeFromDataClause to bypass caseInteger
and generate golden files from the old equalsInteger/ifThenElse code path.
These serve as the equivalence target for the Expr.hs fix.

* fix(Compiler/Expr): replace caseInteger list-indexing fallback with equalsInteger chain

When compiling caseInteger in non-BuiltinCasing mode (SumsOfProducts),
the fallback used PlutusTx.List.!! which built a linked list of branches
at runtime and indexed into it with a Y-combinator. This caused a 3-5x
execution cost regression for unsafeFromBuiltinData on multi-constructor
types (reported by the Hydra team, see #7691).

Replace the fallback with mkEqualsIntegerChain, which generates a flat
chain of equalsInteger/ifThenElse comparisons in PIR. This produces UPLC
equivalent to the pre-caseInteger code path with no runtime allocation.

See Note [caseInteger non-BuiltinCasing fallback] in Expr.hs.

* chore: add changelog entry for caseInteger SoP fallback fix
fix(Compiler/Expr): replace caseInteger list-indexing with equalsInteger chain
Replace the PlutusTx.List.!! fallback for caseInteger in SoP/Scott mode
with an inline equalsInteger/ifThenElse chain that avoids runtime list
construction and indexing.

Also fix a latent bug in compileHaskellList: the old single-element
pattern silently discarded the list tail, so when GHC inlined `build`
into an explicit (:)-chain (as it does for recursive types with many
constructors like Marlowe's Value and Observation), only the first
branch was compiled. The fix adds a recursive consumeCons that walks
the full (:) spine.
fix(Compiler/Expr): handle (:)-chain list representation in compileHaskellList
compileHaskellList previously assumed GHC always uses the `build` form
for multi-element lists. However, GHC may inline `build` into an explicit
(:)-chain for types with many constructors (e.g. Marlowe's Value with 12
and Observation with 11 constructors). The old single-element pattern
`(App (App (App (Var _con) _ty) e) _)` silently discarded the tail,
returning only the first branch.

This produced a 1-branch equalsInteger chain where 11 or 12 branches
were expected, causing 53/206 Marlowe Semantics benchmark cases to hit
the fallthrough `error` at runtime.

The fix adds a recursive `consumeCons` that walks the full (:)-chain
spine, collecting all elements before the terminal `[] @ty`.

Also inlines `where` bindings in IsData/Budget/SoP.hs test and
regenerates Marlowe flat files and golden budgets.
chore(deps): bump benchmark-action/github-action-benchmark
Bumps [benchmark-action/github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark) from 1.21.0 to 1.22.0.
- [Release notes](https://github.com/benchmark-action/github-action-benchmark/releases)
- [Changelog](https://github.com/benchmark-action/github-action-benchmark/blob/master/CHANGELOG.md)
- [Commits](https://github.com/benchmark-action/github-action-benchmark/compare/v1.21.0...v1.22.0)

---
updated-dependencies:
- dependency-name: benchmark-action/github-action-benchmark
  dependency-version: 1.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
fix(Compiler/Expr): replace caseInteger list-indexing fallback with equalsInteger chain
When compiling caseInteger in non-BuiltinCasing mode (SumsOfProducts),
the fallback used PlutusTx.List.!! which built a linked list of branches
at runtime and indexed into it with a Y-combinator. This caused a 3-5x
execution cost regression for unsafeFromBuiltinData on multi-constructor
types (reported by the Hydra team, see #7691).

Replace the fallback with mkEqualsIntegerChain, which generates a flat
chain of equalsInteger/ifThenElse comparisons in PIR. This produces UPLC
equivalent to the pre-caseInteger code path with no runtime allocation.

See Note [caseInteger non-BuiltinCasing fallback] in Expr.hs.