diff --git a/.sampo/changesets/integer-inverse-trial.md b/.sampo/changesets/integer-inverse-trial.md new file mode 100644 index 00000000..6d47488a --- /dev/null +++ b/.sampo/changesets/integer-inverse-trial.md @@ -0,0 +1,5 @@ +--- +cargo/nash-ir: minor +--- + +Add an isolated integer representation cancellation pass with structural runtime-shape evidence and preserved operand evaluation. diff --git a/.sampo/changesets/iterative-assembly.md b/.sampo/changesets/iterative-assembly.md new file mode 100644 index 00000000..8d83e7b5 --- /dev/null +++ b/.sampo/changesets/iterative-assembly.md @@ -0,0 +1,7 @@ +--- +cargo/nash-ir: patch +cargo/nash-codegen: patch +cargo/nash-plutus: patch +--- + +Replace recursive Core and UPLC assembly traversals with heap work lists. Remove the O1 stack enlargement while preserving traversal order, generated code, traces, and lowering diagnostics. diff --git a/.sampo/changesets/iterative-core-printing.md b/.sampo/changesets/iterative-core-printing.md new file mode 100644 index 00000000..ec8c2430 --- /dev/null +++ b/.sampo/changesets/iterative-core-printing.md @@ -0,0 +1,5 @@ +--- +cargo/nash-ir: patch +--- + +Render deep Core term trees with a heap work list while preserving diagnostic and snapshot formatting. diff --git a/.sampo/changesets/known-constructor-fields.md b/.sampo/changesets/known-constructor-fields.md new file mode 100644 index 00000000..5a374756 --- /dev/null +++ b/.sampo/changesets/known-constructor-fields.md @@ -0,0 +1,5 @@ +--- +cargo/nash-ir: minor +--- + +Fold field accesses on known native constructors while preserving strict field evaluation, escaping values, and malformed runtime shapes. diff --git a/.sampo/changesets/known-literal-cases.md b/.sampo/changesets/known-literal-cases.md new file mode 100644 index 00000000..5ac2c1a0 --- /dev/null +++ b/.sampo/changesets/known-literal-cases.md @@ -0,0 +1,5 @@ +--- +cargo/nash-ir: minor +--- + +Fold known native integer and byte case subjects while preserving invalid tables, runtime failures, and strict evaluation. diff --git a/.sampo/changesets/o1-build-default.md b/.sampo/changesets/o1-build-default.md new file mode 100644 index 00000000..23a8e85a --- /dev/null +++ b/.sampo/changesets/o1-build-default.md @@ -0,0 +1,12 @@ +--- +cargo/nash-config: minor +cargo/nash-codegen: minor +cargo/nash-driver: minor +cargo/nash-cli: minor +cargo/nash-ir: patch +cargo/nash-plutus: patch +--- + +Make trace-preserving O1 optimization the default for builds and tests, with explicit O0/O1 CLI and project settings. Share the accepted optimizer with snapshots and measurements, and include direct integer representation cancellation before ANF. + +Print deep UPLC term trees with an explicit work stack. diff --git a/.sampo/changesets/representation-cancellation.md b/.sampo/changesets/representation-cancellation.md new file mode 100644 index 00000000..771b7945 --- /dev/null +++ b/.sampo/changesets/representation-cancellation.md @@ -0,0 +1,6 @@ +--- +cargo/nash-ir: patch +cargo/nash-codegen: patch +--- + +Cancel proven integer, byte, list, map and UTF-8 representation round trips, including let-bound operands and constructor Data projections/reconstruction, while preserving validation, traces and evaluation order. Run cancellation in the O1 cleanup loop as well as before normalization. diff --git a/CLAUDE.md b/CLAUDE.md index b00e996c..bf8675cf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -69,8 +69,9 @@ pass's layer. All codegen snapshots that generate executable Core group unoptimi unoptimized UPLC, followed by optimized Core then optimized UPLC. The unoptimized side uses original compiled or hand-built Core and ordinary lowering, with only required recursion encoding: no optimization passes or builtin/constant sharing. -Use the shared test-only accepted pipeline in `crates/nash-codegen/tests/support/optimizer.rs` -so each accepted optimization updates the whole fixture corpus. Pass tests retain +Use the shared production O1 pipeline in `crates/nash-codegen/src/optimizer.rs`, +rendered by `crates/nash-codegen/tests/support/optimizer.rs`, so each accepted +optimization updates the whole fixture corpus. Pass tests retain isolated-pass evidence after that comparison. Diagnostic/metadata snapshots stay focused; invalid Core records lowering errors, open Core is closed explicitly for pipeline rendering, and deliberate divergence is rendered without evaluation. diff --git a/SPEC.md b/SPEC.md index 5f040b6e..1eab386a 100644 --- a/SPEC.md +++ b/SPEC.md @@ -63,7 +63,7 @@ Implementation plans (Plan 08 is in progress; Plans 09 and 10 are complete): - [x] 05 Exhaustiveness (`Nitpick/PatternMatches` port) — [plans/05-nitpick.md](plans/05-nitpick.md) - [x] 06 Diagnostics (`nash-report`, concise source labels, stable codes, JSON/LSP) — [plans/06-diagnostics.md](plans/06-diagnostics.md); [concise diagnostics refactor](plans/diagnostics-refactor.md) complete - [x] 07 Codegen: Core IR, monomorphization, decision trees, recursion, Data casts, UPLC lowering — [plans/07-codegen.md](plans/07-codegen.md) -- [ ] 08 Optimizer: Single ANF normalization and optimization before recursion rewrite, inlining, builtin force caching, DCE, case-of-known-ctor/constant folding — [plans/08-optimizer.md](plans/08-optimizer.md) (Chunks 1–3 complete: analysis, hygiene, typed Core, pre-ANF static lifting, ANF and the isolated performance runner; Chunk 4 rules 1–3 accepted) +- [ ] 08 Optimizer: Single ANF normalization and optimization before recursion rewrite, inlining, builtin force caching, DCE, case-of-known-ctor/constant folding — [plans/08-optimizer.md](plans/08-optimizer.md) (Retained scope of Chunks 1–8 accepted; representation cancellation and O0/O1 build/test/config integration available; recursive unused-parameter removal, Chunks 9–10 and final composition review open) - [x] 09 Validators + `nash build` — [plans/09-validators-build.md](plans/09-validators-build.md) - [x] 10 Testing: `tests` block, props, generators, shrinking, power-assert, `nash test` — [plans/10-testing.md](plans/10-testing.md) - [ ] 11 Macros + comptime — [plans/11-macros-comptime.md](plans/11-macros-comptime.md); includes explicit integer-dispatch AST and positional library macro (chunk 13), reusable call/binding/case-shaped macro inputs required in chunk 14 (library semantics deferred) diff --git a/crates/nash-cli/src/cli.rs b/crates/nash-cli/src/cli.rs index a4741eae..d8433159 100644 --- a/crates/nash-cli/src/cli.rs +++ b/crates/nash-cli/src/cli.rs @@ -46,6 +46,23 @@ mod tests { use super::*; use clap::CommandFactory; + #[test] + fn optimization_flags() { + for command in ["build", "test"] { + for flag in ["-O0", "-O1"] { + let cli = Cli::try_parse_from(["nash", command, flag]).unwrap(); + let level = match cli.cmd { + crate::cmd::Cmd::Build(args) => args.optimize, + crate::cmd::Cmd::Test(args) => args.optimize, + _ => unreachable!(), + }; + assert_eq!(u8::from(level.unwrap()), flag.as_bytes()[2] - b'0'); + } + assert!(Cli::try_parse_from(["nash", command, "--optimize", "1"]).is_ok()); + assert!(Cli::try_parse_from(["nash", command, "-O2"]).is_err()); + } + } + #[test] fn command_schema_is_consistent() { Cli::command().debug_assert(); diff --git a/crates/nash-cli/src/cmd/build.rs b/crates/nash-cli/src/cmd/build.rs index f06797fd..673a0e5b 100644 --- a/crates/nash-cli/src/cmd/build.rs +++ b/crates/nash-cli/src/cmd/build.rs @@ -5,6 +5,9 @@ use tokio::sync::Mutex; #[derive(clap::Args)] pub struct Args { + /// Optimization level: 0 (baseline) or 1 (preserves enabled traces). + #[arg(short = 'O', long)] + pub optimize: Option, /// Path to the project. #[arg(default_value = ".")] pub path: PathBuf, @@ -85,6 +88,9 @@ impl Args { PlutusVersionArg::V3 => nash_config::PlutusVersion::V3, }; } + if let Some(level) = self.optimize { + config.optimize = level; + } if let Some(level) = self.trace_level { config.trace_level = match level { TraceLevelArg::Silent => nash_config::TraceLevel::Silent, diff --git a/crates/nash-cli/src/cmd/test.rs b/crates/nash-cli/src/cmd/test.rs index 11792961..65618747 100644 --- a/crates/nash-cli/src/cmd/test.rs +++ b/crates/nash-cli/src/cmd/test.rs @@ -14,6 +14,9 @@ pub enum Coverage { #[derive(clap::Args)] pub struct Args { + /// Optimization level: 0 (baseline) or 1 (preserves enabled traces). + #[arg(short = 'O', long)] + pub optimize: Option, #[arg(default_value = ".")] pub path: PathBuf, #[arg(long)] @@ -105,6 +108,9 @@ impl Args { .filter(|(directory, _)| path.starts_with(directory)) .max_by_key(|(directory, _)| directory.components().count()) .map_or_else(|| project.config.build().for_tests(), |(_, config)| *config); + if let Some(level) = self.optimize { + config.optimize = level; + } if let Some(level) = self.trace_level { config.trace_level_explicit = true; config.trace_level = match level { diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__aggregate_destructuring_preserves_generalized_components.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__aggregate_destructuring_preserves_generalized_components.snap index 2af2d497..87257375 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__aggregate_destructuring_preserves_generalized_components.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__aggregate_destructuring_preserves_generalized_components.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 239 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain : (unit, bool)\nmain =\n let\n (identity, second) = (\\x -> x, \\x -> x)\n in\n (identity (), second True)\n" --- --- unoptimized Core @@ -45,25 +44,9 @@ main#1 (lam value_18 value_18)]) (lam value_17 value_17)]) --- optimized Core -let destruct#26 : ('erased -> 'erased, 'erased -> 'erased) = constr 0 (\x#24 : 'erased -> x#24) (\x#25 : 'erased -> x#25) in -let anf#39 : unit -> unit = case@Tag destruct#26 of - 0 field#28 field#29 -> field#28 in -let evaluated#32 : unit = anf#39 () in -let anf#41 : bool -> bool = case@Tag destruct#26 of - 0 field#34 field#35 -> field#35 in -let anf#43 : bool = anf#41 true in -constr 0 evaluated#32 anf#43 +constr 0 () true --- optimized UPLC -(program 1.1.0 - [(lam destruct_3 - [(lam anf_6 - [(lam evaluated_7 - [(lam anf_10 - [(lam anf_11 (constr 0 evaluated_7 anf_11)) [anf_10 (con bool True)]]) - (case destruct_3 (lam field_8 (lam field_9 field_9)))]) - [anf_6 (con unit ())]]) - (case destruct_3 (lam field_4 (lam field_5 field_4)))]) - (constr 0 (lam x_1 x_1) (lam x_2 x_2))]) +(program 1.1.0 (constr 0 (con unit ()) (con bool True))) --- result (constr 0 (con unit ()) (con bool True)) --- logs diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__higher_kinded_default_method_accepts_a_nominal_record_alias.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__higher_kinded_default_method_accepts_a_nominal_record_alias.snap index 65482a98..9c1d1a20 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__higher_kinded_default_method_accepts_a_nominal_record_alias.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__higher_kinded_default_method_accepts_a_nominal_record_alias.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 239 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype alias box 'a = { value : 'a }\ntrait Pass 'f where\n pass : 'f 'a -> 'f 'a\n pass x = x\n other : 'f 'a -> 'f 'a\nimpl Pass box where\n other x = x\nboxed : box unit\nboxed = { value = () }\nmain = (pass boxed).value\n" --- --- unoptimized Core @@ -24,12 +23,9 @@ main#1 (lam value_6 value_6)]) (lam x_4 x_4)]) --- optimized Core -let boxed#13 : { _0 : unit } = constr 0 () in -field@0/1 boxed#13 +() --- optimized UPLC -(program 1.1.0 - [(lam boxed_1 (case boxed_1 (lam generated_2 generated_2))) - (constr 0 (con unit ()))]) +(program 1.1.0 (con unit ())) --- result (con unit ()) --- logs diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__little_constructor_record_accesses_each_field.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__little_constructor_record_accesses_each_field.snap index 23515572..4c900e8e 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__little_constructor_record_accesses_each_field.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__little_constructor_record_accesses_each_field.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 1450 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype entry = Entry { count : int, enabled : bool, label : bytes }\nmain =\n let\n item = Entry { label = #\"aabb\", enabled = True, count = 42 }\n in\n if item.enabled then addInteger item.count (lengthOfByteString item.label) else 0\n" --- --- unoptimized Core @@ -47,33 +46,12 @@ main#1 (lam value_10 value_10)]) (lam value_9 value_9)]) --- optimized Core -let item#24 : Main.entry = constr 0 42 true (con bytestring #aabb) in -let projection#25 : bool = field@1/3 item#24 in -case@Bool projection#25 of - True -> let projection#26 : int = field@0/3 item#24 in - let projection#27 : bytes = field@2/3 item#24 in - let anf#34 : int = lengthOfByteString projection#27 in - addInteger projection#26 anf#34 - False -> 0 +let anf#34 : int = lengthOfByteString (con bytestring #aabb) in +addInteger 42 anf#34 --- optimized UPLC (program 1.1.0 - [(lam item_1 - [(lam projection_2 - (case - projection_2 - (con integer 0) - [(lam projection_3 - [(lam projection_4 - [(lam anf_5 [[(builtin addInteger) projection_3] anf_5]) - [(builtin lengthOfByteString) projection_4]]) - (case item_1 (lam generated_6 (lam generated_7 (lam generated_8 generated_8))))]) - (case - item_1 - (lam generated_9 (lam generated_10 (lam generated_11 generated_9))))])) - (case - item_1 - (lam generated_12 (lam generated_13 (lam generated_14 generated_13))))]) - (constr 0 (con integer 42) (con bool True) (con bytestring #aabb))]) + [(lam anf_1 [[(builtin addInteger) (con integer 42)] anf_1]) + [(builtin lengthOfByteString) (con bytestring #aabb)]]) --- result (con integer 44) --- logs diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__primitive_map_unwrap_retains_structural_eq.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__primitive_map_unwrap_retains_structural_eq.snap index e76ff714..b6f86fd4 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__primitive_map_unwrap_retains_structural_eq.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__primitive_map_unwrap_retains_structural_eq.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 239 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\nencoded : Map Int Int\nencoded = Builtin.mapData [Builtin.mkPairData 1 2]\nnative = Builtin.unMapData encoded\nmain = eq native native\n" --- --- unoptimized Core @@ -33,25 +32,20 @@ let anf#19 : pair Int Int = mkPairData anf#17 anf#18 in let anf#20 : list (pair Int Int) = mkCons anf#19 (con (list (pair data data)) []) in let encoded#12 : Map Int Int = mapData anf#20 in let native#13 : list (pair Int Int) = unMapData encoded#12 in -let anf#15 : Map 'erased 'erased = mapData native#13 in -let anf#16 : Map 'erased 'erased = mapData native#13 in -equalsData anf#15 anf#16 +equalsData encoded#12 encoded#12 --- optimized UPLC (program 1.1.0 - [(lam builtin_10 + [(lam builtin_8 [(lam fromInt_1 [(lam anf_2 [(lam anf_3 [(lam anf_4 [(lam anf_5 [(lam encoded_6 - [(lam native_7 - [(lam anf_8 - [(lam anf_9 [[(builtin equalsData) anf_8] anf_9]) [(builtin mapData) native_7]]) - [(builtin mapData) native_7]]) + [(lam native_7 [[(builtin equalsData) encoded_6] encoded_6]) [(builtin unMapData) encoded_6]]) [(builtin mapData) anf_5]]) - [[builtin_10 anf_4] (con (list (pair data data)) [])]]) + [[builtin_8 anf_4] (con (list (pair data data)) [])]]) [[(builtin mkPairData) anf_2] anf_3]]) [fromInt_1 (con integer 2)]]) [fromInt_1 (con integer 1)]]) diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__record_wire_order_access_update_and_accessor_execute.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__record_wire_order_access_update_and_accessor_execute.snap index 08f08b8f..9be8a5dc 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__record_wire_order_access_update_and_accessor_execute.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__record_wire_order_access_update_and_accessor_execute.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 239 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype alias person = { age : int, active : bool }\nread : person -> int\nread = .age\noriginal : person\noriginal = { active = True, age = 1 }\nmain : int\nmain = read { original | age = 42 }\n" --- --- unoptimized Core @@ -34,18 +33,9 @@ main#1 [(lam projection_10 projection_10) (case record_6 (lam generated_15 (lam generated_16 generated_15)))])]) --- optimized Core -let original#20 : { _0 : int, _1 : bool } = constr 0 1 true in -let projection#23 : bool = field@1/2 original#20 in -let anf#27 : { _0 : int, _1 : bool } = constr 0 42 projection#23 in -field@0/2 anf#27 +42 --- optimized UPLC -(program 1.1.0 - [(lam original_1 - [(lam projection_2 - [(lam anf_3 (case anf_3 (lam generated_4 (lam generated_5 generated_4)))) - (constr 0 (con integer 42) projection_2)]) - (case original_1 (lam generated_6 (lam generated_7 generated_7)))]) - (constr 0 (con integer 1) (con bool True))]) +(program 1.1.0 (con integer 42)) --- result (con integer 42) --- logs diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_little_constructor_patterns_and_tuples.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_little_constructor_patterns_and_tuples.snap index 501e0d4a..fe4070f5 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_little_constructor_patterns_and_tuples.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_little_constructor_patterns_and_tuples.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 239 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype option 'a = None | Some 'a\nunwrap fallback opt =\n case opt of\n None -> fallback\n Some x -> x\nmain : unit\nmain = unwrap () (Some ())\n" --- --- unoptimized Core @@ -25,14 +24,9 @@ main#1 [(lam match_8 (case match_8 fallback_5 (lam field_9 [(lam x_7 x_7) field_9]))) opt_6]))]) --- optimized Core -let anf#24 : Main.option unit = constr 1 () in -case@Tag anf#24 of - 0 -> () - 1 field#14 -> field#14 +() --- optimized UPLC -(program 1.1.0 - [(lam anf_1 (case anf_1 (con unit ()) (lam field_2 field_2))) - (constr 1 (con unit ()))]) +(program 1.1.0 (con unit ())) --- result (con unit ()) --- logs diff --git a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_shared_default_leaf.snap b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_shared_default_leaf.snap index cfd98e45..c72682d0 100644 --- a/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_shared_default_leaf.snap +++ b/crates/nash-codegen/src/build/snapshots/nash_codegen__build__tests__source_shared_default_leaf.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests.rs -assertion_line: 1281 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain : bool\nmain =\n case (False, False) of\n (True, True) -> True\n _ -> trace \"default\" False\n" --- --- unoptimized Core @@ -41,26 +40,11 @@ main#1 (lam value_10 value_10)]) (con string "default")]) --- optimized Core -let match#16 : (bool, bool) = constr 0 false false in -let leaf#17 : @delay bool = delay (trace "default" in false) in -case@Tag match#16 of - 0 field#18 field#19 -> case@Bool field#18 of - False -> force leaf#17 - True -> case@Bool field#19 of - False -> force leaf#17 - True -> true +trace "default" in false --- optimized UPLC (program 1.1.0 - [(lam builtin_5 - [(lam match_1 - [(lam leaf_2 - (case - match_1 - (lam field_3 - (lam field_4 - (case field_3 (force leaf_2) (case field_4 (force leaf_2) (con bool True))))))) - (delay (force [[builtin_5 (con string "default")] (delay (con bool False))]))]) - (constr 0 (con bool False) (con bool False))]) + [(lam builtin_1 + (force [[builtin_1 (con string "default")] (delay (con bool False))])) (force (builtin trace))]) --- result (con bool False) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__bls12_381_elements_from_data_conversion.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__bls12_381_elements_from_data_conversion.snap index 80fd43cb..7a1623ca 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__bls12_381_elements_from_data_conversion.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__bls12_381_elements_from_data_conversion.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 20 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype alias proof = { piA : bls_g1, piB : bls_g2 }\nencode : proof -> Data\nencode p = Builtin.constrData 0 [B (bls12_381_g1_compress p.piA), B (bls12_381_g2_compress p.piB)]\npk : proof\npk =\n { piA = (bls12_381_g1_uncompress #\"b28cb29bc282be68df977b35eb9d8e98b3a0a3fc7c372990bddc50419ca86693e491755338fed4fb42231a7c081252ce\")\n , piB = (bls12_381_g2_uncompress #\"b9215e5bc481ba6552384c89c23d45bd650b69462868248bfbb83aee7060579404dba41c781dec7c2bec5fccec06842e0e66ad6d86c7c76c468a32c9c0080eea0219d0953b44b1c4f5605afb1e5a3193264ff730222e94f55207628235f3b423\")\n }\nmain : bool\nmain =\n case encode pk of\n Constr pair(0, [B point, _]) -> bls12_381_g1_equal (bls12_381_g1_uncompress point) pk.piA\n _ -> fail\n" --- --- unoptimized Core @@ -127,117 +126,92 @@ main#1 --- optimized Core let anf#85 : bls_g1 = bls12_381_G1_uncompress (con bytestring #b28cb29bc282be68df977b35eb9d8e98b3a0a3fc7c372990bddc50419ca86693e491755338fed4fb42231a7c081252ce) in let anf#87 : bls_g2 = bls12_381_G2_uncompress (con bytestring #b9215e5bc481ba6552384c89c23d45bd650b69462868248bfbb83aee7060579404dba41c781dec7c2bec5fccec06842e0e66ad6d86c7c76c468a32c9c0080eea0219d0953b44b1c4f5605afb1e5a3193264ff730222e94f55207628235f3b423) in -let pk#21 : { _0 : bls_g1, _1 : bls_g2 } = constr 0 anf#85 anf#87 in -let projection#13 : bls_g1 = field@0/2 pk#21 in -let anf#79 : bytes = bls12_381_G1_compress projection#13 in +let anf#79 : bytes = bls12_381_G1_compress anf#85 in let evaluated#15 : Data = bData anf#79 in -let projection#16 : bls_g2 = field@1/2 pk#21 in -let anf#80 : bytes = bls12_381_G2_compress projection#16 in +let anf#80 : bytes = bls12_381_G2_compress anf#87 in let anf#81 : Data = bData anf#80 in let anf#82 : list Data = mkCons anf#81 (con (list data) []) in let anf#83 : list Data = mkCons evaluated#15 anf#82 in let match#23 : Data = constrData 0 anf#83 in let leaf#24 : @delay bool = delay error in -case@Data match#23 of - DataConstr field#25 -> case@Pair field#25 of - Pair field#26 field#58 -> let anf#88 : int -> bool = equalsInteger field#26 in - let anf#90 : bool = anf#88 0 in - case@Bool anf#90 of - True -> case@List field#58 of - Nil -> force leaf#24 - Cons field#60 field#61 -> case@Data field#60 of - DataConstr field#62 -> force leaf#24 - DataMap field#63 -> force leaf#24 - DataList field#64 -> force leaf#24 - DataI field#65 -> force leaf#24 - DataB field#66 -> case@List field#61 of - Nil -> force leaf#24 - Cons field#67 field#68 -> case@List field#68 of - Nil -> let evaluated#70 : bls_g1 = bls12_381_G1_uncompress field#66 in - let projection#71 : bls_g1 = field@0/2 pk#21 in - bls12_381_G1_equal evaluated#70 projection#71 - Cons field#72 field#73 -> force leaf#24 - False -> force leaf#24 - DataMap field#74 -> force leaf#24 - DataList field#75 -> force leaf#24 - DataI field#76 -> force leaf#24 - DataB field#77 -> force leaf#24 +let field#25 : pair int (list Data) = unConstrData match#23 in +case@Pair field#25 of + Pair field#26 field#58 -> let anf#88 : int -> bool = equalsInteger field#26 in + let anf#90 : bool = anf#88 0 in + case@Bool anf#90 of + True -> case@List field#58 of + Nil -> force leaf#24 + Cons field#60 field#61 -> case@Data field#60 of + DataConstr field#62 -> force leaf#24 + DataMap field#63 -> force leaf#24 + DataList field#64 -> force leaf#24 + DataI field#65 -> force leaf#24 + DataB field#66 -> case@List field#61 of + Nil -> force leaf#24 + Cons field#67 field#68 -> case@List field#68 of + Nil -> let evaluated#70 : bls_g1 = bls12_381_G1_uncompress field#66 in + bls12_381_G1_equal evaluated#70 anf#85 + Cons field#72 field#73 -> force leaf#24 + False -> force leaf#24 --- optimized UPLC (program 1.1.0 - [(lam builtin_48 - [(lam builtin_49 + [(lam builtin_34 + [(lam builtin_35 [(lam anf_1 [(lam anf_2 - [(lam pk_3 - [(lam projection_4 + [(lam anf_3 + [(lam evaluated_4 [(lam anf_5 - [(lam evaluated_6 - [(lam projection_7 + [(lam anf_6 + [(lam anf_7 [(lam anf_8 - [(lam anf_9 - [(lam anf_10 - [(lam anf_11 - [(lam match_12 - [(lam leaf_14 - [(lam generated_44 - (force - [[[[[[builtin_48 generated_44] - (delay - [(lam field_17 - (case - field_17 + [(lam match_9 + [(lam leaf_10 + [(lam field_11 + (case + field_11 + (lam field_12 + (lam field_13 + [(lam anf_14 + [(lam anf_16 + (case + anf_16 + (force leaf_10) + (case + field_13 + (lam field_17 (lam field_18 - (lam field_19 - [(lam anf_20 - [(lam anf_22 - (case - anf_22 - (force leaf_14) - (case - field_19 - (lam field_27 + [(lam generated_33 + (force + [[[[[[builtin_34 generated_33] (delay (force leaf_10))] (delay (force leaf_10))] + (delay (force leaf_10))] + (delay (force leaf_10))] + (delay + [(lam field_27 + (case + field_18 (lam field_28 - [(lam generated_45 - (force - [[[[[[builtin_48 generated_45] (delay (force leaf_14))] (delay (force leaf_14))] - (delay (force leaf_14))] - (delay (force leaf_14))] - (delay - [(lam field_33 - (case - field_28 - (lam field_34 - (lam field_35 - (case - field_35 - (lam field_38 (lam field_39 (force leaf_14))) - [(lam evaluated_36 - [(lam projection_37 [[(builtin bls12_381_G1_equal) evaluated_36] projection_37]) - (case pk_3 (lam generated_46 (lam generated_47 generated_46)))]) - [(builtin bls12_381_G1_uncompress) field_33]]))) - (force leaf_14))) - [(builtin unBData) generated_45]])])) - field_27])) - (force leaf_14)))) - [anf_20 (con integer 0)]]) - [(builtin equalsInteger) field_18]])))) - [(builtin unConstrData) generated_44]])] - (delay (force leaf_14))] - (delay (force leaf_14))] - (delay (force leaf_14))] - (delay (force leaf_14))])) - match_12]) - (delay (error))]) - [[(builtin constrData) (con integer 0)] anf_11]]) - [[builtin_49 evaluated_6] anf_10]]) - [[builtin_49 anf_9] (con (list data) [])]]) - [(builtin bData) anf_8]]) - [(builtin bls12_381_G2_compress) projection_7]]) - (case pk_3 (lam generated_50 (lam generated_51 generated_51)))]) + (lam field_29 + (case + field_29 + (lam field_31 (lam field_32 (force leaf_10))) + [(lam evaluated_30 [[(builtin bls12_381_G1_equal) evaluated_30] anf_1]) + [(builtin bls12_381_G1_uncompress) field_27]]))) + (force leaf_10))) + [(builtin unBData) generated_33]])])) + field_17])) + (force leaf_10)))) + [anf_14 (con integer 0)]]) + [(builtin equalsInteger) field_12]])))) + [(builtin unConstrData) match_9]]) + (delay (error))]) + [[(builtin constrData) (con integer 0)] anf_8]]) + [[builtin_35 evaluated_4] anf_7]]) + [[builtin_35 anf_6] (con (list data) [])]]) [(builtin bData) anf_5]]) - [(builtin bls12_381_G1_compress) projection_4]]) - (case pk_3 (lam generated_52 (lam generated_53 generated_52)))]) - (constr 0 anf_1 anf_2)]) + [(builtin bls12_381_G2_compress) anf_2]]) + [(builtin bData) anf_3]]) + [(builtin bls12_381_G1_compress) anf_1]]) [(builtin bls12_381_G2_uncompress) (con bytestring #b9215e5bc481ba6552384c89c23d45bd650b69462868248bfbb83aee7060579404dba41c781dec7c2bec5fccec06842e0e66ad6d86c7c76c468a32c9c0080eea0219d0953b44b1c4f5605afb1e5a3193264ff730222e94f55207628235f3b423)]]) [(builtin bls12_381_G1_uncompress) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__cast_never.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__cast_never.snap index 81c48b1f..dfc8d9c5 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__cast_never.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__cast_never.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 42 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Data exposing (ToData)\ntype Option = Some Int | None\ntype never = Never\ndecodeNever : Data -> never\ndecodeNever value =\n case value of\n Constr pair(1, []) -> Never\n _ -> fail\nmain : unit\nmain =\n case decodeNever (toData None) of\n Never -> ()\n" --- --- unoptimized Core @@ -65,52 +64,37 @@ main#1 --- optimized Core let anf#50 : Main.Option = constrData 1 (con (list data) []) in let leaf#16 : @delay Main.never = delay error in -let match#45 : Main.never = case@Data anf#50 of - DataConstr field#17 -> case@Pair field#17 of - Pair field#18 field#19 -> let anf#47 : int -> bool = equalsInteger field#18 in - let anf#49 : bool = anf#47 1 in - case@Bool anf#49 of - True -> case@List field#19 of - Nil -> constr 0 - Cons field#34 field#35 -> force leaf#16 - False -> force leaf#16 - DataMap field#36 -> force leaf#16 - DataList field#37 -> force leaf#16 - DataI field#38 -> force leaf#16 - DataB field#39 -> force leaf#16 in +let field#17 : pair int (list Data) = unConstrData anf#50 in +let match#45 : Main.never = case@Pair field#17 of + Pair field#18 field#19 -> let anf#47 : int -> bool = equalsInteger field#18 in + let anf#49 : bool = anf#47 1 in + case@Bool anf#49 of + True -> case@List field#19 of + Nil -> constr 0 + Cons field#34 field#35 -> force leaf#16 + False -> force leaf#16 in () --- optimized UPLC (program 1.1.0 - [(lam builtin_16 - [(lam anf_1 - [(lam leaf_2 - [(lam match_14 (con unit ())) - [(lam generated_15 - (force - [[[[[[builtin_16 generated_15] - (delay - [(lam field_3 + [(lam anf_1 + [(lam leaf_2 + [(lam field_3 + [(lam match_10 (con unit ())) + (case + field_3 + (lam field_4 + (lam field_5 + [(lam anf_6 + [(lam anf_7 (case - field_3 - (lam field_4 - (lam field_5 - [(lam anf_6 - [(lam anf_7 - (case - anf_7 - (force leaf_2) - (case field_5 (lam field_8 (lam field_9 (force leaf_2))) (constr 0)))) - [anf_6 (con integer 1)]]) - [(builtin equalsInteger) field_4]])))) - [(builtin unConstrData) generated_15]])] - (delay (force leaf_2))] - (delay (force leaf_2))] - (delay (force leaf_2))] - (delay (force leaf_2))])) - anf_1]]) - (delay (error))]) - [[(builtin constrData) (con integer 1)] (con (list data) [])]]) - (force (builtin chooseData))]) + anf_7 + (force leaf_2) + (case field_5 (lam field_8 (lam field_9 (force leaf_2))) (constr 0)))) + [anf_6 (con integer 1)]]) + [(builtin equalsInteger) field_4]])))]) + [(builtin unConstrData) anf_1]]) + (delay (error))]) + [[(builtin constrData) (con integer 1)] (con (list data) [])]]) --- result (con unit ()) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__custom_validate_rejects_wrong_shape.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__custom_validate_rejects_wrong_shape.snap index 55adcd6f..8b757e00 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__custom_validate_rejects_wrong_shape.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__custom_validate_rejects_wrong_shape.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 552 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Data exposing (Validate)\ntype Datum = Datum Int\nimpl Validate Datum where\n validate value =\n case value of\n Constr pair(0, [I _]) -> coerce value\n _ -> fail\ndecoded : Datum\ndecoded = validate (Builtin.constrData 0 [B #\"aa\"])\nmain =\n case decoded of\n Datum number -> unIData number\n" --- --- unoptimized Core @@ -109,86 +108,73 @@ let anf#80 : Data = bData (con bytestring #aa) in let anf#81 : list Data = mkCons anf#80 (con (list data) []) in let anf#82 : Data = constrData 0 anf#81 in let leaf#23 : @delay Main.Datum = delay error in -let decoded#66 : Main.Datum = case@Data anf#82 of - DataConstr field#24 -> case@Pair field#24 of - Pair field#25 field#26 -> let anf#75 : int -> bool = equalsInteger field#25 in - let anf#77 : bool = anf#75 0 in - case@Bool anf#77 of - True -> case@List field#26 of - Nil -> force leaf#23 - Cons field#28 field#29 -> case@Data field#28 of - DataConstr field#30 -> force leaf#23 - DataMap field#31 -> force leaf#23 - DataList field#32 -> force leaf#23 - DataI field#33 -> case@List field#29 of - Nil -> anf#82 - Cons field#55 field#56 -> force leaf#23 - DataB field#57 -> force leaf#23 - False -> force leaf#23 - DataMap field#58 -> force leaf#23 - DataList field#59 -> force leaf#23 - DataI field#60 -> force leaf#23 - DataB field#61 -> force leaf#23 in +let field#24 : pair int (list Data) = unConstrData anf#82 in +let decoded#66 : Main.Datum = case@Pair field#24 of + Pair field#25 field#26 -> let anf#75 : int -> bool = equalsInteger field#25 in + let anf#77 : bool = anf#75 0 in + case@Bool anf#77 of + True -> case@List field#26 of + Nil -> force leaf#23 + Cons field#28 field#29 -> case@Data field#28 of + DataConstr field#30 -> force leaf#23 + DataMap field#31 -> force leaf#23 + DataList field#32 -> force leaf#23 + DataI field#33 -> case@List field#29 of + Nil -> anf#82 + Cons field#55 field#56 -> force leaf#23 + DataB field#57 -> force leaf#23 + False -> force leaf#23 in let projection#68 : pair int (list Data) = unConstrData decoded#66 in case@Pair projection#68 of Pair tag#69 fields#70 -> case@List fields#70 of Cons field#71 fieldTail#72 -> unIData field#71 --- optimized UPLC (program 1.1.0 - [(lam builtin_41 - [(lam builtin_42 + [(lam builtin_36 + [(lam builtin_37 [(lam anf_1 [(lam anf_2 [(lam anf_3 [(lam leaf_4 - [(lam decoded_27 - [(lam projection_34 - (case - projection_34 - (lam tag_35 - (lam fields_36 - (case - fields_36 - (lam field_37 (lam fieldTail_38 [(builtin unIData) field_37])) - (error)))))) - [(builtin unConstrData) decoded_27]]) - [(lam generated_39 - (force - [[[[[[builtin_41 generated_39] - (delay - [(lam field_5 + [(lam field_5 + [(lam decoded_19 + [(lam projection_20 + (case + projection_20 + (lam tag_21 + (lam fields_22 (case - field_5 - (lam field_6 - (lam field_7 - [(lam anf_8 - [(lam anf_9 - (case - anf_9 - (force leaf_4) - (case - field_7 - (lam field_10 - (lam field_11 - [(lam generated_40 - (force - [[[[[[builtin_41 generated_40] (delay (force leaf_4))] (delay (force leaf_4))] - (delay (force leaf_4))] - (delay (case field_11 (lam field_16 (lam field_17 (force leaf_4))) anf_3))] - (delay (force leaf_4))])) - field_10])) - (force leaf_4)))) - [anf_8 (con integer 0)]]) - [(builtin equalsInteger) field_6]])))) - [(builtin unConstrData) generated_39]])] - (delay (force leaf_4))] - (delay (force leaf_4))] - (delay (force leaf_4))] - (delay (force leaf_4))])) - anf_3]]) + fields_22 + (lam field_27 (lam fieldTail_34 [(builtin unIData) field_27])) + (error)))))) + [(builtin unConstrData) decoded_19]]) + (case + field_5 + (lam field_6 + (lam field_7 + [(lam anf_8 + [(lam anf_9 + (case + anf_9 + (force leaf_4) + (case + field_7 + (lam field_10 + (lam field_11 + [(lam generated_35 + (force + [[[[[[builtin_36 generated_35] (delay (force leaf_4))] (delay (force leaf_4))] + (delay (force leaf_4))] + (delay (case field_11 (lam field_16 (lam field_17 (force leaf_4))) anf_3))] + (delay (force leaf_4))])) + field_10])) + (force leaf_4)))) + [anf_8 (con integer 0)]]) + [(builtin equalsInteger) field_6]])))]) + [(builtin unConstrData) anf_3]]) (delay (error))]) [[(builtin constrData) (con integer 0)] anf_2]]) - [[builtin_42 anf_1] (con (list data) [])]]) + [[builtin_37 anf_1] (con (list data) [])]]) [(builtin bData) (con bytestring #aa)]]) (force (builtin mkCons))]) (force (builtin chooseData))]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_in_silent_and_verbose.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_in_silent_and_verbose.snap index 1ac6160a..8053a5a1 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_in_silent_and_verbose.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_in_silent_and_verbose.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 276 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\nfromAssetList : list int -> list int\nfromAssetList inner =\n case inner of\n (_ :: _) as x -> x\n _ -> fail\nmain : bool\nmain =\n let\n x = fromAssetList []\n in\n eq x x\n" --- --- unoptimized Core @@ -94,18 +93,11 @@ letrec True -> eq#31 field#39 field#44 False -> false in -let inner#47 : list int = (con (list integer) []) in -let x#53 : list int = case@List inner#47 of - Nil -> error - Cons field#49 field#50 -> inner#47 in +let x#53 : list int = error in eq#31 x#53 x#53 --- optimized UPLC (program 1.1.0 - [(lam eq_15 - [(lam inner_16 - [(lam x_19 [[eq_15 x_19] x_19]) - (case inner_16 (lam field_17 (lam field_18 inner_16)) (error))]) - (con (list integer) [])]) + [(lam eq_15 [(lam x_16 [[eq_15 x_16] x_16]) (error)]) [(lam self_4 [self_4 self_4]) (lam self_5 (lam xs_6 diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_silent.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_silent.snap index 1ac6160a..8053a5a1 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_silent.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__expect_non_empty_list_with_as_binding_fails_silent.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 276 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\nfromAssetList : list int -> list int\nfromAssetList inner =\n case inner of\n (_ :: _) as x -> x\n _ -> fail\nmain : bool\nmain =\n let\n x = fromAssetList []\n in\n eq x x\n" --- --- unoptimized Core @@ -94,18 +93,11 @@ letrec True -> eq#31 field#39 field#44 False -> false in -let inner#47 : list int = (con (list integer) []) in -let x#53 : list int = case@List inner#47 of - Nil -> error - Cons field#49 field#50 -> inner#47 in +let x#53 : list int = error in eq#31 x#53 x#53 --- optimized UPLC (program 1.1.0 - [(lam eq_15 - [(lam inner_16 - [(lam x_19 [[eq_15 x_19] x_19]) - (case inner_16 (lam field_17 (lam field_18 inner_16)) (error))]) - (con (list integer) [])]) + [(lam eq_15 [(lam x_16 [[eq_15 x_16] x_16]) (error)]) [(lam self_4 [self_4 self_4]) (lam self_5 (lam xs_6 diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast.snap index 8096dd30..460834da 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 63 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Option exposing (type option(..))\ntype foo = Bar | Bax\ntoData : foo -> Data\ntoData value =\n case value of\n Bar -> Builtin.constrData 0 []\n Bax -> Builtin.constrData 1 []\ndecode : Data -> option foo\ndecode value =\n case value of\n Constr pair(0, []) -> Some Bar\n Constr pair(1, []) -> Some Bax\n _ -> None\nhardCast value =\n case decode value of\n Some result -> result\n None -> fail\nsame a b =\n case (a, b) of\n (Bar, Bar) -> True\n (Bax, Bax) -> True\n _ -> False\nmain : bool\nmain =\n let\n x = toData Bar\n in\n case decode x of\n Some _ -> True\n None ->\n let\n y = hardCast x\n in\n same y y\n" --- --- unoptimized Core @@ -153,10 +152,7 @@ case@Data value#22 of DataList field#63 -> force leaf#24 DataI field#64 -> force leaf#24 DataB field#65 -> force leaf#24 in -let anf#99 : Main.foo = constr 0 in -let x#84 : Data = case@Tag anf#99 of - 0 -> constrData 0 (con (list data) []) - 1 -> constrData 1 (con (list data) []) in +let x#84 : Data = constrData 0 (con (list data) []) in let match#85 : nash/base:Option.option Main.foo = decode#66 x#84 in case@Tag match#85 of 0 field#86 -> true @@ -164,54 +160,41 @@ case@Tag match#85 of let y#87 : Main.foo = case@Tag match#77 of 0 field#78 -> field#78 1 -> error in - let match#71 : (Main.foo, Main.foo) = constr 0 y#87 y#87 in let leaf#72 : @delay 'erased = delay false in - case@Tag match#71 of - 0 field#73 field#74 -> case@Tag field#73 of - 0 -> case@Tag field#74 of - 0 -> true - 1 -> force leaf#72 - 1 -> case@Tag field#74 of - 0 -> force leaf#72 - 1 -> true + case@Tag y#87 of + 0 -> case@Tag y#87 of + 0 -> true + 1 -> force leaf#72 + 1 -> case@Tag y#87 of + 0 -> force leaf#72 + 1 -> true --- optimized UPLC (program 1.1.0 - [(lam builtin_40 + [(lam builtin_36 [(lam eq_1 [(lam decode_23 - [(lam anf_28 - [(lam x_29 - [(lam match_30 - (case - match_30 - (lam field_31 (con bool True)) - [(lam match_32 - [(lam y_34 - [(lam match_35 - [(lam leaf_36 - (case - match_35 - (lam field_37 - (lam field_38 - (case - field_37 - (case field_38 (con bool True) (force leaf_36)) - (case field_38 (force leaf_36) (con bool True))))))) - (delay (con bool False))]) - (constr 0 y_34 y_34)]) - (case match_32 (lam field_33 field_33) (error))]) - [decode_23 x_29]])) - [decode_23 x_29]]) + [(lam x_28 + [(lam match_29 (case - anf_28 - [[(builtin constrData) (con integer 0)] (con (list data) [])] - [[(builtin constrData) (con integer 1)] (con (list data) [])])]) - (constr 0)]) + match_29 + (lam field_30 (con bool True)) + [(lam match_31 + [(lam y_33 + [(lam leaf_34 + (case + y_33 + (case y_33 (con bool True) (force leaf_34)) + (case y_33 (force leaf_34) (con bool True)))) + (delay (con bool False))]) + (case match_31 (lam field_32 field_32) (error))]) + [decode_23 x_28]])) + [decode_23 x_28]]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) (lam value_2 [(lam leaf_3 - [(lam generated_39 + [(lam generated_35 (force - [[[[[[builtin_40 generated_39] + [[[[[[builtin_36 generated_35] (delay [(lam field_4 (case @@ -239,7 +222,7 @@ case@Tag match#85 of [(lam anf_9 (constr 0 anf_9)) (constr 0)]))) [anf_7 (con integer 0)]]) [eq_1 field_5]])))) - [(builtin unConstrData) generated_39]])] + [(builtin unConstrData) generated_35]])] (delay (force leaf_3))] (delay (force leaf_3))] (delay (force leaf_3))] diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast_silent.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast_silent.snap index 8096dd30..460834da 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast_silent.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__builtins__hard_soft_cast_silent.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/builtins.rs -assertion_line: 63 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Option exposing (type option(..))\ntype foo = Bar | Bax\ntoData : foo -> Data\ntoData value =\n case value of\n Bar -> Builtin.constrData 0 []\n Bax -> Builtin.constrData 1 []\ndecode : Data -> option foo\ndecode value =\n case value of\n Constr pair(0, []) -> Some Bar\n Constr pair(1, []) -> Some Bax\n _ -> None\nhardCast value =\n case decode value of\n Some result -> result\n None -> fail\nsame a b =\n case (a, b) of\n (Bar, Bar) -> True\n (Bax, Bax) -> True\n _ -> False\nmain : bool\nmain =\n let\n x = toData Bar\n in\n case decode x of\n Some _ -> True\n None ->\n let\n y = hardCast x\n in\n same y y\n" --- --- unoptimized Core @@ -153,10 +152,7 @@ case@Data value#22 of DataList field#63 -> force leaf#24 DataI field#64 -> force leaf#24 DataB field#65 -> force leaf#24 in -let anf#99 : Main.foo = constr 0 in -let x#84 : Data = case@Tag anf#99 of - 0 -> constrData 0 (con (list data) []) - 1 -> constrData 1 (con (list data) []) in +let x#84 : Data = constrData 0 (con (list data) []) in let match#85 : nash/base:Option.option Main.foo = decode#66 x#84 in case@Tag match#85 of 0 field#86 -> true @@ -164,54 +160,41 @@ case@Tag match#85 of let y#87 : Main.foo = case@Tag match#77 of 0 field#78 -> field#78 1 -> error in - let match#71 : (Main.foo, Main.foo) = constr 0 y#87 y#87 in let leaf#72 : @delay 'erased = delay false in - case@Tag match#71 of - 0 field#73 field#74 -> case@Tag field#73 of - 0 -> case@Tag field#74 of - 0 -> true - 1 -> force leaf#72 - 1 -> case@Tag field#74 of - 0 -> force leaf#72 - 1 -> true + case@Tag y#87 of + 0 -> case@Tag y#87 of + 0 -> true + 1 -> force leaf#72 + 1 -> case@Tag y#87 of + 0 -> force leaf#72 + 1 -> true --- optimized UPLC (program 1.1.0 - [(lam builtin_40 + [(lam builtin_36 [(lam eq_1 [(lam decode_23 - [(lam anf_28 - [(lam x_29 - [(lam match_30 - (case - match_30 - (lam field_31 (con bool True)) - [(lam match_32 - [(lam y_34 - [(lam match_35 - [(lam leaf_36 - (case - match_35 - (lam field_37 - (lam field_38 - (case - field_37 - (case field_38 (con bool True) (force leaf_36)) - (case field_38 (force leaf_36) (con bool True))))))) - (delay (con bool False))]) - (constr 0 y_34 y_34)]) - (case match_32 (lam field_33 field_33) (error))]) - [decode_23 x_29]])) - [decode_23 x_29]]) + [(lam x_28 + [(lam match_29 (case - anf_28 - [[(builtin constrData) (con integer 0)] (con (list data) [])] - [[(builtin constrData) (con integer 1)] (con (list data) [])])]) - (constr 0)]) + match_29 + (lam field_30 (con bool True)) + [(lam match_31 + [(lam y_33 + [(lam leaf_34 + (case + y_33 + (case y_33 (con bool True) (force leaf_34)) + (case y_33 (force leaf_34) (con bool True)))) + (delay (con bool False))]) + (case match_31 (lam field_32 field_32) (error))]) + [decode_23 x_28]])) + [decode_23 x_28]]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) (lam value_2 [(lam leaf_3 - [(lam generated_39 + [(lam generated_35 (force - [[[[[[builtin_40 generated_39] + [[[[[[builtin_36 generated_35] (delay [(lam field_4 (case @@ -239,7 +222,7 @@ case@Tag match#85 of [(lam anf_9 (constr 0 anf_9)) (constr 0)]))) [anf_7 (con integer 0)]]) [eq_1 field_5]])))) - [(builtin unConstrData) generated_39]])] + [(builtin unConstrData) generated_35]])] (delay (force leaf_3))] (delay (force leaf_3))] (delay (force leaf_3))] diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_none_wrap_int.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_none_wrap_int.snap index a9f12512..71a76636 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_none_wrap_int.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_none_wrap_int.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 1 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmap opt f =\n case opt of\n None -> None\n Some a -> Some (f a)\nnone : option int\nnone = None\nmain = eq (map none (\\_ -> 14)) None\n" --- --- unoptimized Core @@ -72,45 +71,9 @@ main#1 (builtin equalsInteger)]) (lam value_33 value_33)]) --- optimized Core -let none#51 : Main.option int = constr 0 in -let anf#58 : Main.option int = case@Tag none#51 of - 0 -> constr 0 - 1 field#47 -> constr 1 14 in -let anf#60 : Main.option int = constr 0 in -let match#34 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#58 anf#60 in -let leaf#35 : @delay bool = delay false in -case@Tag match#34 of - 0 field#36 field#37 -> case@Tag field#36 of - 0 -> case@Tag field#37 of - 0 -> true - 1 field#38 -> force leaf#35 - 1 field#39 -> case@Tag field#37 of - 0 -> force leaf#35 - 1 field#40 -> equalsInteger field#39 field#40 +true --- optimized UPLC -(program 1.1.0 - [(lam none_1 - [(lam anf_3 - [(lam anf_4 - [(lam match_5 - [(lam leaf_6 - (case - match_5 - (lam field_7 - (lam field_8 - (case - field_7 - (case field_8 (con bool True) (lam field_9 (force leaf_6))) - (lam field_10 - (case - field_8 - (force leaf_6) - (lam field_11 [[(builtin equalsInteger) field_10] field_11])))))))) - (delay (con bool False))]) - (constr 0 anf_3 anf_4)]) - (constr 0)]) - (case none_1 (constr 0) (lam field_2 (constr 1 (con integer 14))))]) - (constr 0)]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_wrap_void.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_wrap_void.snap index f34ef9e1..017cd7d5 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_wrap_void.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_19_map_wrap_void.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 26 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmap opt f =\n case opt of\n None -> None\n Some a -> Some (f a)\nnone : option int\nnone = None\nmain = eq (map none (\\_ -> ())) None\n" --- --- unoptimized Core @@ -75,41 +74,9 @@ main#1 (lam arg_35 (case arg_34 (case arg_35 [fromBool_10 (con bool True)]))))]) (lam value_33 value_33)]) --- optimized Core -let none#59 : Main.option int = constr 0 in -let anf#66 : Main.option unit = case@Tag none#59 of - 0 -> constr 0 - 1 field#55 -> constr 1 () in -let anf#68 : Main.option unit = constr 0 in -let match#42 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#66 anf#68 in -let leaf#43 : @delay bool = delay false in -case@Tag match#42 of - 0 field#44 field#45 -> case@Tag field#44 of - 0 -> case@Tag field#45 of - 0 -> true - 1 field#46 -> force leaf#43 - 1 field#47 -> case@Tag field#45 of - 0 -> force leaf#43 - 1 field#48 -> true +true --- optimized UPLC -(program 1.1.0 - [(lam none_1 - [(lam anf_3 - [(lam anf_4 - [(lam match_5 - [(lam leaf_6 - (case - match_5 - (lam field_7 - (lam field_8 - (case - field_7 - (case field_8 (con bool True) (lam field_9 (force leaf_6))) - (lam field_10 (case field_8 (force leaf_6) (lam field_11 (con bool True))))))))) - (delay (con bool False))]) - (constr 0 anf_3 anf_4)]) - (constr 0)]) - (case none_1 (constr 0) (lam field_2 (constr 1 (con unit ()))))]) - (constr 0)]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_20_map_some.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_20_map_some.snap index 7c62fb79..47aec8fa 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_20_map_some.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_20_map_some.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 51 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmap opt f =\n case opt of\n None -> None\n Some a -> Some (f a)\nmain = eq (map (Some 14) (\\n -> addInteger n 1)) (Some 15)\n" --- --- unoptimized Core @@ -69,50 +68,12 @@ main#1 (builtin equalsInteger)]) (lam value_33 value_33)]) --- optimized Core -let anf#59 : Main.option int = constr 1 14 in -let anf#61 : Main.option int = case@Tag anf#59 of - 0 -> constr 0 - 1 field#47 -> let anf#57 : 'erased = addInteger field#47 1 in - constr 1 anf#57 in -let anf#64 : Main.option int = constr 1 15 in -let match#34 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#61 anf#64 in -let leaf#35 : @delay bool = delay false in -case@Tag match#34 of - 0 field#36 field#37 -> case@Tag field#36 of - 0 -> case@Tag field#37 of - 0 -> true - 1 field#38 -> force leaf#35 - 1 field#39 -> case@Tag field#37 of - 0 -> force leaf#35 - 1 field#40 -> equalsInteger field#39 field#40 +let anf#57 : 'erased = addInteger 14 1 in +equalsInteger anf#57 15 --- optimized UPLC (program 1.1.0 - [(lam anf_1 - [(lam anf_4 - [(lam anf_5 - [(lam match_6 - [(lam leaf_7 - (case - match_6 - (lam field_8 - (lam field_9 - (case - field_8 - (case field_9 (con bool True) (lam field_10 (force leaf_7))) - (lam field_11 - (case - field_9 - (force leaf_7) - (lam field_12 [[(builtin equalsInteger) field_11] field_12])))))))) - (delay (con bool False))]) - (constr 0 anf_4 anf_5)]) - (constr 1 (con integer 15))]) - (case - anf_1 - (constr 0) - (lam field_2 - [(lam anf_3 (constr 1 anf_3)) [[(builtin addInteger) field_2] (con integer 1)]]))]) - (constr 1 (con integer 14))]) + [(lam anf_1 [[(builtin equalsInteger) anf_1] (con integer 15)]) + [[(builtin addInteger) (con integer 14)] (con integer 1)]]) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_22_filter_map.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_22_filter_map.snap index 4501b302..12b2af79 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_22_filter_map.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_22_filter_map.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 74 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nfoldr xs f zero =\n case xs of\n [] -> zero\n x :: rest -> f x (foldr rest f zero)\nfilterMap xs f =\n foldr xs (\\x ys ->\n case f x of\n None -> ys\n Some y -> mkCons y ys\n ) []\nempty : list int\nempty = []\nmain = eq (filterMap empty (\\_ -> Some 42)) []\n" --- --- unoptimized Core @@ -142,20 +141,17 @@ letrec worker#88 : list 'erased -> 'erased [static []] = \xs#87 : list 'erased -> case@List xs#87 of Nil -> (con (list integer) []) Cons field#68 field#69 -> let anf#91 : 'erased = worker#88 field#69 in - let match#76 : Main.option int = constr 1 42 in - case@Tag match#76 of - 0 -> anf#91 - 1 field#77 -> mkCons field#77 anf#91 + mkCons 42 anf#91 in let anf#93 : list int = worker#88 (con (list integer) []) in eq#47 anf#93 (con (list integer) []) --- optimized UPLC (program 1.1.0 - [(lam builtin_28 + [(lam builtin_26 [(lam eq_17 - [(lam worker_26 - [(lam anf_27 [[eq_17 anf_27] (con (list integer) [])]) - [worker_26 (con (list integer) [])]]) + [(lam worker_24 + [(lam anf_25 [[eq_17 anf_25] (con (list integer) [])]) + [worker_24 (con (list integer) [])]]) [(lam self_18 [self_18 self_18]) (lam self_19 (lam xs_20 @@ -163,10 +159,7 @@ eq#47 anf#93 (con (list integer) []) xs_20 (lam field_21 (lam field_22 - [(lam anf_23 - [(lam match_24 - (case match_24 anf_23 (lam field_25 [[builtin_28 field_25] anf_23]))) - (constr 1 (con integer 42))]) + [(lam anf_23 [[builtin_26 (con integer 42)] anf_23]) [[self_19 self_19] field_22]])) (con (list integer) []))))]]) [(lam self_6 [self_6 self_6]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map2.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map2.snap index 1c57f07b..efab45d0 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map2.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map2.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 132 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\noptionEq same a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> same x y\n _ -> False\nmap2 optA optB f =\n case optA of\n None -> None\n Some a ->\n case optB of\n None -> None\n Some b -> Some (f a b)\npairEq (a, b) (c, d) = if eq a c then eq b d else False\nmain = optionEq pairEq (map2 (Some 14) (Some 42) (\\a b -> (a, b))) (Some (14, 42))\n" --- --- unoptimized Core @@ -121,77 +120,16 @@ main#1 (lam value_53 value_53)]) --- optimized Core let eq#64 : int -> int -> bool = equalsInteger in -let anf#101 : Main.option int = constr 1 14 in -let anf#104 : Main.option int = constr 1 42 in -let anf#105 : Main.option (int, int) = case@Tag anf#101 of - 0 -> constr 0 - 1 field#82 -> case@Tag anf#104 of - 0 -> constr 0 - 1 field#85 -> let anf#98 : 'erased = constr 0 field#82 field#85 in - constr 1 anf#98 in -let anf#109 : (int, int) = constr 0 14 42 in -let anf#110 : Main.option (int, int) = constr 1 anf#109 in -let match#54 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#105 anf#110 in -let leaf#55 : @delay 'erased = delay false in -case@Tag match#54 of - 0 field#56 field#57 -> case@Tag field#56 of - 0 -> case@Tag field#57 of - 0 -> true - 1 field#58 -> force leaf#55 - 1 field#59 -> case@Tag field#57 of - 0 -> force leaf#55 - 1 field#60 -> case@Tag field#59 of - 0 field#68 field#69 -> case@Tag field#60 of - 0 field#73 field#74 -> let anf#97 : bool = eq#64 field#68 field#73 in - case@Bool anf#97 of - True -> eq#64 field#69 field#74 - False -> false +let anf#97 : bool = eq#64 14 14 in +case@Bool anf#97 of + True -> eq#64 42 42 + False -> false --- optimized UPLC (program 1.1.0 [(lam eq_1 [(lam anf_2 - [(lam anf_3 - [(lam anf_7 - [(lam anf_8 - [(lam anf_9 - [(lam match_10 - [(lam leaf_11 - (case - match_10 - (lam field_12 - (lam field_13 - (case - field_12 - (case field_13 (con bool True) (lam field_14 (force leaf_11))) - (lam field_15 - (case - field_13 - (force leaf_11) - (lam field_16 - (case - field_15 - (lam field_17 - (lam field_18 - (case - field_16 - (lam field_19 - (lam field_20 - [(lam anf_21 (case anf_21 (con bool False) [[eq_1 field_18] field_20])) - [[eq_1 field_17] field_19]])))))))))))))) - (delay (con bool False))]) - (constr 0 anf_7 anf_9)]) - (constr 1 anf_8)]) - (constr 0 (con integer 14) (con integer 42))]) - (case - anf_2 - (constr 0) - (lam field_4 - (case - anf_3 - (constr 0) - (lam field_5 [(lam anf_6 (constr 1 anf_6)) (constr 0 field_4 field_5)]))))]) - (constr 1 (con integer 42))]) - (constr 1 (con integer 14))]) + (case anf_2 (con bool False) [[eq_1 (con integer 42)] (con integer 42)])) + [[eq_1 (con integer 14)] (con integer 14)]]) (builtin equalsInteger)]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map_pair.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map_pair.snap index 0328abd7..238c47bd 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map_pair.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_24_map_pair.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 105 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Data exposing (toData)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\noptionEq same a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> same x y\n _ -> False\nmap2 optA optB f =\n case optA of\n None -> None\n Some a ->\n case optB of\n None -> None\n Some b -> Some (f a b)\nmain = optionEq pairEq (map2 (Some 14) (Some 42) (\\a b -> mkPairData (iData a) (iData b))) (Some (mkPairData (iData 14) (iData 42)))\npairEq a b = if equalsData (toData (fstPair a)) (toData (fstPair b)) then equalsData (toData (sndPair a)) (toData (sndPair b)) else False\n" --- --- unoptimized Core @@ -115,95 +114,49 @@ main#1 (constr 0 a_12 b_13)])))]) (lam value_43 value_43)]) --- optimized Core -let anf#97 : Main.option int = constr 1 14 in -let anf#100 : Main.option int = constr 1 42 in -let anf#103 : Main.option (pair Int Int) = case@Tag anf#97 of - 0 -> constr 0 - 1 field#76 -> case@Tag anf#100 of - 0 -> constr 0 - 1 field#79 -> let anf#101 : Int = iData field#76 in - let anf#102 : Int = iData field#79 in - let anf#94 : 'erased = mkPairData anf#101 anf#102 in - constr 1 anf#94 in +let anf#101 : Int = iData 14 in +let anf#102 : Int = iData 42 in +let anf#94 : 'erased = mkPairData anf#101 anf#102 in let anf#106 : Int = iData 14 in let anf#108 : Int = iData 42 in let anf#109 : pair Int Int = mkPairData anf#106 anf#108 in -let anf#110 : Main.option (pair Int Int) = constr 1 anf#109 in -let match#51 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#103 anf#110 in -let leaf#52 : @delay 'erased = delay false in -case@Tag match#51 of - 0 field#53 field#54 -> case@Tag field#53 of - 0 -> case@Tag field#54 of - 0 -> true - 1 field#55 -> force leaf#52 - 1 field#56 -> case@Tag field#54 of - 0 -> force leaf#52 - 1 field#57 -> let projection#65 : 'erased = fstPair field#56 in - let projection#67 : 'erased = fstPair field#57 in - let anf#92 : bool = equalsData projection#65 projection#67 in - case@Bool anf#92 of - True -> let projection#68 : 'erased = sndPair field#56 in - let projection#70 : 'erased = sndPair field#57 in - equalsData projection#68 projection#70 - False -> false +let projection#65 : 'erased = fstPair anf#94 in +let projection#67 : 'erased = fstPair anf#109 in +let anf#92 : bool = equalsData projection#65 projection#67 in +case@Bool anf#92 of + True -> let projection#68 : 'erased = sndPair anf#94 in + let projection#70 : 'erased = sndPair anf#109 in + equalsData projection#68 projection#70 + False -> false --- optimized UPLC (program 1.1.0 - [(lam builtin_25 - [(lam builtin_26 + [(lam builtin_12 + [(lam builtin_13 [(lam anf_1 [(lam anf_2 - [(lam anf_8 - [(lam anf_9 - [(lam anf_10 - [(lam anf_11 - [(lam anf_12 - [(lam match_13 - [(lam leaf_14 + [(lam anf_3 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 + [(lam projection_7 + [(lam projection_8 + [(lam anf_9 (case - match_13 - (lam field_15 - (lam field_16 - (case - field_15 - (case field_16 (con bool True) (lam field_17 (force leaf_14))) - (lam field_18 - (case - field_16 - (force leaf_14) - (lam field_19 - [(lam projection_20 - [(lam projection_21 - [(lam anf_22 - (case - anf_22 - (con bool False) - [(lam projection_23 - [(lam projection_24 [[(builtin equalsData) projection_23] projection_24]) - [builtin_25 field_19]]) - [builtin_25 field_18]])) - [[(builtin equalsData) projection_20] projection_21]]) - [builtin_26 field_19]]) - [builtin_26 field_18]])))))))) - (delay (con bool False))]) - (constr 0 anf_8 anf_12)]) - (constr 1 anf_11)]) - [[(builtin mkPairData) anf_9] anf_10]]) + anf_9 + (con bool False) + [(lam projection_10 + [(lam projection_11 [[(builtin equalsData) projection_10] projection_11]) + [builtin_12 anf_6]]) + [builtin_12 anf_3]])) + [[(builtin equalsData) projection_7] projection_8]]) + [builtin_13 anf_6]]) + [builtin_13 anf_3]]) + [[(builtin mkPairData) anf_4] anf_5]]) [(builtin iData) (con integer 42)]]) [(builtin iData) (con integer 14)]]) - (case - anf_1 - (constr 0) - (lam field_3 - (case - anf_2 - (constr 0) - (lam field_4 - [(lam anf_5 - [(lam anf_6 [(lam anf_7 (constr 1 anf_7)) [[(builtin mkPairData) anf_5] anf_6]]) - [(builtin iData) field_4]]) - [(builtin iData) field_3]]))))]) - (constr 1 (con integer 42))]) - (constr 1 (con integer 14))]) + [[(builtin mkPairData) anf_1] anf_2]]) + [(builtin iData) (con integer 42)]]) + [(builtin iData) (con integer 14)]]) (force (force (builtin fstPair)))]) (force (force (builtin sndPair)))]) --- result diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_pair.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_pair.snap index b584db67..0a71f6dc 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_pair.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_pair.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 269 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Data exposing (toData)\nimport Literal exposing (..)\nimport Eq exposing (..)\ntype assocList = AssocList { inner : list (pair Bytes Int) }\nimpl Eq assocList where\n eq left right = equalsData (toData (mapData left.inner)) (toData (mapData right.inner))\nnew = AssocList { inner = [] }\ntoList : assocList -> list (pair Bytes Int)\ntoList m = m.inner\ninsert : assocList -> bytes -> int -> assocList\ninsert m k v = AssocList { inner = (doInsert m.inner k v) }\ndoInsert elems k v =\n case elems of\n [] -> [mkPairData (bData k) (iData v)]\n entry :: rest ->\n let\n k2 = unBData (fstPair entry)\n v2 = unIData (sndPair entry)\n in\n if eq k k2 then mkCons (mkPairData (bData k) (iData v)) rest\n else mkCons (mkPairData (bData k2) (iData v2)) (doInsert rest k v)\nfixture1 = insert (insert new \"foo\" 42) \"bar\" 14\nfromList xs = AssocList { inner = (doFromList xs) }\ndoFromList : list (pair Bytes Int) -> list (pair Bytes Int)\ndoFromList xs =\n case xs of\n [] -> []\n entry :: rest -> doInsert (doFromList rest) (unBData (fstPair entry)) (unIData (sndPair entry))\nunion : assocList -> assocList -> assocList\nunion left right = AssocList { inner = (doUnion left.inner right.inner) }\ndoUnion left right =\n case left of\n [] -> right\n entry :: rest -> doUnion rest (doInsert right (unBData (fstPair entry)) (unIData (sndPair entry)))\nmain = eq (union fixture1 new) fixture1\n" --- --- unoptimized Core @@ -193,7 +192,8 @@ letrec let anf#128 : list (pair Bytes Int) = anf#126 anf#127 in anf#125 anf#128 in -let new#97 : Main.assocList = constr 0 (con (list (pair data data)) []) in +let field#145 : list (pair Bytes Int) = (con (list (pair data data)) []) in +let new#97 : Main.assocList = constr 0 field#145 in let insert#103 : Main.assocList -> bytes -> int -> Main.assocList = \m#98 : Main.assocList k#99 : bytes v#100 : int -> let projection#101 : list (pair Bytes Int) = field@0/1 m#98 in let anf#130 : list (pair Bytes Int) = doInsert#66 projection#101 k#99 v#100 in constr 0 anf#130 in @@ -207,64 +207,57 @@ let anf#137 : bytes = fromString#104 "bar" in let anf#138 : int -> Main.assocList = anf#136 anf#137 in let fixture1#107 : Main.assocList = anf#138 14 in let projection#92 : list (pair Bytes Int) = field@0/1 fixture1#107 in -let projection#93 : list (pair Bytes Int) = field@0/1 new#97 in -let anf#129 : list (pair Bytes Int) = doUnion#79 projection#92 projection#93 in -let anf#140 : Main.assocList = constr 0 anf#129 in -let projection#61 : list (pair Bytes Int) = field@0/1 anf#140 in -let anf#111 : Map Bytes Int = mapData projection#61 in +let anf#129 : list (pair Bytes Int) = doUnion#79 projection#92 field#145 in +let anf#111 : Map Bytes Int = mapData anf#129 in let projection#63 : list (pair Bytes Int) = field@0/1 fixture1#107 in let anf#112 : Map Bytes Int = mapData projection#63 in equalsData anf#111 anf#112 --- optimized UPLC (program 1.1.0 - [(lam builtin_91 - [(lam builtin_92 - [(lam builtin_93 + [(lam builtin_77 + [(lam builtin_78 + [(lam builtin_79 [(lam doInsert_30 [(lam doUnion_44 - [(lam new_45 - [(lam insert_51 - [(lam fromString_52 - [(lam anf_53 + [(lam field_45 + [(lam new_46 + [(lam insert_52 + [(lam fromString_53 [(lam anf_54 [(lam anf_55 [(lam anf_56 [(lam anf_57 [(lam anf_58 [(lam anf_59 - [(lam fixture1_60 - [(lam projection_62 - [(lam projection_64 - [(lam anf_65 - [(lam anf_70 - [(lam projection_73 - [(lam anf_74 - [(lam projection_82 - [(lam anf_85 [[(builtin equalsData) anf_74] anf_85]) - [(builtin mapData) projection_82]]) - (case fixture1_60 (lam generated_86 generated_86))]) - [(builtin mapData) projection_73]]) - (case anf_70 (lam generated_87 generated_87))]) - (constr 0 anf_65)]) - [[doUnion_44 projection_62] projection_64]]) - (case new_45 (lam generated_88 generated_88))]) - (case fixture1_60 (lam generated_89 generated_89))]) - [anf_59 (con integer 14)]]) - [anf_57 anf_58]]) - [fromString_52 (con string "bar")]]) - [insert_51 anf_56]]) - [anf_55 (con integer 42)]]) - [anf_53 anf_54]]) - [fromString_52 (con string "foo")]]) - [insert_51 new_45]]) - (builtin encodeUtf8)]) - (lam m_46 - (lam k_47 - (lam v_48 - [(lam projection_49 - [(lam anf_50 (constr 0 anf_50)) [[[doInsert_30 projection_49] k_47] v_48]]) - (case m_46 (lam generated_90 generated_90))])))]) - (constr 0 (con (list (pair data data)) []))]) + [(lam anf_60 + [(lam fixture1_61 + [(lam projection_62 + [(lam anf_64 + [(lam anf_65 + [(lam projection_70 + [(lam anf_73 [[(builtin equalsData) anf_65] anf_73]) + [(builtin mapData) projection_70]]) + (case fixture1_61 (lam generated_74 generated_74))]) + [(builtin mapData) anf_64]]) + [[doUnion_44 projection_62] field_45]]) + (case fixture1_61 (lam generated_75 generated_75))]) + [anf_60 (con integer 14)]]) + [anf_58 anf_59]]) + [fromString_53 (con string "bar")]]) + [insert_52 anf_57]]) + [anf_56 (con integer 42)]]) + [anf_54 anf_55]]) + [fromString_53 (con string "foo")]]) + [insert_52 new_46]]) + (builtin encodeUtf8)]) + (lam m_47 + (lam k_48 + (lam v_49 + [(lam projection_50 + [(lam anf_51 (constr 0 anf_51)) [[[doInsert_30 projection_50] k_48] v_49]]) + (case m_47 (lam generated_76 generated_76))])))]) + (constr 0 field_45)]) + (con (list (pair data data)) [])]) [(lam self_31 [self_31 self_31]) (lam self_32 (lam left_33 @@ -282,9 +275,9 @@ equalsData anf#111 anf#112 [(builtin unIData) projection_39]]) [[doInsert_30 right_34] evaluated_38]]) [[self_32 self_32] field_36]]) - [builtin_91 field_35]]) + [builtin_77 field_35]]) [(builtin unBData) projection_37]]) - [builtin_92 field_35]])) + [builtin_78 field_35]])) right_34))))]]) (lam elems_6 (lam k_7 @@ -307,24 +300,24 @@ equalsData anf#111 anf#112 [(lam anf_25 [(lam anf_26 [(lam anf_27 - [(lam anf_28 [[builtin_93 anf_27] anf_28]) [[self_10 self_10] field_16]]) + [(lam anf_28 [[builtin_79 anf_27] anf_28]) [[self_10 self_10] field_16]]) [[(builtin mkPairData) anf_25] anf_26]]) [(builtin iData) v2_18]]) [(builtin bData) k2_20]] [(lam anf_22 [(lam anf_23 - [(lam anf_24 [[builtin_93 anf_24] field_16]) + [(lam anf_24 [[builtin_79 anf_24] field_16]) [[(builtin mkPairData) anf_22] anf_23]]) [(builtin iData) v_8]]) [(builtin bData) k_7]])) [[(builtin equalsByteString) k_7] k2_20]]) [(builtin unBData) projection_19]]) - [builtin_92 field_15]]) + [builtin_78 field_15]]) [(builtin unIData) projection_17]]) - [builtin_91 field_15]])) + [builtin_77 field_15]])) [(lam anf_12 [(lam anf_13 - [(lam anf_14 [[builtin_93 anf_14] (con (list (pair data data)) [])]) + [(lam anf_14 [[builtin_79 anf_14] (con (list (pair data data)) [])]) [[(builtin mkPairData) anf_12] anf_13]]) [(builtin iData) v_8]]) [(builtin bData) k_7]])))]])))]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_tuple.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_tuple.snap index e51ab650..b9f8aa3e 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_tuple.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__collections__acceptance_test_29_union_tuple.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/collections.rs -assertion_line: 313 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Eq exposing (..)\n-- Native lists require Storable elements; tuples use a recursive source list.\ntype sequence 'a = Nil | Cons 'a (sequence 'a)\nseqEq same left right =\n case (left, right) of\n (Nil, Nil) -> True\n (Cons x xs, Cons y ys) -> if same x y then seqEq same xs ys else False\n _ -> False\ntupleEq (a, b) (c, d) = if eq a c then eq b d else False\ntype assocList 'key 'value = AssocList { inner : sequence ('key, 'value) }\nimpl (Eq 'key, Eq 'value) => Eq (assocList 'key 'value) where\n eq left right = seqEq tupleEq left.inner right.inner\nemptyList = AssocList { inner = Nil }\nfromList xs = AssocList { inner = (doFromList xs) }\ndoFromList xs =\n case xs of\n Nil -> Nil\n Cons (k, v) rest -> doInsert (doFromList rest) k v\ninsert : Eq 'key => assocList 'key 'value -> 'key -> 'value -> assocList 'key 'value\ninsert m k v = AssocList { inner = (doInsert m.inner k v) }\ndoInsert elems k v =\n case elems of\n Nil -> Cons (k, v) Nil\n Cons (k2, v2) rest ->\n if eq k k2 then Cons (k, v) rest\n else Cons (k2, v2) (doInsert rest k v)\nunion : Eq 'key => assocList 'key 'value -> assocList 'key 'value -> assocList 'key 'value\nunion left right = AssocList { inner = (doUnion left.inner right.inner) }\ndoUnion left right =\n case left of\n Nil -> right\n Cons (k, v) rest -> doUnion rest (doInsert right k v)\nfixture1 : assocList bytes int\nfixture1 = insert (insert emptyList \"foo\" 42) \"bar\" 14\nmain = eq (union fixture1 emptyList) fixture1\n" --- --- unoptimized Core @@ -285,32 +284,27 @@ let anf#207 : bytes = fromString#176 "bar" in let anf#208 : int -> Main.assocList bytes int = anf#206 anf#207 in let fixture1#179 : Main.assocList bytes int = anf#208 14 in let projection#164 : Main.sequence ('erased, 'erased) = field@0/1 fixture1#179 in -let projection#165 : Main.sequence ('erased, 'erased) = field@0/1 emptyList#169 in -let anf#198 : Main.sequence ('erased, 'erased) = doUnion#151 projection#164 projection#165 in -let anf#210 : Main.assocList bytes int = constr 0 anf#198 in -let projection#130 : Main.sequence ('erased, 'erased) = field@0/1 anf#210 in +let anf#198 : Main.sequence ('erased, 'erased) = doUnion#151 projection#164 anf#199 in let projection#131 : Main.sequence ('erased, 'erased) = field@0/1 fixture1#179 in letrec - worker#185 : Main.sequence 'erased -> Main.sequence 'erased -> 'erased [static []] = \left#183 : Main.sequence 'erased right#184 : Main.sequence 'erased -> let match#99 : (Main.sequence 'erased, Main.sequence 'erased) = constr 0 left#183 right#184 in - let leaf#100 : @delay 'erased = delay false in - case@Tag match#99 of - 0 field#101 field#102 -> case@Tag field#101 of - 0 -> case@Tag field#102 of - 0 -> true - 1 field#103 field#104 -> force leaf#100 - 1 field#105 field#106 -> case@Tag field#102 of - 0 -> force leaf#100 - 1 field#107 field#108 -> let anf#186 : bool = case@Tag field#105 of - 0 field#118 field#119 -> case@Tag field#107 of - 0 field#123 field#124 -> let anf#187 : bool = eq#113 field#118 field#123 in - case@Bool anf#187 of - True -> equalsInteger field#119 field#124 - False -> false in - case@Bool anf#186 of - True -> worker#185 field#106 field#108 - False -> false + worker#185 : Main.sequence 'erased -> Main.sequence 'erased -> 'erased [static []] = \left#183 : Main.sequence 'erased right#184 : Main.sequence 'erased -> let leaf#100 : @delay 'erased = delay false in + case@Tag left#183 of + 0 -> case@Tag right#184 of + 0 -> true + 1 field#103 field#104 -> force leaf#100 + 1 field#105 field#106 -> case@Tag right#184 of + 0 -> force leaf#100 + 1 field#107 field#108 -> let anf#186 : bool = case@Tag field#105 of + 0 field#118 field#119 -> case@Tag field#107 of + 0 field#123 field#124 -> let anf#187 : bool = eq#113 field#118 field#123 in + case@Bool anf#187 of + True -> equalsInteger field#119 field#124 + False -> false in + case@Bool anf#186 of + True -> worker#185 field#106 field#108 + False -> false in -worker#185 projection#130 projection#131 +worker#185 anf#198 projection#131 --- optimized UPLC (program 1.1.0 [(lam eq_9 @@ -329,53 +323,41 @@ worker#185 projection#130 projection#131 [(lam anf_54 [(lam fixture1_55 [(lam projection_56 - [(lam projection_57 - [(lam anf_58 - [(lam anf_59 - [(lam projection_60 - [(lam projection_61 - [(lam worker_82 [[worker_82 projection_60] projection_61]) - [(lam self_62 [self_62 self_62]) - (lam self_63 - (lam left_64 - (lam right_65 - [(lam match_66 - [(lam leaf_67 - (case - match_66 - (lam field_68 - (lam field_69 + [(lam anf_57 + [(lam projection_58 + [(lam worker_76 [[worker_76 anf_57] projection_58]) + [(lam self_59 [self_59 self_59]) + (lam self_60 + (lam left_61 + (lam right_62 + [(lam leaf_63 + (case + left_61 + (case right_62 (con bool True) (lam field_64 (lam field_65 (force leaf_63)))) + (lam field_66 + (lam field_67 + (case + right_62 + (force leaf_63) + (lam field_68 + (lam field_69 + [(lam anf_75 + (case anf_75 (con bool False) [[[self_60 self_60] field_67] field_69])) (case - field_68 - (case field_69 (con bool True) (lam field_70 (lam field_71 (force leaf_67)))) - (lam field_72 - (lam field_73 + field_66 + (lam field_70 + (lam field_71 (case - field_69 - (force leaf_67) - (lam field_74 - (lam field_75 - [(lam anf_81 - (case anf_81 (con bool False) [[[self_63 self_63] field_73] field_75])) - (case - field_72 - (lam field_76 - (lam field_77 - (case - field_74 - (lam field_78 - (lam field_79 - [(lam anf_80 - (case anf_80 (con bool False) [[(builtin equalsInteger) field_77] field_79])) - [[eq_9 field_76] field_78]]))))))])))))))))) - (delay (con bool False))]) - (constr 0 left_64 right_65)])))]]) - (case fixture1_55 (lam generated_83 generated_83))]) - (case anf_59 (lam generated_84 generated_84))]) - (constr 0 anf_58)]) - [[doUnion_38 projection_56] projection_57]]) - (case emptyList_40 (lam generated_85 generated_85))]) - (case fixture1_55 (lam generated_86 generated_86))]) + field_68 + (lam field_72 + (lam field_73 + [(lam anf_74 + (case anf_74 (con bool False) [[(builtin equalsInteger) field_71] field_73])) + [[eq_9 field_70] field_72]]))))))]))))))) + (delay (con bool False))])))]]) + (case fixture1_55 (lam generated_77 generated_77))]) + [[doUnion_38 projection_56] anf_39]]) + (case fixture1_55 (lam generated_78 generated_78))]) [anf_54 (con integer 14)]]) [anf_52 anf_53]]) [fromString_47 (con string "bar")]]) @@ -390,7 +372,7 @@ worker#185 projection#130 projection#131 (lam v_43 [(lam projection_44 [(lam anf_45 (constr 0 anf_45)) [[[doInsert_27 projection_44] k_42] v_43]]) - (case m_41 (lam generated_87 generated_87))])))]) + (case m_41 (lam generated_79 generated_79))])))]) (constr 0 anf_39)]) (constr 0)]) [(lam self_28 [self_28 self_28]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_none.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_none.snap index 83497e7e..02746ae1 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_none.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_none.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 296 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmap opt f =\n case opt of\n None -> None\n Some a -> Some (f a)\naddOne n = addInteger n 1\nmain = eq (map None addOne) None\n" --- --- unoptimized Core @@ -68,50 +67,9 @@ main#1 (builtin equalsInteger)]) (lam value_31 value_31)]) --- optimized Core -let anf#57 : Main.option int = constr 0 in -let anf#58 : Main.option int = case@Tag anf#57 of - 0 -> constr 0 - 1 field#46 -> let anf#55 : 'erased = addInteger field#46 1 in - constr 1 anf#55 in -let anf#60 : Main.option int = constr 0 in -let match#33 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#58 anf#60 in -let leaf#34 : @delay bool = delay false in -case@Tag match#33 of - 0 field#35 field#36 -> case@Tag field#35 of - 0 -> case@Tag field#36 of - 0 -> true - 1 field#37 -> force leaf#34 - 1 field#38 -> case@Tag field#36 of - 0 -> force leaf#34 - 1 field#39 -> equalsInteger field#38 field#39 +true --- optimized UPLC -(program 1.1.0 - [(lam anf_1 - [(lam anf_4 - [(lam anf_5 - [(lam match_6 - [(lam leaf_7 - (case - match_6 - (lam field_8 - (lam field_9 - (case - field_8 - (case field_9 (con bool True) (lam field_10 (force leaf_7))) - (lam field_11 - (case - field_9 - (force leaf_7) - (lam field_12 [[(builtin equalsInteger) field_11] field_12])))))))) - (delay (con bool False))]) - (constr 0 anf_4 anf_5)]) - (constr 0)]) - (case - anf_1 - (constr 0) - (lam field_2 - [(lam anf_3 (constr 1 anf_3)) [[(builtin addInteger) field_2] (con integer 1)]]))]) - (constr 0)]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_some.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_some.snap index 2d4107f2..63095153 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_some.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_10_map_some.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 319 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmap opt f =\n case opt of\n None -> None\n Some a -> Some (f a)\naddOne n = addInteger n 1\nmain = eq (map (Some 1) addOne) (Some 2)\n" --- --- unoptimized Core @@ -72,50 +71,12 @@ main#1 (builtin equalsInteger)]) (lam value_34 value_34)]) --- optimized Core -let anf#62 : Main.option int = constr 1 1 in -let anf#63 : Main.option int = case@Tag anf#62 of - 0 -> constr 0 - 1 field#48 -> let anf#59 : 'erased = addInteger field#48 1 in - constr 1 anf#59 in -let anf#66 : Main.option int = constr 1 2 in -let match#35 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#63 anf#66 in -let leaf#36 : @delay bool = delay false in -case@Tag match#35 of - 0 field#37 field#38 -> case@Tag field#37 of - 0 -> case@Tag field#38 of - 0 -> true - 1 field#39 -> force leaf#36 - 1 field#40 -> case@Tag field#38 of - 0 -> force leaf#36 - 1 field#41 -> equalsInteger field#40 field#41 +let anf#59 : 'erased = addInteger 1 1 in +equalsInteger anf#59 2 --- optimized UPLC (program 1.1.0 - [(lam anf_1 - [(lam anf_4 - [(lam anf_5 - [(lam match_6 - [(lam leaf_7 - (case - match_6 - (lam field_8 - (lam field_9 - (case - field_8 - (case field_9 (con bool True) (lam field_10 (force leaf_7))) - (lam field_11 - (case - field_9 - (force leaf_7) - (lam field_12 [[(builtin equalsInteger) field_11] field_12])))))))) - (delay (con bool False))]) - (constr 0 anf_4 anf_5)]) - (constr 1 (con integer 2))]) - (case - anf_1 - (constr 0) - (lam field_2 - [(lam anf_3 (constr 1 anf_3)) [[(builtin addInteger) field_2] (con integer 1)]]))]) - (constr 1 (con integer 1))]) + [(lam anf_1 [[(builtin equalsInteger) anf_1] (con integer 2)]) + [[(builtin addInteger) (con integer 1)] (con integer 1)]]) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_15_zero_arg.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_15_zero_arg.snap index 325631cd..3c62077d 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_15_zero_arg.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_15_zero_arg.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 400 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Data exposing (toData)\ntype pairs = Pairs { inner : list (pair Data Data) }\nnew () = Pairs { inner = [] }\nsame (Pairs a) (Pairs b) = equalsData (toData (mapData a)) (toData (mapData b))\nmain = same (new ()) (Pairs { inner = [] })\n" --- --- unoptimized Core @@ -51,28 +50,15 @@ main#1 arg_6]))]) (lam coerce_19 coerce_19)]) --- optimized Core -let anf#44 : Main.pairs = constr 0 (con (list (pair data data)) []) in -let anf#46 : Main.pairs = constr 0 (con (list (pair data data)) []) in -case@Tag anf#44 of - 0 field#25 -> case@Tag anf#46 of - 0 field#28 -> let anf#39 : Map Data Data = mapData field#25 in - let anf#41 : Map Data Data = mapData field#28 in - equalsData anf#39 anf#41 +let anf#39 : Map Data Data = mapData (con (list (pair data data)) []) in +let anf#41 : Map Data Data = mapData (con (list (pair data data)) []) in +equalsData anf#39 anf#41 --- optimized UPLC (program 1.1.0 [(lam anf_1 - [(lam anf_2 - (case - anf_1 - (lam field_3 - (case - anf_2 - (lam field_4 - [(lam anf_5 - [(lam anf_6 [[(builtin equalsData) anf_5] anf_6]) [(builtin mapData) field_4]]) - [(builtin mapData) field_3]]))))) - (constr 0 (con (list (pair data data)) []))]) - (constr 0 (con (list (pair data data)) []))]) + [(lam anf_2 [[(builtin equalsData) anf_1] anf_2]) + [(builtin mapData) (con (list (pair data data)) [])]]) + [(builtin mapData) (con (list (pair data data)) [])]]) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_18_or_else.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_18_or_else.snap index aa17f65f..b0ae1f8a 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_18_or_else.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_18_or_else.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 445 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\norElse opt default =\n case opt of\n None -> default\n Some a -> a\nmain = equalsInteger (orElse (Some 42) 14) 42\n" --- --- unoptimized Core @@ -27,17 +26,9 @@ main#1 [(lam match_8 (case match_8 default_6 (lam field_9 [(lam a_7 a_7) field_9]))) opt_5]))]) --- optimized Core -let anf#22 : Main.option int = constr 1 42 in -let anf#25 : int = case@Tag anf#22 of - 0 -> 14 - 1 field#14 -> field#14 in -equalsInteger anf#25 42 +equalsInteger 42 42 --- optimized UPLC -(program 1.1.0 - [(lam anf_1 - [(lam anf_3 [[(builtin equalsInteger) anf_3] (con integer 42)]) - (case anf_1 (con integer 14) (lam field_2 field_2))]) - (constr 1 (con integer 42))]) +(program 1.1.0 [[(builtin equalsInteger) (con integer 42)] (con integer 42)]) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_2_heads.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_2_heads.snap index f9ea717c..ec9c72a1 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_2_heads.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_2_heads.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 88 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmain =\n let\n head = \\xs ->\n case xs of\n [] -> None\n [a] -> Some xs\n a :: b :: rest -> Some [a, b]\n in\n eq (head [1, 2, 3]) (Some [1, 2])\n" --- --- unoptimized Core @@ -160,70 +159,29 @@ in let anf#103 : list int = mkCons 3 (con (list integer) []) in let anf#104 : list int = mkCons 2 anf#103 in let anf#105 : list int = mkCons 1 anf#104 in -let anf#106 : Main.option (list int) = case@List anf#105 of - Nil -> constr 0 - Cons field#84 field#85 -> case@List field#85 of - Nil -> constr 1 anf#105 - Cons field#88 field#89 -> let anf#98 : list int = mkCons field#88 (con (list integer) []) in - let anf#99 : list int = mkCons field#84 anf#98 in - constr 1 anf#99 in +let anf#98 : list int = mkCons 2 (con (list integer) []) in +let anf#99 : list int = mkCons 1 anf#98 in let anf#110 : list int = mkCons 2 (con (list integer) []) in let anf#111 : list int = mkCons 1 anf#110 in -let anf#112 : Main.option (list int) = constr 1 anf#111 in -let match#70 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#106 anf#112 in -let leaf#71 : @delay bool = delay false in -case@Tag match#70 of - 0 field#72 field#73 -> case@Tag field#72 of - 0 -> case@Tag field#73 of - 0 -> true - 1 field#74 -> force leaf#71 - 1 field#75 -> case@Tag field#73 of - 0 -> force leaf#71 - 1 field#76 -> eq#28 field#75 field#76 +eq#28 anf#99 anf#111 --- optimized UPLC (program 1.1.0 - [(lam builtin_38 - [(lam partial_39 - [(lam partial_40 + [(lam builtin_23 + [(lam partial_24 + [(lam partial_25 [(lam eq_15 [(lam anf_16 [(lam anf_17 [(lam anf_18 - [(lam anf_25 - [(lam anf_26 - [(lam anf_27 - [(lam anf_30 - [(lam match_31 - [(lam leaf_32 - (case - match_31 - (lam field_33 - (lam field_34 - (case - field_33 - (case field_34 (con bool True) (lam field_35 (force leaf_32))) - (lam field_36 - (case field_34 (force leaf_32) (lam field_37 [[eq_15 field_36] field_37])))))))) - (delay (con bool False))]) - (constr 0 anf_25 anf_30)]) - (constr 1 anf_27)]) - [partial_39 anf_26]]) - [partial_40 (con (list integer) [])]]) - (case - anf_18 - (lam field_19 - (lam field_20 - (case - field_20 - (lam field_21 - (lam field_22 - [(lam anf_23 [(lam anf_24 (constr 1 anf_24)) [[builtin_38 field_19] anf_23]]) - [[builtin_38 field_21] (con (list integer) [])]])) - (constr 1 anf_18)))) - (constr 0))]) - [partial_39 anf_17]]) - [partial_40 anf_16]]) - [[builtin_38 (con integer 3)] (con (list integer) [])]]) + [(lam anf_19 + [(lam anf_20 + [(lam anf_21 [(lam anf_22 [[eq_15 anf_20] anf_22]) [partial_24 anf_21]]) + [partial_25 (con (list integer) [])]]) + [partial_24 anf_19]]) + [partial_25 (con (list integer) [])]]) + [partial_24 anf_17]]) + [partial_25 anf_16]]) + [[builtin_23 (con integer 3)] (con (list integer) [])]]) [(lam self_4 [self_4 self_4]) (lam self_5 (lam xs_6 @@ -241,8 +199,8 @@ case@Tag match#70 of [[(builtin equalsInteger) field_10] field_12]])) (con bool False)))) (case ys_7 (lam field_8 (lam field_9 (con bool False))) (con bool True))))))]]) - [builtin_38 (con integer 2)]]) - [builtin_38 (con integer 1)]]) + [builtin_23 (con integer 2)]]) + [builtin_23 (con integer 1)]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_head.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_head.snap index 91a77af3..6a450439 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_head.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_direct_head.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 63 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nmain =\n let\n head = \\xs ->\n case xs of\n [] -> None\n _ -> Some (headList xs)\n in\n eq (head [1, 2, 3]) (Some 1)\n" --- --- unoptimized Core @@ -71,49 +70,16 @@ main#1 let anf#54 : list int = mkCons 3 (con (list integer) []) in let anf#55 : list int = mkCons 2 anf#54 in let anf#56 : list int = mkCons 1 anf#55 in -let anf#57 : Main.option int = case@List anf#56 of - Nil -> constr 0 - Cons field#45 field#46 -> constr 1 field#45 in -let anf#60 : Main.option int = constr 1 1 in -let match#31 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#57 anf#60 in -let leaf#32 : @delay bool = delay false in -case@Tag match#31 of - 0 field#33 field#34 -> case@Tag field#33 of - 0 -> case@Tag field#34 of - 0 -> true - 1 field#35 -> force leaf#32 - 1 field#36 -> case@Tag field#34 of - 0 -> force leaf#32 - 1 field#37 -> equalsInteger field#36 field#37 +equalsInteger 1 1 --- optimized UPLC (program 1.1.0 - [(lam builtin_15 + [(lam builtin_4 [(lam anf_1 [(lam anf_2 - [(lam anf_3 - [(lam anf_6 - [(lam anf_7 - [(lam match_8 - [(lam leaf_9 - (case - match_8 - (lam field_10 - (lam field_11 - (case - field_10 - (case field_11 (con bool True) (lam field_12 (force leaf_9))) - (lam field_13 - (case - field_11 - (force leaf_9) - (lam field_14 [[(builtin equalsInteger) field_13] field_14])))))))) - (delay (con bool False))]) - (constr 0 anf_6 anf_7)]) - (constr 1 (con integer 1))]) - (case anf_3 (lam field_4 (lam field_5 (constr 1 field_4))) (constr 0))]) - [[builtin_15 (con integer 1)] anf_2]]) - [[builtin_15 (con integer 2)] anf_1]]) - [[builtin_15 (con integer 3)] (con (list integer) [])]]) + [(lam anf_3 [[(builtin equalsInteger) (con integer 1)] (con integer 1)]) + [[builtin_4 (con integer 1)] anf_2]]) + [[builtin_4 (con integer 2)] anf_1]]) + [[builtin_4 (con integer 3)] (con (list integer) [])]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_empty.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_empty.snap index 6c30cee8..971a55c4 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_empty.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_empty.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 137 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nhead : list int -> option int\nhead xs =\n case xs of\n [] -> None\n _ -> Some (headList xs)\nmain = eq (head []) None\n" --- --- unoptimized Core @@ -59,45 +58,9 @@ main#1 (builtin equalsInteger)]) (lam value_27 value_27)]) --- optimized Core -let anf#45 : Main.option int = case@List (con (list integer) []) of - Nil -> constr 0 - Cons field#40 field#41 -> constr 1 field#40 in -let anf#47 : Main.option int = constr 0 in -let match#28 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#45 anf#47 in -let leaf#29 : @delay bool = delay false in -case@Tag match#28 of - 0 field#30 field#31 -> case@Tag field#30 of - 0 -> case@Tag field#31 of - 0 -> true - 1 field#32 -> force leaf#29 - 1 field#33 -> case@Tag field#31 of - 0 -> force leaf#29 - 1 field#34 -> equalsInteger field#33 field#34 +true --- optimized UPLC -(program 1.1.0 - [(lam anf_3 - [(lam anf_4 - [(lam match_5 - [(lam leaf_6 - (case - match_5 - (lam field_7 - (lam field_8 - (case - field_7 - (case field_8 (con bool True) (lam field_9 (force leaf_6))) - (lam field_10 - (case - field_8 - (force leaf_6) - (lam field_11 [[(builtin equalsInteger) field_10] field_11])))))))) - (delay (con bool False))]) - (constr 0 anf_3 anf_4)]) - (constr 0)]) - (case - (con (list integer) []) - (lam field_1 (lam field_2 (constr 1 field_1))) - (constr 0))]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_not_empty.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_not_empty.snap index 75b689d6..3d9b45e7 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_not_empty.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_5_head_not_empty.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 114 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\nhead : list int -> option int\nhead xs =\n case xs of\n [] -> None\n _ -> Some (headList xs)\nmain = eq (head [1, 2, 3]) (Some 1)\n" --- --- unoptimized Core @@ -71,49 +70,16 @@ main#1 let anf#54 : list int = mkCons 3 (con (list integer) []) in let anf#55 : list int = mkCons 2 anf#54 in let anf#56 : list int = mkCons 1 anf#55 in -let anf#57 : Main.option int = case@List anf#56 of - Nil -> constr 0 - Cons field#43 field#44 -> constr 1 field#43 in -let anf#60 : Main.option int = constr 1 1 in -let match#31 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#57 anf#60 in -let leaf#32 : @delay bool = delay false in -case@Tag match#31 of - 0 field#33 field#34 -> case@Tag field#33 of - 0 -> case@Tag field#34 of - 0 -> true - 1 field#35 -> force leaf#32 - 1 field#36 -> case@Tag field#34 of - 0 -> force leaf#32 - 1 field#37 -> equalsInteger field#36 field#37 +equalsInteger 1 1 --- optimized UPLC (program 1.1.0 - [(lam builtin_15 + [(lam builtin_4 [(lam anf_1 [(lam anf_2 - [(lam anf_3 - [(lam anf_6 - [(lam anf_7 - [(lam match_8 - [(lam leaf_9 - (case - match_8 - (lam field_10 - (lam field_11 - (case - field_10 - (case field_11 (con bool True) (lam field_12 (force leaf_9))) - (lam field_13 - (case - field_11 - (force leaf_9) - (lam field_14 [[(builtin equalsInteger) field_13] field_14])))))))) - (delay (con bool False))]) - (constr 0 anf_6 anf_7)]) - (constr 1 (con integer 1))]) - (case anf_3 (lam field_4 (lam field_5 (constr 1 field_4))) (constr 0))]) - [[builtin_15 (con integer 1)] anf_2]]) - [[builtin_15 (con integer 2)] anf_1]]) - [[builtin_15 (con integer 3)] (con (list integer) [])]]) + [(lam anf_3 [[(builtin equalsInteger) (con integer 1)] (con integer 1)]) + [[builtin_4 (con integer 1)] anf_2]]) + [[builtin_4 (con integer 2)] anf_1]]) + [[builtin_4 (con integer 3)] (con (list integer) [])]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_6_equals_tuple.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_6_equals_tuple.snap index 40dbf1e4..bfcc4b80 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_6_equals_tuple.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_6_equals_tuple.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 190 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\nsame : (int, list int) -> (int, list int) -> bool\nsame (a, b) (c, d) = if eq a c then eq b d else False\nmain = same (1, []) (1, [])\n" --- --- unoptimized Core @@ -123,32 +122,20 @@ letrec True -> eq#39 field#47 field#52 False -> false in -let anf#74 : (int, list int) = constr 0 1 (con (list integer) []) in -let anf#77 : (int, list int) = constr 0 1 (con (list integer) []) in -case@Tag anf#74 of - 0 field#58 field#59 -> case@Tag anf#77 of - 0 field#63 field#64 -> let anf#72 : bool = eq#38 field#58 field#63 in - case@Bool anf#72 of - True -> eq#39 field#59 field#64 - False -> false +let anf#72 : bool = eq#38 1 1 in +case@Bool anf#72 of + True -> eq#39 (con (list integer) []) (con (list integer) []) + False -> false --- optimized UPLC (program 1.1.0 [(lam eq_4 [(lam eq_16 [(lam anf_17 - [(lam anf_18 - (case - anf_17 - (lam field_19 - (lam field_20 - (case - anf_18 - (lam field_21 - (lam field_22 - [(lam anf_23 (case anf_23 (con bool False) [[eq_16 field_20] field_22])) - [[eq_4 field_19] field_21]]))))))) - (constr 0 (con integer 1) (con (list integer) []))]) - (constr 0 (con integer 1) (con (list integer) []))]) + (case + anf_17 + (con bool False) + [[eq_16 (con (list integer) [])] (con (list integer) [])])) + [[eq_4 (con integer 1)] (con integer 1)]]) [(lam self_5 [self_5 self_5]) (lam self_6 (lam xs_7 diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_7_unzip_tuple.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_7_unzip_tuple.snap index b216fadb..0de102b9 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_7_unzip_tuple.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__lists__acceptance_test_7_unzip_tuple.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/lists.rs -assertion_line: 203 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype sequence 'a = Nil | Cons 'a (sequence 'a)\nunzip xs =\n case xs of\n Nil -> ([], [])\n Cons (a, b) rest ->\n let\n (aTail, bTail) = unzip rest\n in\n (mkCons a aTail, mkCons b bTail)\nsame (a, b) (c, d) = if eq a c then eq b d else False\nmain =\n let\n x = Cons (3, #\"55\") (Cons (4, #\"7799\") Nil)\n in\n same (unzip x) ([3, 4], [#\"55\", #\"7799\"])\n" --- --- unoptimized Core @@ -289,16 +288,14 @@ let anf#183 : list int = mkCons 4 (con (list integer) []) in let anf#184 : list int = mkCons 3 anf#183 in let anf#187 : list bytes = mkCons (con bytestring #7799) (con (list bytestring) []) in let anf#188 : list bytes = mkCons (con bytestring #55) anf#187 in -let anf#189 : (list int, list bytes) = constr 0 anf#184 anf#188 in case@Tag anf#179 of - 0 field#121 field#122 -> case@Tag anf#189 of - 0 field#126 field#127 -> let anf#165 : bool = eq#85 field#121 field#126 in - case@Bool anf#165 of - True -> eq#102 field#122 field#127 - False -> false + 0 field#121 field#122 -> let anf#165 : bool = eq#85 field#121 anf#184 in + case@Bool anf#165 of + True -> eq#102 field#122 anf#188 + False -> false --- optimized UPLC (program 1.1.0 - [(lam builtin_66 + [(lam builtin_63 [(lam eq_20 [(lam eq_32 [(lam unzip_49 @@ -312,22 +309,16 @@ case@Tag anf#179 of [(lam anf_57 [(lam anf_58 [(lam anf_59 - [(lam anf_60 - (case - anf_55 + (case + anf_55 + (lam field_60 (lam field_61 - (lam field_62 - (case - anf_60 - (lam field_63 - (lam field_64 - [(lam anf_65 (case anf_65 (con bool False) [[eq_32 field_62] field_64])) - [[eq_20 field_61] field_63]]))))))) - (constr 0 anf_57 anf_59)]) - [[builtin_66 (con bytestring #55)] anf_58]]) - [[builtin_66 (con bytestring #7799)] (con (list bytestring) [])]]) - [[builtin_66 (con integer 3)] anf_56]]) - [[builtin_66 (con integer 4)] (con (list integer) [])]]) + [(lam anf_62 (case anf_62 (con bool False) [[eq_32 field_61] anf_59])) + [[eq_20 field_60] anf_57]])))) + [[builtin_63 (con bytestring #55)] anf_58]]) + [[builtin_63 (con bytestring #7799)] (con (list bytestring) [])]]) + [[builtin_63 (con integer 3)] anf_56]]) + [[builtin_63 (con integer 4)] (con (list integer) [])]]) [unzip_49 x_54]]) (constr 1 anf_50 anf_53)]) (constr 1 anf_51 anf_52)]) @@ -350,9 +341,9 @@ case@Tag anf#179 of [(lam anf_43 [(lam evaluated_44 [(lam anf_47 - [(lam anf_48 (constr 0 evaluated_44 anf_48)) [[builtin_66 field_39] anf_47]]) + [(lam anf_48 (constr 0 evaluated_44 anf_48)) [[builtin_63 field_39] anf_47]]) (case destruct_40 (lam field_45 (lam field_46 field_46)))]) - [[builtin_66 field_38] anf_43]]) + [[builtin_63 field_38] anf_43]]) (case destruct_40 (lam field_41 (lam field_42 field_41)))]) [[self_34 self_34] field_37]]))))))))]]) [(lam self_21 [self_21 self_21]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__builtin_pair_do_binding.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__builtin_pair_do_binding.snap index e848667e..9935d77d 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__builtin_pair_do_binding.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__builtin_pair_do_binding.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 663 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Option exposing (type option(..))\nimport Monad exposing (Monad)\nresult =\n do\n pair(tag, _) <- Some (Builtin.unConstrData (Builtin.constrData 42 []))\n Some tag\nmain : int\nmain =\n case result of\n Some tag -> tag\n None -> fail\n" --- --- unoptimized Core @@ -56,11 +55,8 @@ main#1 --- optimized Core let evaluated#31 : Data = constrData 42 (con (list data) []) in let projection#32 : pair int (list Data) = unConstrData evaluated#31 in -let anf#46 : nash/base:Option.option (pair int (list Data)) = constr 0 projection#32 in -let result#40 : nash/base:Option.option int = case@Tag anf#46 of - 0 field#26 -> case@Pair field#26 of - Pair field#36 field#37 -> constr 0 field#36 - 1 -> constr 1 in +let result#40 : nash/base:Option.option int = case@Pair projection#32 of + Pair field#36 field#37 -> constr 0 field#36 in case@Tag result#40 of 0 field#42 -> field#42 1 -> error @@ -68,13 +64,8 @@ case@Tag result#40 of (program 1.1.0 [(lam evaluated_1 [(lam projection_2 - [(lam anf_3 - [(lam result_7 (case result_7 (lam field_8 field_8) (error))) - (case - anf_3 - (lam field_4 (case field_4 (lam field_5 (lam field_6 (constr 0 field_5))))) - (constr 1))]) - (constr 0 projection_2)]) + [(lam result_5 (case result_5 (lam field_6 field_6) (error))) + (case projection_2 (lam field_3 (lam field_4 (constr 0 field_3))))]) [(builtin unConstrData) evaluated_1]]) [[(builtin constrData) (con integer 42)] (con (list data) [])]]) --- result diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__data_constr_pair_payload.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__data_constr_pair_payload.snap index 81e73249..0f5614ed 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__data_constr_pair_payload.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__data_constr_pair_payload.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 682 description: "module Main exposing (..)\nimport Primitive exposing (..)\nrewrap value =\n case value of\n Constr payload -> Constr payload\n _ -> fail\nmain : int\nmain =\n case rewrap (Builtin.constrData 7 [I 42]) of\n Constr pair(index, [I number]) -> Builtin.addInteger index number\n _ -> fail\n" --- --- unoptimized Core @@ -113,14 +112,9 @@ main#1 let anf#77 : Data = iData 42 in let anf#78 : list Data = mkCons anf#77 (con (list data) []) in let anf#79 : Data = constrData 7 anf#78 in -let leaf#10 : @delay Data = delay error in -let match#47 : Data = case@Data anf#79 of - DataConstr field#11 -> case@Pair field#11 of - Pair tag#14 fields#15 -> constrData tag#14 fields#15 - DataMap field#16 -> force leaf#10 - DataList field#17 -> force leaf#10 - DataI field#18 -> force leaf#10 - DataB field#19 -> force leaf#10 in +let field#11 : pair int (list Data) = unConstrData anf#79 in +let match#47 : Data = case@Pair field#11 of + Pair tag#14 fields#15 -> constrData tag#14 fields#15 in let leaf#48 : @delay int = delay error in case@Data match#47 of DataConstr field#49 -> case@Pair field#49 of @@ -140,65 +134,54 @@ case@Data match#47 of DataB field#73 -> force leaf#48 --- optimized UPLC (program 1.1.0 - [(lam builtin_40 - [(lam builtin_42 + [(lam builtin_30 + [(lam builtin_31 [(lam anf_1 [(lam anf_2 [(lam anf_3 - [(lam leaf_4 - [(lam match_20 - [(lam leaf_21 - [(lam generated_38 + [(lam field_4 + [(lam match_7 + [(lam leaf_8 + [(lam generated_28 (force - [[[[[[builtin_40 generated_38] + [[[[[[builtin_30 generated_28] (delay - [(lam field_22 + [(lam field_9 (case - field_22 - (lam field_23 - (lam field_24 + field_9 + (lam field_10 + (lam field_12 (case - field_24 - (lam field_25 - (lam field_26 - [(lam generated_39 + field_12 + (lam field_13 + (lam field_16 + [(lam generated_29 (force - [[[[[[builtin_40 generated_39] (delay (force leaf_21))] (delay (force leaf_21))] - (delay (force leaf_21))] + [[[[[[builtin_30 generated_29] (delay (force leaf_8))] (delay (force leaf_8))] + (delay (force leaf_8))] (delay - [(lam field_30 + [(lam field_20 (case - field_26 - (lam field_31 (lam field_32 (force leaf_21))) - [[(builtin addInteger) field_23] field_30])) - [(builtin unIData) generated_39]])] - (delay (force leaf_21))])) - field_25])) - (force leaf_21)))))) - [(builtin unConstrData) generated_38]])] - (delay (force leaf_21))] - (delay (force leaf_21))] - (delay (force leaf_21))] - (delay (force leaf_21))])) - match_20]) + field_16 + (lam field_21 (lam field_22 (force leaf_8))) + [[(builtin addInteger) field_10] field_20])) + [(builtin unIData) generated_29]])] + (delay (force leaf_8))])) + field_13])) + (force leaf_8)))))) + [(builtin unConstrData) generated_28]])] + (delay (force leaf_8))] + (delay (force leaf_8))] + (delay (force leaf_8))] + (delay (force leaf_8))])) + match_7]) (delay (error))]) - [(lam generated_41 - (force - [[[[[[builtin_40 generated_41] - (delay - [(lam field_5 - (case - field_5 - (lam tag_6 (lam fields_7 [[(builtin constrData) tag_6] fields_7])))) - [(builtin unConstrData) generated_41]])] - (delay (force leaf_4))] - (delay (force leaf_4))] - (delay (force leaf_4))] - (delay (force leaf_4))])) - anf_3]]) - (delay (error))]) + (case + field_4 + (lam tag_5 (lam fields_6 [[(builtin constrData) tag_5] fields_6])))]) + [(builtin unConstrData) anf_3]]) [[(builtin constrData) (con integer 7)] anf_2]]) - [[builtin_42 anf_1] (con (list data) [])]]) + [[builtin_31 anf_1] (con (list data) [])]]) [(builtin iData) (con integer 42)]]) (force (builtin mkCons))]) (force (builtin chooseData))]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_filled_list.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_filled_list.snap index 4e272d67..4f5782c4 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_filled_list.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_filled_list.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 13 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain : bool\nmain =\n let\n x : list int\n x = [1, 2]\n in\n case x of\n [] -> True\n _ -> fail\n" --- --- unoptimized Core @@ -28,16 +27,12 @@ main#1 --- optimized Core let anf#21 : list int = mkCons 2 (con (list integer) []) in let x#14 : list int = mkCons 1 anf#21 in -case@List x#14 of - Nil -> true - Cons field#16 field#17 -> error +error --- optimized UPLC (program 1.1.0 - [(lam builtin_5 - [(lam anf_1 - [(lam x_2 (case x_2 (lam field_3 (lam field_4 (error))) (con bool True))) - [[builtin_5 (con integer 1)] anf_1]]) - [[builtin_5 (con integer 2)] (con (list integer) [])]]) + [(lam builtin_3 + [(lam anf_1 [(lam x_2 (error)) [[builtin_3 (con integer 1)] anf_1]]) + [[builtin_3 (con integer 2)] (con (list integer) [])]]) (force (builtin mkCons))]) --- result error: ExplicitErrorTerm diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_new_list.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_new_list.snap index ad8ae57c..f78bfeec 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_new_list.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_empty_list_on_new_list.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 31 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain : bool\nmain =\n let\n x : list int\n x = []\n in\n case x of\n [] -> True\n _ -> fail\n" --- --- unoptimized Core @@ -22,15 +21,9 @@ main#1 (con (list integer) [])]) (lam value_7 value_7)]) --- optimized Core -case@List (con (list integer) []) of - Nil -> true - Cons field#12 field#13 -> error +true --- optimized UPLC -(program 1.1.0 - (case - (con (list integer) []) - (lam field_1 (lam field_2 (error))) - (con bool True))) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head3_no_tail.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head3_no_tail.snap index aeaab861..ae395e2c 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head3_no_tail.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head3_no_tail.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 201 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain =\n let\n a : list int\n a = [1, 2, 3]\n in\n case a of\n [h, i, j] ->\n if equalsInteger h h then\n if equalsInteger i i then equalsInteger j j else False\n else False\n _ -> fail\n" --- --- unoptimized Core @@ -77,59 +76,33 @@ main#1 let anf#42 : list int = mkCons 3 (con (list integer) []) in let anf#43 : list int = mkCons 2 anf#42 in let a#12 : list int = mkCons 1 anf#43 in -let leaf#14 : @delay bool = delay error in -case@List a#12 of - Nil -> force leaf#14 - Cons field#15 field#28 -> case@List field#28 of - Nil -> force leaf#14 - Cons field#29 field#30 -> case@List field#30 of - Nil -> force leaf#14 - Cons field#31 field#32 -> case@List field#32 of - Nil -> let anf#44 : bool = equalsInteger field#15 field#15 in - case@Bool anf#44 of - True -> let anf#45 : bool = equalsInteger field#29 field#29 in - case@Bool anf#45 of - True -> equalsInteger field#31 field#31 - False -> false - False -> false - Cons field#36 field#37 -> force leaf#14 +let anf#44 : bool = equalsInteger 1 1 in +case@Bool anf#44 of + True -> let anf#45 : bool = equalsInteger 2 2 in + case@Bool anf#45 of + True -> equalsInteger 3 3 + False -> false + False -> false --- optimized UPLC (program 1.1.0 - [(lam builtin_18 + [(lam builtin_6 [(lam anf_1 [(lam anf_2 [(lam a_3 - [(lam leaf_4 + [(lam anf_4 (case - a_3 - (lam field_5 - (lam field_6 - (case - field_6 - (lam field_7 - (lam field_8 - (case - field_8 - (lam field_9 - (lam field_10 - (case - field_10 - (lam field_16 (lam field_17 (force leaf_4))) - [(lam anf_11 - (case - anf_11 - (con bool False) - [(lam anf_13 - (case anf_13 (con bool False) [[(builtin equalsInteger) field_9] field_9])) - [[(builtin equalsInteger) field_7] field_7]])) - [[(builtin equalsInteger) field_5] field_5]]))) - (force leaf_4)))) - (force leaf_4)))) - (force leaf_4))) - (delay (error))]) - [[builtin_18 (con integer 1)] anf_2]]) - [[builtin_18 (con integer 2)] anf_1]]) - [[builtin_18 (con integer 3)] (con (list integer) [])]]) + anf_4 + (con bool False) + [(lam anf_5 + (case + anf_5 + (con bool False) + [[(builtin equalsInteger) (con integer 3)] (con integer 3)])) + [[(builtin equalsInteger) (con integer 2)] (con integer 2)]])) + [[(builtin equalsInteger) (con integer 1)] (con integer 1)]]) + [[builtin_6 (con integer 1)] anf_2]]) + [[builtin_6 (con integer 2)] anf_1]]) + [[builtin_6 (con integer 3)] (con (list integer) [])]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_discard_tail.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_discard_tail.snap index 569c5745..d4cad589 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_discard_tail.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_discard_tail.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 167 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain =\n let\n a : list int\n a = [1, 2, 3]\n in\n case a of\n h :: _ -> equalsInteger h h\n _ -> fail\n" --- --- unoptimized Core @@ -32,22 +31,16 @@ main#1 let anf#20 : list int = mkCons 3 (con (list integer) []) in let anf#21 : list int = mkCons 2 anf#20 in let a#11 : list int = mkCons 1 anf#21 in -case@List a#11 of - Nil -> error - Cons field#13 field#14 -> equalsInteger field#13 field#13 +equalsInteger 1 1 --- optimized UPLC (program 1.1.0 - [(lam builtin_6 + [(lam builtin_4 [(lam anf_1 [(lam anf_2 - [(lam a_3 - (case - a_3 - (lam field_4 (lam field_5 [[(builtin equalsInteger) field_4] field_4])) - (error))) - [[builtin_6 (con integer 1)] anf_2]]) - [[builtin_6 (con integer 2)] anf_1]]) - [[builtin_6 (con integer 3)] (con (list integer) [])]]) + [(lam a_3 [[(builtin equalsInteger) (con integer 1)] (con integer 1)]) + [[builtin_4 (con integer 1)] anf_2]]) + [[builtin_4 (con integer 2)] anf_1]]) + [[builtin_4 (con integer 3)] (con (list integer) [])]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_no_tail.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_no_tail.snap index 1c99500f..a63e9755 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_no_tail.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_head_no_tail.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 184 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain =\n let\n a : list int\n a = [1, 2, 3]\n in\n case a of\n [h] -> equalsInteger h h\n _ -> fail\n" --- --- unoptimized Core @@ -42,32 +41,14 @@ main#1 let anf#26 : list int = mkCons 3 (con (list integer) []) in let anf#27 : list int = mkCons 2 anf#26 in let a#7 : list int = mkCons 1 anf#27 in -let leaf#16 : @delay bool = delay error in -case@List a#7 of - Nil -> force leaf#16 - Cons field#17 field#18 -> case@List field#18 of - Nil -> equalsInteger field#17 field#17 - Cons field#20 field#21 -> force leaf#16 +error --- optimized UPLC (program 1.1.0 - [(lam builtin_10 + [(lam builtin_4 [(lam anf_1 - [(lam anf_2 - [(lam a_3 - [(lam leaf_4 - (case - a_3 - (lam field_5 - (lam field_6 - (case - field_6 - (lam field_8 (lam field_9 (force leaf_4))) - [[(builtin equalsInteger) field_5] field_5]))) - (force leaf_4))) - (delay (error))]) - [[builtin_10 (con integer 1)] anf_2]]) - [[builtin_10 (con integer 2)] anf_1]]) - [[builtin_10 (con integer 3)] (con (list integer) [])]]) + [(lam anf_2 [(lam a_3 (error)) [[builtin_4 (con integer 1)] anf_2]]) + [[builtin_4 (con integer 2)] anf_1]]) + [[builtin_4 (con integer 3)] (con (list integer) [])]]) (force (builtin mkCons))]) --- result error: ExplicitErrorTerm diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_none.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_none.snap index 51bbd9f8..36bcb5d0 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_none.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__expect_none.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 269 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype option = Some int | None\nmain : bool\nmain =\n let\n x = None\n in\n case x of\n None -> True\n _ -> fail\n" --- --- unoptimized Core @@ -22,13 +21,9 @@ main#1 (constr 1)]) (lam value_6 value_6)]) --- optimized Core -let x#9 : Main.option = constr 1 in -case@Tag x#9 of - 0 field#11 -> error - 1 -> true +true --- optimized UPLC -(program 1.1.0 - [(lam x_1 (case x_1 (lam field_2 (error)) (con bool True))) (constr 1)]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_clause_with_assign.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_clause_with_assign.snap index 1c8cab33..08922c1a 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_clause_with_assign.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_clause_with_assign.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 250 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype Option = Some Int | None\ndoInit self =\n case self of\n [] -> trace \"unreachable\" fail\n [_] as a -> a\n [(Some _) as n, x] -> [n]\n [a, x] -> [x]\n a :: b :: c -> c\nmain = eq (doInit [Some 1, None]) [Some 1]\n" --- --- unoptimized Core @@ -117,19 +116,11 @@ let anf#78 : Main.Option = constrData 0 anf#76 in let anf#79 : Main.Option = constrData 1 (con (list data) []) in let anf#80 : list Main.Option = mkCons anf#79 (con (list data) []) in let anf#81 : list Main.Option = mkCons anf#78 anf#80 in -let anf#82 : list Main.Option = case@List anf#81 of - Nil -> trace "unreachable" in error - Cons field#46 field#47 -> case@List field#47 of - Nil -> anf#81 - Cons field#49 field#50 -> let projection#51 : pair int (list Data) = unConstrData field#46 in - case@Pair projection#51 of - Pair tag#52 fields#53 -> case@Tag tag#52 of - 0 -> case@List field#50 of - Nil -> mkCons field#46 (con (list data) []) - Cons field#56 field#57 -> field#50 - 1 -> case@List field#50 of - Nil -> mkCons field#49 (con (list data) []) - Cons field#63 field#64 -> field#50 in +let projection#51 : pair int (list Data) = unConstrData anf#78 in +let anf#82 : list Main.Option = case@Pair projection#51 of + Pair tag#52 fields#53 -> case@Tag tag#52 of + 0 -> mkCons anf#78 (con (list data) []) + 1 -> mkCons anf#79 (con (list data) []) in let anf#85 : Int = fromInt#69 1 in let anf#84 : list Data = mkCons anf#85 (con (list data) []) in let anf#86 : Main.Option = constrData 0 anf#84 in @@ -139,64 +130,46 @@ let anf#74 : List 'erased = listData anf#87 in equalsData anf#73 anf#74 --- optimized UPLC (program 1.1.0 - [(lam builtin_26 - [(lam builtin_27 - [(lam partial_28 - [(lam fromInt_1 - [(lam anf_2 - [(lam anf_3 - [(lam anf_4 - [(lam anf_5 - [(lam anf_6 - [(lam anf_7 - [(lam anf_19 - [(lam anf_20 - [(lam anf_21 - [(lam anf_22 - [(lam anf_23 - [(lam anf_24 - [(lam anf_25 [[(builtin equalsData) anf_24] anf_25]) - [(builtin listData) anf_23]]) - [(builtin listData) anf_19]]) - [[builtin_26 anf_22] (con (list data) [])]]) - [partial_28 anf_21]]) - [[builtin_26 anf_20] (con (list data) [])]]) + [(lam builtin_18 + [(lam partial_19 + [(lam fromInt_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 + [(lam anf_7 + [(lam projection_8 + [(lam anf_11 + [(lam anf_12 + [(lam anf_13 + [(lam anf_14 + [(lam anf_15 + [(lam anf_16 + [(lam anf_17 [[(builtin equalsData) anf_16] anf_17]) + [(builtin listData) anf_15]]) + [(builtin listData) anf_11]]) + [[builtin_18 anf_14] (con (list data) [])]]) + [partial_19 anf_13]]) + [[builtin_18 anf_12] (con (list data) [])]]) [fromInt_1 (con integer 1)]]) (case - anf_7 - (lam field_8 - (lam field_9 + projection_8 + (lam tag_9 + (lam fields_10 (case - field_9 - (lam field_10 - (lam field_11 - [(lam projection_12 - (case - projection_12 - (lam tag_13 - (lam fields_14 - (case - tag_13 - (case - field_11 - (lam field_15 (lam field_16 field_11)) - [[builtin_26 field_8] (con (list data) [])]) - (case - field_11 - (lam field_17 (lam field_18 field_11)) - [[builtin_26 field_10] (con (list data) [])])))))) - [(builtin unConstrData) field_8]])) - anf_7))) - (force [[builtin_27 (con string "unreachable")] (delay (error))]))]) - [[builtin_26 anf_4] anf_6]]) - [[builtin_26 anf_5] (con (list data) [])]]) - [[(builtin constrData) (con integer 1)] (con (list data) [])]]) - [partial_28 anf_3]]) - [[builtin_26 anf_2] (con (list data) [])]]) - [fromInt_1 (con integer 1)]]) - (builtin iData)]) - [(builtin constrData) (con integer 0)]]) - (force (builtin trace))]) + tag_9 + [[builtin_18 anf_4] (con (list data) [])] + [[builtin_18 anf_5] (con (list data) [])]))))]) + [(builtin unConstrData) anf_4]]) + [[builtin_18 anf_4] anf_6]]) + [[builtin_18 anf_5] (con (list data) [])]]) + [[(builtin constrData) (con integer 1)] (con (list data) [])]]) + [partial_19 anf_3]]) + [[builtin_18 anf_2] (con (list data) [])]]) + [fromInt_1 (con integer 1)]]) + (builtin iData)]) + [(builtin constrData) (con integer 0)]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_fields_unwrap.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_fields_unwrap.snap index 49d39d2c..cc2df591 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_fields_unwrap.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__list_fields_unwrap.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 150 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Lift exposing (lower)\ntype Fields = Fields { a : Bytes, b : Int }\ndataFields : unit -> list Fields\ndataFields _ = [Fields { a = #\"\", b = 14 }, Fields { a = #\"AA\", b = 0 }]\nmain =\n case dataFields () of\n (Fields { b }) :: _ -> lessThanInteger 0 (lower b)\n _ -> False\n" --- --- unoptimized Core @@ -99,18 +98,16 @@ let anf#64 : list Data = mkCons anf#65 anf#63 in let anf#68 : Main.Fields = constrData 0 anf#64 in let anf#69 : list Main.Fields = mkCons anf#68 (con (list data) []) in let match#45 : list Main.Fields = mkCons anf#62 anf#69 in -case@List match#45 of - Nil -> false - Cons field#46 field#47 -> let projection#48 : pair int (list Data) = unConstrData field#46 in - case@Pair projection#48 of - Pair tag#49 fields#50 -> case@List fields#50 of - Cons ignored#51 fieldTail#52 -> case@List fieldTail#52 of - Cons field#53 fieldTail#54 -> let anf#72 : int = unIData field#53 in - lessThanInteger 0 anf#72 +let projection#48 : pair int (list Data) = unConstrData anf#62 in +case@Pair projection#48 of + Pair tag#49 fields#50 -> case@List fields#50 of + Cons ignored#51 fieldTail#52 -> case@List fieldTail#52 of + Cons field#53 fieldTail#54 -> let anf#72 : int = unIData field#53 in + lessThanInteger 0 anf#72 --- optimized UPLC (program 1.1.0 - [(lam builtin_26 - [(lam partial_27 + [(lam builtin_24 + [(lam partial_25 [(lam fromBytes_1 [(lam fromInt_2 [(lam anf_3 @@ -125,39 +122,34 @@ case@List match#45 of [(lam anf_13 [(lam anf_14 [(lam match_15 - (case - match_15 - (lam field_16 - (lam field_17 - [(lam projection_18 + [(lam projection_16 + (case + projection_16 + (lam tag_17 + (lam fields_18 (case - projection_18 - (lam tag_19 - (lam fields_20 + fields_18 + (lam ignored_19 + (lam fieldTail_20 (case - fields_20 - (lam ignored_21 + fieldTail_20 + (lam field_21 (lam fieldTail_22 - (case - fieldTail_22 - (lam field_23 - (lam fieldTail_24 - [(lam anf_25 [[(builtin lessThanInteger) (con integer 0)] anf_25]) - [(builtin unIData) field_23]])) - (error)))) - (error)))))) - [(builtin unConstrData) field_16]])) - (con bool False))) - [[builtin_26 anf_7] anf_14]]) - [[builtin_26 anf_13] (con (list data) [])]]) - [partial_27 anf_12]]) - [[builtin_26 anf_8] anf_10]]) - [[builtin_26 anf_9] (con (list data) [])]]) + [(lam anf_23 [[(builtin lessThanInteger) (con integer 0)] anf_23]) + [(builtin unIData) field_21]])) + (error)))) + (error)))))) + [(builtin unConstrData) anf_7]]) + [[builtin_24 anf_7] anf_14]]) + [[builtin_24 anf_13] (con (list data) [])]]) + [partial_25 anf_12]]) + [[builtin_24 anf_8] anf_10]]) + [[builtin_24 anf_9] (con (list data) [])]]) [fromInt_2 (con integer 0)]]) [fromBytes_1 (con bytestring #aa)]]) - [partial_27 anf_6]]) - [[builtin_26 anf_3] anf_5]]) - [[builtin_26 anf_4] (con (list data) [])]]) + [partial_25 anf_6]]) + [[builtin_24 anf_3] anf_5]]) + [[builtin_24 anf_4] (con (list data) [])]]) [fromInt_2 (con integer 14)]]) [fromBytes_1 (con bytestring #)]]) (builtin iData)]) diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__pass_constr_as_function.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__pass_constr_as_function.snap index 72c2d408..4118536b 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__pass_constr_as_function.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__pass_constr_as_function.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 132 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype make = Make { a : int, b : subMake }\ntype subMake = SubMake { c : int }\nimpl Eq subMake where\n eq (SubMake a) (SubMake b) = equalsInteger a b\nimpl Eq make where\n eq (Make a b) (Make c d) = if equalsInteger a c then eq b d else False\nhi sm toMake = toMake 3 sm\nmain = eq (Make 3 (SubMake 1)) (hi (SubMake 1) Make)\n" --- --- unoptimized Core @@ -85,45 +84,18 @@ main#1 arg_29]))]) (lam value_28 value_28)]) --- optimized Core -let anf#78 : Main.subMake = constr 0 1 in -let anf#79 : Main.make = constr 0 3 anf#78 in -let anf#82 : Main.subMake = constr 0 1 in -let anf#83 : Main.make = constr 0 3 anf#82 in -case@Tag anf#79 of - 0 field#51 field#52 -> case@Tag anf#83 of - 0 field#56 field#57 -> let anf#73 : bool = equalsInteger field#51 field#56 in - case@Bool anf#73 of - True -> case@Tag field#52 of - 0 field#42 -> case@Tag field#57 of - 0 field#45 -> equalsInteger field#42 field#45 - False -> false +let anf#73 : bool = equalsInteger 3 3 in +case@Bool anf#73 of + True -> equalsInteger 1 1 + False -> false --- optimized UPLC (program 1.1.0 [(lam anf_1 - [(lam anf_2 - [(lam anf_3 - [(lam anf_4 - (case - anf_2 - (lam field_5 - (lam field_6 - (case - anf_4 - (lam field_7 - (lam field_8 - [(lam anf_9 - (case - anf_9 - (con bool False) - (case - field_6 - (lam field_10 - (case field_8 (lam field_11 [[(builtin equalsInteger) field_10] field_11])))))) - [[(builtin equalsInteger) field_5] field_7]]))))))) - (constr 0 (con integer 3) anf_3)]) - (constr 0 (con integer 1))]) - (constr 0 (con integer 3) anf_1)]) - (constr 0 (con integer 1))]) + (case + anf_1 + (con bool False) + [[(builtin equalsInteger) (con integer 1)] (con integer 1)])) + [[(builtin equalsInteger) (con integer 3)] (con integer 3)]]) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__test_init_3.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__test_init_3.snap index dd84a0ad..8bb354ee 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__test_init_3.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__test_init_3.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 221 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (..)\ntype option 'a = None | Some 'a\nimpl Eq 'a => Eq (option 'a) where\n eq a b =\n case (a, b) of\n (None, None) -> True\n (Some x, Some y) -> eq x y\n _ -> False\ninit self =\n case self of\n [] -> None\n _ -> Some (doInit self)\ndoInit self =\n case self of\n [] -> trace \"unreachable\" fail\n [_] -> []\n x :: xs -> mkCons x (doInit xs)\nvalues : list int\nvalues = [1, 2, 3, 4]\nmain = eq (init values) (Some [1, 2, 3])\n" --- --- unoptimized Core @@ -188,68 +187,34 @@ let anf#117 : list int = mkCons 4 (con (list integer) []) in let anf#118 : list int = mkCons 3 anf#117 in let anf#119 : list int = mkCons 2 anf#118 in let values#106 : list int = mkCons 1 anf#119 in -let anf#120 : Main.option (list int) = case@List values#106 of - Nil -> constr 0 - Cons field#100 field#101 -> let anf#112 : list int = doInit#89 values#106 in - constr 1 anf#112 in +let anf#112 : list int = doInit#89 values#106 in let anf#125 : list int = mkCons 3 (con (list integer) []) in let anf#126 : list int = mkCons 2 anf#125 in let anf#127 : list int = mkCons 1 anf#126 in -let anf#128 : Main.option (list int) = constr 1 anf#127 in -let match#77 : (Main.option 'erased, Main.option 'erased) = constr 0 anf#120 anf#128 in -let leaf#78 : @delay bool = delay false in -case@Tag match#77 of - 0 field#79 field#80 -> case@Tag field#79 of - 0 -> case@Tag field#80 of - 0 -> true - 1 field#81 -> force leaf#78 - 1 field#82 -> case@Tag field#80 of - 0 -> force leaf#78 - 1 field#83 -> eq#18 field#82 field#83 +eq#18 anf#112 anf#127 --- optimized UPLC (program 1.1.0 - [(lam builtin_47 - [(lam builtin_48 - [(lam partial_49 - [(lam partial_50 - [(lam partial_51 + [(lam builtin_36 + [(lam builtin_37 + [(lam partial_38 + [(lam partial_39 + [(lam partial_40 [(lam eq_17 [(lam doInit_27 [(lam anf_28 [(lam anf_29 [(lam anf_30 [(lam values_31 - [(lam anf_35 - [(lam anf_36 - [(lam anf_37 - [(lam anf_38 - [(lam anf_39 - [(lam match_40 - [(lam leaf_41 - (case - match_40 - (lam field_42 - (lam field_43 - (case - field_42 - (case field_43 (con bool True) (lam field_44 (force leaf_41))) - (lam field_45 - (case field_43 (force leaf_41) (lam field_46 [[eq_17 field_45] field_46])))))))) - (delay (con bool False))]) - (constr 0 anf_35 anf_39)]) - (constr 1 anf_38)]) - [partial_49 anf_37]]) - [partial_50 anf_36]]) - [partial_51 (con (list integer) [])]]) - (case - values_31 - (lam field_32 - (lam field_33 [(lam anf_34 (constr 1 anf_34)) [doInit_27 values_31]])) - (constr 0))]) - [partial_49 anf_30]]) - [partial_50 anf_29]]) - [partial_51 anf_28]]) - [[builtin_47 (con integer 4)] (con (list integer) [])]]) + [(lam anf_32 + [(lam anf_33 + [(lam anf_34 [(lam anf_35 [[eq_17 anf_32] anf_35]) [partial_38 anf_34]]) + [partial_39 anf_33]]) + [partial_40 (con (list integer) [])]]) + [doInit_27 values_31]]) + [partial_38 anf_30]]) + [partial_39 anf_29]]) + [partial_40 anf_28]]) + [[builtin_36 (con integer 4)] (con (list integer) [])]]) [(lam self_19 [self_19 self_19]) (lam self_20 (lam self_21 @@ -261,9 +226,9 @@ case@Tag match#77 of field_23 (lam field_24 (lam field_25 - [(lam anf_26 [[builtin_47 field_22] anf_26]) [[self_20 self_20] field_23]])) + [(lam anf_26 [[builtin_36 field_22] anf_26]) [[self_20 self_20] field_23]])) (con (list integer) [])))) - (force [[builtin_48 (con string "unreachable")] (delay (error))]))))]]) + (force [[builtin_37 (con string "unreachable")] (delay (error))]))))]]) [(lam self_6 [self_6 self_6]) (lam self_7 (lam xs_8 @@ -281,9 +246,9 @@ case@Tag match#77 of [[(builtin equalsInteger) field_12] field_14]])) (con bool False)))) (case ys_9 (lam field_10 (lam field_11 (con bool False))) (con bool True))))))]]) - [builtin_47 (con integer 3)]]) - [builtin_47 (con integer 2)]]) - [builtin_47 (con integer 1)]]) + [builtin_36 (con integer 3)]]) + [builtin_36 (con integer 2)]]) + [builtin_36 (con integer 1)]]) (force (builtin trace))]) (force (builtin mkCons))]) --- result diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__tuple_2_match.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__tuple_2_match.snap index 0f126918..470f3e20 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__tuple_2_match.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__tuple_2_match.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 303 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype curveInt = ECI { ec : (int, int) } | Infinity\nequivalence ec1 ec2 =\n let\n input = (ec1, ec2)\n in\n case input of\n (ECI (x1, y1), ECI (x2, y2)) ->\n if equalsInteger (subtractInteger x2 x1) 0 then\n equalsInteger (subtractInteger y2 y1) 0\n else False\n (Infinity, Infinity) -> True\n (Infinity, ECI _) -> False\n (ECI _, Infinity) -> False\nmain = equivalence Infinity Infinity\n" --- --- unoptimized Core @@ -78,61 +77,9 @@ main#1 (lam value_23 value_23)]) (lam value_22 value_22)]) --- optimized Core -let anf#52 : Main.curveInt = constr 1 in -let anf#54 : Main.curveInt = constr 1 in -let input#30 : (Main.curveInt, Main.curveInt) = constr 0 anf#52 anf#54 in -case@Tag input#30 of - 0 field#32 field#33 -> case@Tag field#32 of - 0 field#34 -> case@Tag field#34 of - 0 field#35 field#36 -> case@Tag field#33 of - 0 field#37 -> case@Tag field#37 of - 0 field#38 field#39 -> let anf#47 : int = subtractInteger field#38 field#35 in - let anf#49 : bool = equalsInteger anf#47 0 in - case@Bool anf#49 of - True -> let anf#50 : int = subtractInteger field#39 field#36 in - equalsInteger anf#50 0 - False -> false - 1 -> false - 1 -> case@Tag field#33 of - 0 field#44 -> false - 1 -> true +true --- optimized UPLC -(program 1.1.0 - [(lam anf_1 - [(lam anf_2 - [(lam input_3 - (case - input_3 - (lam field_4 - (lam field_5 - (case - field_4 - (lam field_6 - (case - field_6 - (lam field_7 - (lam field_8 - (case - field_5 - (lam field_9 - (case - field_9 - (lam field_10 - (lam field_11 - [(lam anf_12 - [(lam anf_13 - (case - anf_13 - (con bool False) - [(lam anf_14 [[(builtin equalsInteger) anf_14] (con integer 0)]) - [[(builtin subtractInteger) field_11] field_8]])) - [[(builtin equalsInteger) anf_12] (con integer 0)]]) - [[(builtin subtractInteger) field_10] field_7]])))) - (con bool False)))))) - (case field_5 (lam field_15 (con bool False)) (con bool True))))))) - (constr 0 anf_1 anf_2)]) - (constr 1)]) - (constr 1)]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_deconstruction.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_deconstruction.snap index 5e08070e..8b753c04 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_deconstruction.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_deconstruction.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 91 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\ntype thing = Thing { idx : int }\ntype datum = A thing | B\ntype redSpend = Spend int | Buy\nmain : bool\nmain =\n case (A (Thing { idx = 42 }), Buy) of\n (A a, Spend x) ->\n if equalsInteger a.idx x then True\n else trace \"a.idx == x ? False\" False\n (_, _) -> True\n" --- --- unoptimized Core @@ -65,56 +64,9 @@ main#1 (lam value_19 value_19)]) (con string "a.idx == x ? False")]) --- optimized Core -let anf#40 : Main.thing = constr 0 42 in -let anf#41 : Main.datum = constr 0 anf#40 in -let anf#42 : Main.redSpend = constr 1 in -let match#29 : (Main.datum, Main.redSpend) = constr 0 anf#41 anf#42 in -let leaf#30 : @delay bool = delay true in -case@Tag match#29 of - 0 field#31 field#32 -> case@Tag field#31 of - 0 field#33 -> case@Tag field#32 of - 0 field#34 -> let projection#37 : int = field@0/1 field#33 in - let anf#43 : bool = equalsInteger projection#37 field#34 in - case@Bool anf#43 of - True -> true - False -> trace "a.idx == x ? False" in false - 1 -> force leaf#30 - 1 -> force leaf#30 +true --- optimized UPLC -(program 1.1.0 - [(lam builtin_12 - [(lam anf_1 - [(lam anf_2 - [(lam anf_3 - [(lam match_4 - [(lam leaf_5 - (case - match_4 - (lam field_6 - (lam field_7 - (case - field_6 - (lam field_8 - (case - field_7 - (lam field_9 - [(lam projection_10 - [(lam anf_11 - (case - anf_11 - (force - [[builtin_12 (con string "a.idx == x ? False")] (delay (con bool False))]) - (con bool True))) - [[(builtin equalsInteger) projection_10] field_9]]) - (case field_8 (lam generated_13 generated_13))]) - (force leaf_5))) - (force leaf_5)))))) - (delay (con bool True))]) - (constr 0 anf_2 anf_3)]) - (constr 1)]) - (constr 0 anf_1)]) - (constr 0 (con integer 42))]) - (force (builtin trace))]) +(program 1.1.0 (con bool True)) --- result (con bool True) --- logs diff --git a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_empty_lists.snap b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_empty_lists.snap index 45b0f23c..e680d488 100644 --- a/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_empty_lists.snap +++ b/crates/nash-codegen/src/build/tests/source/snapshots/nash_codegen__build__tests__source__patterns__when_tuple_empty_lists.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/build/tests/source/patterns.rs -assertion_line: 110 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nmain =\n let\n bucket1 : list int\n bucket1 = [1, 2, 3]\n bucket2 : list int\n bucket2 = [1, 5, 6]\n bye =\n case (bucket1, bucket2) of\n ([], _) -> False\n (_, []) -> False\n (a :: _, b :: _) -> equalsInteger a b\n in\n bye\n" --- --- unoptimized Core @@ -60,45 +59,24 @@ let bucket2#22 : list int = mkCons 1 anf#39 in let anf#43 : list int = mkCons 3 (con (list integer) []) in let anf#44 : list int = mkCons 2 anf#43 in let bucket1#23 : list int = mkCons 1 anf#44 in -let match#24 : (list int, list int) = constr 0 bucket1#23 bucket2#22 in -case@Tag match#24 of - 0 field#25 field#26 -> case@List field#25 of - Nil -> false - Cons field#27 field#28 -> case@List field#26 of - Nil -> false - Cons field#29 field#30 -> equalsInteger field#27 field#29 +equalsInteger 1 1 --- optimized UPLC (program 1.1.0 - [(lam builtin_14 - [(lam partial_15 + [(lam builtin_7 + [(lam partial_8 [(lam anf_1 [(lam anf_2 [(lam bucket2_3 [(lam anf_4 [(lam anf_5 - [(lam bucket1_6 - [(lam match_7 - (case - match_7 - (lam field_8 - (lam field_9 - (case - field_8 - (lam field_10 - (lam field_11 - (case - field_9 - (lam field_12 (lam field_13 [[(builtin equalsInteger) field_10] field_12])) - (con bool False)))) - (con bool False)))))) - (constr 0 bucket1_6 bucket2_3)]) - [partial_15 anf_5]]) - [[builtin_14 (con integer 2)] anf_4]]) - [[builtin_14 (con integer 3)] (con (list integer) [])]]) - [partial_15 anf_2]]) - [[builtin_14 (con integer 5)] anf_1]]) - [[builtin_14 (con integer 6)] (con (list integer) [])]]) - [builtin_14 (con integer 1)]]) + [(lam bucket1_6 [[(builtin equalsInteger) (con integer 1)] (con integer 1)]) + [partial_8 anf_5]]) + [[builtin_7 (con integer 2)] anf_4]]) + [[builtin_7 (con integer 3)] (con (list integer) [])]]) + [partial_8 anf_2]]) + [[builtin_7 (con integer 5)] anf_1]]) + [[builtin_7 (con integer 6)] (con (list integer) [])]]) + [builtin_7 (con integer 1)]]) (force (builtin mkCons))]) --- result (con bool True) diff --git a/crates/nash-codegen/src/lib.rs b/crates/nash-codegen/src/lib.rs index b9c3903a..d65458de 100644 --- a/crates/nash-codegen/src/lib.rs +++ b/crates/nash-codegen/src/lib.rs @@ -16,6 +16,7 @@ pub mod decision_tree; pub mod evidence; pub mod comptime; +pub mod optimizer; pub mod program; mod assertion; diff --git a/crates/nash-codegen/src/lower.rs b/crates/nash-codegen/src/lower.rs index 2e96ad7b..bd868ed0 100644 --- a/crates/nash-codegen/src/lower.rs +++ b/crates/nash-codegen/src/lower.rs @@ -164,271 +164,382 @@ impl<'a> Lower<'a> { } fn term(&mut self, core: &'a Core<'a>) -> Result, Error> { - Ok(match &core.kind { - CoreKind::Var(n) => Term::var(self.arena, self.name(*n)), - CoreKind::Lit(c) => Term::constant(self.arena, c), - CoreKind::Lam { params, body } => { - let body = self.term(body)?; - self.lambda(params, body) - } - CoreKind::App { func, args } => { - let mut term = self.term(func)?; - for arg in *args { - term = term.apply(self.arena, self.term(arg)?); - } - term - } - CoreKind::Let { - binder, - value, - body, - } => { - let unit_sequence = binder.ty - == nash_ir::ty::Ty::Const(&nash_ir::ty::ConstTy::Unit) - && !crate::build::names(body).contains(&binder.name.unique); - let body = self.term(body)?; - let value = self.term(value)?; - if unit_sequence { - Term::case(self.arena, value, self.arena.alloc_slice_copy(&[body])) - } else { - body.lambda(self.arena, self.name(binder.name)) - .apply(self.arena, value) - } - } - CoreKind::Builtin { func, args } => { - if args.len() > func.arity() { - return Err(Error::BuiltinArity); - } - let args = args - .iter() - .map(|arg| self.term(arg)) - .collect::, _>>()?; - self.builtin(*func, &args)? - } - CoreKind::Case { - kind, - scrutinee, - branches, - default, - } => self.case(*kind, scrutinee, branches, *default)?, - CoreKind::Constr { tag, fields } => { - let fields = fields - .iter() - .map(|f| self.term(f)) - .collect::, _>>()?; - Term::constr( - self.arena, - *tag as usize, - self.arena.alloc_slice_copy(&fields), - ) - } - CoreKind::Field { - record, - index, - arity, - } => { - if index >= arity { - return Err(Error::InvalidField { - index: *index, - arity: *arity, - }); - } - let params = (0..*arity) - .map(|_| self.fresh()) - .collect::, _>>()?; - let mut selector = Term::var(self.arena, params[*index as usize]); - for param in params.into_iter().rev() { - selector = selector.lambda(self.arena, param); - } - Term::case( - self.arena, - self.term(record)?, - self.arena.alloc_slice_copy(&[selector]), - ) - } - CoreKind::Trace { message, body } => { - let message = self.term(message)?; - let body = self.term(body)?; - self.builtin(DefaultFunction::Trace, &[message, body.delay(self.arena)])? - .force(self.arena) - } - CoreKind::Error => Term::error(self.arena), - CoreKind::Delay(t) => self.term(t)?.delay(self.arena), - CoreKind::Force(t) => self.term(t)?.force(self.arena), - CoreKind::LetRec { .. } => return Err(Error::Unlowered("recursion")), - }) - } - - fn case( - &mut self, - kind: CaseKind, - scrutinee: &'a Core<'a>, - branches: &'a [Branch<'a>], - default: Option<&'a Core<'a>>, - ) -> Result, Error> { - let scrutinee = self.term(scrutinee)?; - let fallback = match default { - Some(c) => self.term(c)?, - None => Term::error(self.arena), - }; - Ok(match kind { - CaseKind::Pair => { - let [branch] = branches else { - return Err(Error::InvalidCase("pair case requires one branch")); - }; - if branch.test != Test::Pair || branch.binders.len() != 2 || default.is_some() { - return Err(Error::InvalidCase("pair branch must bind its two fields")); - } - let body = self.term(branch.body)?; - Term::case( - self.arena, - scrutinee, - self.arena - .alloc_slice_copy(&[self.lambda(branch.binders, body)]), - ) - } - CaseKind::Bool => { - let mut yes = None; - let mut no = None; - for b in branches { - if !b.binders.is_empty() { - return Err(Error::InvalidCase("boolean branches bind no fields")); - } - let slot = match b.test { - Test::True => &mut yes, - Test::False => &mut no, - _ => return Err(Error::InvalidCase("non-boolean test")), - }; - if slot.is_some() { - return Err(Error::InvalidCase("duplicate boolean branch")); + struct CaseState<'a> { + kind: CaseKind, + scrutinee: Uplc<'a>, + fallback: Uplc<'a>, + branches: Vec<&'a Branch<'a>>, + index: usize, + name: Option<&'a Name<'a>>, + arms: Vec>>, + seen: Vec>, + } + enum Task<'a> { + Visit(&'a Core<'a>), + Finish(&'a Core<'a>, usize, bool), + Field(Uplc<'a>), + CaseStart(CaseKind, &'a [Branch<'a>], bool), + CaseNext(CaseState<'a>), + CaseBody( + CaseState<'a>, + usize, + Option, + Option>, + ), + } + let mut pending = vec![Task::Visit(core)]; + let mut results: Vec> = Vec::new(); + while let Some(task) = pending.pop() { + match task { + Task::Visit(core) => { + let start = results.len(); + match core.kind { + CoreKind::Var(n) => results.push(Term::var(self.arena, self.name(n))), + CoreKind::Lit(c) => results.push(Term::constant(self.arena, c)), + CoreKind::Error => results.push(Term::error(self.arena)), + CoreKind::LetRec { .. } => return Err(Error::Unlowered("recursion")), + CoreKind::Field { + record, + index, + arity, + } => { + if index >= arity { + return Err(Error::InvalidField { index, arity }); + } + let params = (0..arity) + .map(|_| self.fresh()) + .collect::, _>>()?; + let mut selector = Term::var(self.arena, params[index as usize]); + for param in params.into_iter().rev() { + selector = selector.lambda(self.arena, param); + } + pending.push(Task::Field(selector)); + pending.push(Task::Visit(record)); + } + CoreKind::Case { + kind, + scrutinee, + branches, + default, + } => { + pending.push(Task::CaseStart(kind, branches, default.is_some())); + if let Some(body) = default { + pending.push(Task::Visit(body)); + } + pending.push(Task::Visit(scrutinee)); + } + CoreKind::Let { + binder, + value, + body, + } => { + let unit = binder.ty + == nash_ir::ty::Ty::Const(&nash_ir::ty::ConstTy::Unit) + && !crate::build::names(body).contains(&binder.name.unique); + pending.push(Task::Finish(core, start, unit)); + pending.push(Task::Visit(value)); + pending.push(Task::Visit(body)); + } + _ => { + if let CoreKind::Builtin { func, args } = core.kind + && args.len() > func.arity() + { + return Err(Error::BuiltinArity); + } + pending.push(Task::Finish(core, start, false)); + let mut children = Vec::new(); + core.push_children_reversed(&mut children); + pending.extend(children.into_iter().map(Task::Visit)); + } } - *slot = Some(self.term(b.body)?); } - self.branch(scrutinee, yes.unwrap_or(fallback), no.unwrap_or(fallback)) - } - CaseKind::Int | CaseKind::Bytes => { - let name = self.fresh()?; - let value = Term::var(self.arena, name); - let mut rest = fallback; - let mut seen = Vec::new(); - for b in branches.iter().rev() { - if !b.binders.is_empty() || seen.contains(&b.test) { - return Err(Error::InvalidCase("invalid literal branch")); - } - seen.push(b.test); - let (func, literal) = match (kind, b.test) { - (CaseKind::Int, Test::Int(i)) => { - (DefaultFunction::EqualsInteger, Term::integer(self.arena, i)) + Task::Field(selector) => { + let record = results.pop().unwrap(); + results.push(Term::case( + self.arena, + record, + self.arena.alloc_slice_copy(&[selector]), + )); + } + Task::Finish(core, start, unit) => { + let mut children = results.drain(start..); + let result = match core.kind { + CoreKind::Lam { params, .. } => { + self.lambda(params, children.next().unwrap()) + } + CoreKind::App { .. } => { + let mut func = children.next().unwrap(); + for arg in children.by_ref() { + func = func.apply(self.arena, arg); + } + func + } + CoreKind::Let { binder, .. } => { + let body = children.next().unwrap(); + let value = children.next().unwrap(); + if unit { + Term::case(self.arena, value, self.arena.alloc_slice_copy(&[body])) + } else { + body.lambda(self.arena, self.name(binder.name)) + .apply(self.arena, value) + } } - (CaseKind::Bytes, Test::Bytes(bytes)) => ( - DefaultFunction::EqualsByteString, - Term::byte_string(self.arena, bytes), + CoreKind::Builtin { func, .. } => { + self.builtin(func, &children.by_ref().collect::>())? + } + CoreKind::Constr { tag, .. } => Term::constr( + self.arena, + tag as usize, + self.arena + .alloc_slice_copy(&children.by_ref().collect::>()), ), - _ => return Err(Error::InvalidCase("literal test has wrong kind")), + CoreKind::Trace { .. } => { + let message = children.next().unwrap(); + let body = children.next().unwrap(); + self.builtin( + DefaultFunction::Trace, + &[message, body.delay(self.arena)], + )? + .force(self.arena) + } + CoreKind::Delay(_) => children.next().unwrap().delay(self.arena), + CoreKind::Force(_) => children.next().unwrap().force(self.arena), + _ => unreachable!(), }; - let condition = self.builtin(func, &[value, literal])?; - let body = self.term(b.body)?; - rest = self.branch(condition, body, rest); + drop(children); + results.push(result); } - rest.lambda(self.arena, name).apply(self.arena, scrutinee) - } - CaseKind::List => { - let mut nil = None; - let mut cons = None; - for b in branches { - match b.test { - Test::Nil if nil.is_none() && b.binders.is_empty() => { - nil = Some(self.term(b.body)?) - } - Test::Cons if cons.is_none() && b.binders.len() == 2 => { - let body = self.term(b.body)?; - cons = Some(self.lambda(b.binders, body)); + Task::CaseStart(kind, branches, has_default) => { + let fallback = if has_default { + results.pop().unwrap() + } else { + Term::error(self.arena) + }; + let scrutinee = results.pop().unwrap(); + if kind == CaseKind::Pair { + let [branch] = branches else { + return Err(Error::InvalidCase("pair case requires one branch")); + }; + if branch.test != Test::Pair || branch.binders.len() != 2 || has_default { + return Err(Error::InvalidCase("pair branch must bind its two fields")); } - _ => return Err(Error::InvalidCase("invalid list branch")), } - } - let cons = match cons { - Some(cons) => cons, - None => fallback - .lambda(self.arena, self.fresh()?) - .lambda(self.arena, self.fresh()?), - }; - let nil = nil.unwrap_or(fallback); - Term::case( - self.arena, - scrutinee, - self.arena.alloc_slice_copy(&[cons, nil]), - ) - } - CaseKind::Data => { - let name = self.fresh()?; - let value = Term::var(self.arena, name); - let mut arms = [None; 5]; - for b in branches { - let (index, unwrap) = match b.test { - Test::DataConstr => (0, DefaultFunction::UnConstrData), - Test::DataMap => (1, DefaultFunction::UnMapData), - Test::DataList => (2, DefaultFunction::UnListData), - Test::DataI => (3, DefaultFunction::UnIData), - Test::DataB => (4, DefaultFunction::UnBData), - _ => return Err(Error::InvalidCase("non-Data test")), - }; - if arms[index].is_some() || b.binders.len() != 1 { - return Err(Error::InvalidCase("invalid Data branch")); + if kind == CaseKind::Tag && has_default { + return Err(Error::InvalidCase( + "tag defaults must be expanded using constructor arities", + )); } - let body = self.term(b.body)?; - arms[index] = Some( - if crate::build::names(b.body).contains(&b.binders[0].name.unique) { - let function = self.lambda(b.binders, body); - let unwrapped = self.builtin(unwrap, &[value])?; - function.apply(self.arena, unwrapped) - } else { - body - }, - ); - } - let [constr, map, list, int, bytes] = - arms.map(|arm| arm.unwrap_or(fallback).delay(self.arena)); - self.builtin( - DefaultFunction::ChooseData, - &[value, constr, map, list, int, bytes], - )? - .force(self.arena) - .lambda(self.arena, name) - .apply(self.arena, scrutinee) - } - CaseKind::Tag => { - if default.is_some() { - return Err(Error::InvalidCase( - "tag defaults must be expanded using constructor arities", - )); + let mut branches: Vec<_> = branches.iter().collect(); + let name = match kind { + CaseKind::Int | CaseKind::Bytes => { + branches.reverse(); + Some(self.fresh()?) + } + CaseKind::Data => Some(self.fresh()?), + CaseKind::Tag => { + branches.sort_by_key(|b| { + if let Test::Tag(tag) = b.test { + tag + } else { + u16::MAX + } + }); + None + } + _ => None, + }; + let count = match kind { + CaseKind::Bool | CaseKind::List => 2, + CaseKind::Data => 5, + _ => branches.len(), + }; + pending.push(Task::CaseNext(CaseState { + kind, + scrutinee, + fallback, + branches, + index: 0, + name, + arms: vec![None; count], + seen: Vec::new(), + })); } - let mut ordered = branches.iter().collect::>(); - ordered.sort_by_key(|b| { - if let Test::Tag(tag) = b.test { - tag + Task::CaseNext(state) => { + if let Some(branch) = state.branches.get(state.index) { + let mut unwrap = None; + let mut condition = None; + let slot = match state.kind { + CaseKind::Pair => 0, + CaseKind::Bool => { + if !branch.binders.is_empty() { + return Err(Error::InvalidCase( + "boolean branches bind no fields", + )); + } + let slot = match branch.test { + Test::False => 0, + Test::True => 1, + _ => return Err(Error::InvalidCase("non-boolean test")), + }; + if state.arms[slot].is_some() { + return Err(Error::InvalidCase("duplicate boolean branch")); + } + slot + } + CaseKind::Int | CaseKind::Bytes => { + if !branch.binders.is_empty() || state.seen.contains(&branch.test) { + return Err(Error::InvalidCase("invalid literal branch")); + } + let (func, literal) = match (state.kind, branch.test) { + (CaseKind::Int, Test::Int(i)) => ( + DefaultFunction::EqualsInteger, + Term::integer(self.arena, i), + ), + (CaseKind::Bytes, Test::Bytes(bytes)) => ( + DefaultFunction::EqualsByteString, + Term::byte_string(self.arena, bytes), + ), + _ => { + return Err(Error::InvalidCase( + "literal test has wrong kind", + )); + } + }; + condition = Some(self.builtin( + func, + &[Term::var(self.arena, state.name.unwrap()), literal], + )?); + state.index + } + CaseKind::List => match branch.test { + Test::Nil + if state.arms[1].is_none() && branch.binders.is_empty() => + { + 1 + } + Test::Cons + if state.arms[0].is_none() && branch.binders.len() == 2 => + { + 0 + } + _ => return Err(Error::InvalidCase("invalid list branch")), + }, + CaseKind::Data => { + let (slot, func) = match branch.test { + Test::DataConstr => (0, DefaultFunction::UnConstrData), + Test::DataMap => (1, DefaultFunction::UnMapData), + Test::DataList => (2, DefaultFunction::UnListData), + Test::DataI => (3, DefaultFunction::UnIData), + Test::DataB => (4, DefaultFunction::UnBData), + _ => return Err(Error::InvalidCase("non-Data test")), + }; + if state.arms[slot].is_some() || branch.binders.len() != 1 { + return Err(Error::InvalidCase("invalid Data branch")); + } + unwrap = Some(func); + slot + } + CaseKind::Tag => { + if branch.test + != Test::Tag( + u16::try_from(state.index).map_err(|_| { + Error::InvalidCase("too many constructors") + })?, + ) + { + return Err(Error::InvalidCase( + "tag branches must cover consecutive unique tags", + )); + } + state.index + } + }; + let body = branch.body; + pending.push(Task::CaseBody(state, slot, unwrap, condition)); + pending.push(Task::Visit(body)); } else { - u16::MAX + let result = + match state.kind { + CaseKind::Pair | CaseKind::Tag => Term::case( + self.arena, + state.scrutinee, + self.arena.alloc_slice_copy( + &state + .arms + .into_iter() + .map(Option::unwrap) + .collect::>(), + ), + ), + CaseKind::Bool => self.branch( + state.scrutinee, + state.arms[1].unwrap_or(state.fallback), + state.arms[0].unwrap_or(state.fallback), + ), + CaseKind::Int | CaseKind::Bytes => state + .fallback + .lambda(self.arena, state.name.unwrap()) + .apply(self.arena, state.scrutinee), + CaseKind::List => { + let cons = match state.arms[0] { + Some(cons) => cons, + None => state + .fallback + .lambda(self.arena, self.fresh()?) + .lambda(self.arena, self.fresh()?), + }; + Term::case( + self.arena, + state.scrutinee, + self.arena.alloc_slice_copy(&[ + cons, + state.arms[1].unwrap_or(state.fallback), + ]), + ) + } + CaseKind::Data => { + let value = Term::var(self.arena, state.name.unwrap()); + let mut args = vec![value]; + args.extend(state.arms.into_iter().map(|arm| { + arm.unwrap_or(state.fallback).delay(self.arena) + })); + self.builtin(DefaultFunction::ChooseData, &args)? + .force(self.arena) + .lambda(self.arena, state.name.unwrap()) + .apply(self.arena, state.scrutinee) + } + }; + results.push(result); } - }); - let mut arms = Vec::new(); - for (i, b) in ordered.into_iter().enumerate() { - if b.test - != Test::Tag( - u16::try_from(i) - .map_err(|_| Error::InvalidCase("too many constructors"))?, - ) - { - return Err(Error::InvalidCase( - "tag branches must cover consecutive unique tags", - )); + } + Task::CaseBody(mut state, slot, unwrap, condition) => { + let body = results.pop().unwrap(); + let branch = state.branches[state.index]; + if let Some(condition) = condition { + state.fallback = self.branch(condition, body, state.fallback); + state.seen.push(branch.test); + } else { + state.arms[slot] = Some(if let Some(unwrap) = unwrap { + if crate::build::names(branch.body) + .contains(&branch.binders[0].name.unique) + { + let value = Term::var(self.arena, state.name.unwrap()); + let unwrapped = self.builtin(unwrap, &[value])?; + self.lambda(branch.binders, body) + .apply(self.arena, unwrapped) + } else { + body + } + } else { + self.lambda(branch.binders, body) + }); } - let body = self.term(b.body)?; - arms.push(self.lambda(b.binders, body)); + state.index += 1; + pending.push(Task::CaseNext(state)); } - Term::case(self.arena, scrutinee, self.arena.alloc_slice_copy(&arms)) } - }) + } + Ok(results.pop().unwrap()) } } diff --git a/crates/nash-codegen/src/lower/constant_sharing.rs b/crates/nash-codegen/src/lower/constant_sharing.rs index 1f6cdae4..859a07c5 100644 --- a/crates/nash-codegen/src/lower/constant_sharing.rs +++ b/crates/nash-codegen/src/lower/constant_sharing.rs @@ -81,41 +81,60 @@ pub(super) fn share<'a>(lower: &mut Lower<'a>, root: Uplc<'a>) -> Result(lower: &Lower<'a>, term: Uplc<'a>, entries: &[Entry<'a>]) -> Uplc<'a> { - if let Some((func, literal)) = prefix(lower, term) - && let Some(entry) = entries - .iter() - .find(|e| e.func == func && e.literal == literal) - { - return Term::var(lower.arena, entry.name.unwrap()); - } + let mut pending = vec![(term, false, 0)]; + let mut results: Vec> = Vec::new(); let a = lower.arena; - match term { - Term::Apply { function, argument } => { - rewrite(lower, function, entries).apply(a, rewrite(lower, argument, entries)) - } - Term::Lambda { parameter, body } => rewrite(lower, body, entries).lambda(a, parameter), - Term::Force(body) => rewrite(lower, body, entries).force(a), - Term::Delay(body) => rewrite(lower, body, entries).delay(a), - Term::Case { constr, branches } => { - let branches: Vec<_> = branches - .iter() - .map(|branch| rewrite(lower, branch, entries)) - .collect(); - Term::case( - a, - rewrite(lower, constr, entries), - a.alloc_slice_copy(&branches), - ) - } - Term::Constr { tag, fields } => { - let fields: Vec<_> = fields - .iter() - .map(|field| rewrite(lower, field, entries)) - .collect(); - Term::constr(a, *tag, a.alloc_slice_copy(&fields)) + while let Some((term, finish, start)) = pending.pop() { + if !finish { + if let Some((func, literal)) = prefix(lower, term) + && let Some(entry) = entries + .iter() + .find(|e| e.func == func && e.literal == literal) + { + results.push(Term::var(a, entry.name.unwrap())); + continue; + } + pending.push((term, true, results.len())); + match term { + Term::Apply { function, argument } => { + pending.push((argument, false, 0)); + pending.push((function, false, 0)); + } + Term::Lambda { body, .. } | Term::Force(body) | Term::Delay(body) => { + pending.push((body, false, 0)) + } + Term::Case { constr, branches } => { + pending.push((constr, false, 0)); + pending.extend(branches.iter().rev().map(|t| (*t, false, 0))); + } + Term::Constr { fields, .. } => { + pending.extend(fields.iter().rev().map(|t| (*t, false, 0))) + } + _ => {} + } + } else { + let mut children = results.drain(start..); + let result = match term { + Term::Apply { .. } => children.next().unwrap().apply(a, children.next().unwrap()), + Term::Lambda { parameter, .. } => children.next().unwrap().lambda(a, parameter), + Term::Force(_) => children.next().unwrap().force(a), + Term::Delay(_) => children.next().unwrap().delay(a), + Term::Case { branches, .. } => { + let branches: Vec<_> = children.by_ref().take(branches.len()).collect(); + Term::case(a, children.next().unwrap(), a.alloc_slice_copy(&branches)) + } + Term::Constr { tag, .. } => Term::constr( + a, + *tag, + a.alloc_slice_copy(&children.by_ref().collect::>()), + ), + _ => term, + }; + drop(children); + results.push(result); } - _ => term, } + results.pop().unwrap() } #[cfg(test)] diff --git a/crates/nash-codegen/src/lower/tests.rs b/crates/nash-codegen/src/lower/tests.rs index 00cd632b..d40d3ba0 100644 --- a/crates/nash-codegen/src/lower/tests.rs +++ b/crates/nash-codegen/src/lower/tests.rs @@ -205,6 +205,22 @@ fn malformed_core_cases_are_rejected() { Ty::Const(&ConstTy::Int), ); assert!(matches!(lower(&arena, sparse), Err(Error::InvalidCase(_)))); + let overapplied = b.alloc( + Ty::Const(&ConstTy::Int), + CoreKind::Builtin { + func: DefaultFunction::AddInteger, + args: arena.alloc_slice_copy(&[b.int(1), b.int(2), b.int(3)]), + }, + ); + // Recursion rewriting must preserve malformed shapes for lowering to + // diagnose; checked builder constructors would panic before that point. + for core in [malformed, sparse, overapplied] { + let rewritten = crate::recursion::rewrite(&b, core).unwrap(); + assert_eq!( + lower(&arena, core).unwrap_err(), + lower(&arena, rewritten).unwrap_err() + ); + } } #[test] diff --git a/crates/nash-codegen/src/optimizer.rs b/crates/nash-codegen/src/optimizer.rs new file mode 100644 index 00000000..0973434b --- /dev/null +++ b/crates/nash-codegen/src/optimizer.rs @@ -0,0 +1,31 @@ +//! Accepted O1 Core pipeline. Trace policy is decided by codegen, not optimization. +use nash_ir::{anf, build::Builder, core::Core, hygiene}; +use nash_plutus::arena::Arena; + +pub fn optimize<'a>(arena: &'a Arena, core: &'a Core<'a>) -> &'a Core<'a> { + optimize_with(&Builder::new(arena), core) +} + +pub fn optimize_with<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let original_ty = core.ty; + let core = hygiene::freshen(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + let core = nash_ir::static_lift::lift(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + let core = nash_ir::unused_params::reduce(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + let core = nash_ir::known_case::reduce_constr(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + let core = nash_ir::inverse::reduce(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + let core = anf::normalize(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + debug_assert!(anf::validate(core).is_ok()); + let core = nash_ir::small_inline::simplify(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + let core = nash_ir::known_case::simplify_constr_data(b, core); + debug_assert!(hygiene::validate(core, &[]).is_ok()); + debug_assert!(anf::validate(core).is_ok()); + debug_assert_eq!(original_ty, core.ty); + core +} diff --git a/crates/nash-codegen/src/optimizer_tests/anf.rs b/crates/nash-codegen/src/optimizer_tests/anf.rs index 542a71f4..779b06ef 100644 --- a/crates/nash-codegen/src/optimizer_tests/anf.rs +++ b/crates/nash-codegen/src/optimizer_tests/anf.rs @@ -32,7 +32,7 @@ fn constr<'a>(b: &Builder<'a>, tag: u16, fields: &[&'a Core<'a>]) -> &'a Core<'a ) } -pub(crate) use crate::harness::candidate; +use crate::harness::candidate; fn check(name: &str, b: &Builder<'_>, core: &Core<'_>, fails: bool) { let before = crate::recursion::rewrite(b, core).unwrap(); @@ -41,10 +41,6 @@ fn check(name: &str, b: &Builder<'_>, core: &Core<'_>, fails: bool) { let first_anf = anf::normalize(b, lifted); let rewritten = crate::recursion::rewrite(b, first_anf).unwrap(); let after = hygiene::freshen(b, rewritten); - for phase in [fresh, lifted, first_anf, after] { - hygiene::validate(phase, &[]).unwrap(); - } - anf::validate(first_anf).unwrap(); let baseline = crate::harness::eval_core_raw(b.arena, before); let normalized = crate::harness::eval_core_raw(b.arena, after); @@ -66,6 +62,10 @@ fn check(name: &str, b: &Builder<'_>, core: &Core<'_>, fails: bool) { ) ) ); + for phase in [fresh, lifted, first_anf, after] { + hygiene::validate(phase, &[]).unwrap(); + } + anf::validate(first_anf).unwrap(); // Properties independent of the expected snapshot. assert_eq!(core.ty, after.ty); assert_eq!(baseline.observable, normalized.observable); @@ -771,17 +771,13 @@ fn optimized_recursion_lowers_without_renormalizing_self_application() { ); let before = crate::recursion::rewrite(&b, core).unwrap(); let after = candidate(&arena, core); - // Generated self-application remains nested. Lowering accepts this shape. - assert!(anf::validate(after).is_err()); let baseline = crate::harness::eval_core_raw(&arena, before); let optimized = crate::harness::eval_core_raw(&arena, after); - assert_eq!(baseline.observable, optimized.observable); assert!( !optimized.result.starts_with("error:"), "{}", optimized.result ); - assert_eq!(baseline.logs, optimized.logs); insta::assert_snapshot!(crate::harness::pass_snapshot( b.arena, @@ -794,4 +790,8 @@ fn optimized_recursion_lowers_without_renormalizing_self_application() { semantic_output(&optimized), ) )); + assert_eq!(baseline.logs, optimized.logs); + assert_eq!(baseline.observable, optimized.observable); + // Generated self-application remains nested. Lowering accepts this shape. + assert!(anf::validate(after).is_err()); } diff --git a/crates/nash-codegen/src/optimizer_tests/beta.rs b/crates/nash-codegen/src/optimizer_tests/beta.rs index 2823a52b..ba656d74 100644 --- a/crates/nash-codegen/src/optimizer_tests/beta.rs +++ b/crates/nash-codegen/src/optimizer_tests/beta.rs @@ -22,10 +22,6 @@ fn traced<'a>(b: &Builder<'a>, message: &'a str, value: &'a Core<'a>) -> &'a Cor fn check<'a>(name: &str, b: &Builder<'a>, core: &'a Core<'a>, fails: bool) { let before = anf::normalize(b, core); let after = simplify(b, before); - for phase in [before, after] { - anf::validate(phase).unwrap(); - hygiene::validate(phase, &[]).unwrap(); - } let baseline = crate::harness::eval_core_raw(b.arena, before); let candidate = crate::harness::eval_core_raw(b.arena, after); @@ -51,6 +47,10 @@ fn check<'a>(name: &str, b: &Builder<'a>, core: &'a Core<'a>, fails: bool) { ) ) ); + for phase in [before, after] { + anf::validate(phase).unwrap(); + hygiene::validate(phase, &[]).unwrap(); + } // Properties independent of the expected snapshot. assert_eq!(before.ty, after.ty); assert_eq!(pretty(after), pretty(simplify(b, after))); diff --git a/crates/nash-codegen/src/optimizer_tests/dead_bindings.rs b/crates/nash-codegen/src/optimizer_tests/dead_bindings.rs deleted file mode 100644 index 7b7945c5..00000000 --- a/crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +++ /dev/null @@ -1,276 +0,0 @@ -//! Chunk 6 first trial: discard only safe unused nonrecursive bindings. -use nash_ir::{ - analysis, - build::Builder, - core::*, - dead_code, hygiene, - pretty::pretty, - ty::{ConstTy, TermTy, Ty}, -}; -use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; -const INT: Ty<'static> = Ty::Const(&ConstTy::Int); -fn unary<'a>(b: &Builder<'a>) -> Ty<'a> { - Ty::Term( - b.arena - .alloc(TermTy::Fun(b.arena.alloc_slice_copy(&[INT]), INT)), - ) -} -fn bind<'a>(b: &Builder<'a>, ty: Ty<'a>) -> Binder<'a> { - Binder { - name: b.fresh("unused"), - ty, - } -} -fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, removes: bool, fails: bool) { - let after = dead_code::simplify_bindings(b, before); - let normalized = nash_ir::anf::normalize(b, before); - nash_ir::anf::validate(dead_code::simplify_bindings(b, normalized)).unwrap(); - hygiene::validate(after, &[]).unwrap(); - - let baseline = crate::harness::eval_core_raw(b.arena, before); - let candidate = crate::harness::eval_core_raw(b.arena, after); - - assert_eq!(candidate.result.starts_with("error:"), fails); - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - baseline.uplc, - pretty(after), - candidate.uplc, - candidate.result, - candidate.logs - ) - ) - ); - // Properties independent of the expected snapshot. - assert_eq!(before.ty, after.ty); - assert_eq!( - pretty(after), - pretty(dead_code::simplify_bindings(b, after)) - ); - assert_eq!( - analysis::size_estimate(after).nodes < analysis::size_estimate(before).nodes, - removes - ); - assert_eq!(baseline.observable, candidate.observable); - assert_eq!(baseline.logs, candidate.logs); -} -#[test] -fn unused_safe_values() { - let a = Arena::new(); - let b = Builder::new(&a); - let p = bind(&b, INT); - let values = [ - ("literal", b.int(9)), - ("closure_with_failure", b.lam(&[p], b.error(INT))), - ("delayed_failure", b.delay(b.error(INT))), - ( - "partial_builtin", - b.builtin(F::AddInteger, &[b.int(9)], unary(&b)), - ), - ( - "forced_builtin", - b.builtin( - F::HeadList, - &[], - Ty::Term(a.alloc(TermTy::Fun( - a.alloc_slice_copy(&[Ty::Const(a.alloc(ConstTy::List(INT)))]), - INT, - ))), - ), - ), - ]; - for (name, value) in values { - check( - name, - &b, - b.let_(bind(&b, value.ty), value, b.int(42)), - true, - false, - ); - } -} -#[test] -fn unused_strict_work_stays() { - let a = Arena::new(); - let b = Builder::new(&a); - let trace = b.trace(b.lit(Constant::string(&a, "kept")), b.int(7)); - for (name, value, fails) in [ - ("trace", trace, false), - ("failure", b.error(INT), true), - ("forced_failure", b.force(b.delay(b.error(INT)), INT), true), - ( - "saturated_builtin", - b.builtin(F::DivideInteger, &[b.int(1), b.int(0)], INT), - true, - ), - ( - "partial_strict_argument", - b.builtin(F::AddInteger, &[trace], unary(&b)), - false, - ), - ] { - check( - name, - &b, - b.let_(bind(&b, value.ty), value, b.int(42)), - false, - fails, - ); - } -} -#[test] -fn cascading_unused_bindings() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, INT); - let y = bind(&b, INT); - check( - "cascade", - &b, - b.let_(x, b.int(7), b.let_(y, b.var(x.name, INT), b.int(42))), - true, - false, - ); -} -#[test] -fn used_capture_stays() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, INT); - let p = bind(&b, INT); - check( - "used_capture", - &b, - b.let_(x, b.int(7), b.lam(&[p], b.var(x.name, INT))), - false, - false, - ); -} -#[test] -fn constructor_fields_are_strict() { - let a = Arena::new(); - let b = Builder::new(&a); - for (name, field, removes, fails) in [ - ("safe_constructor", b.int(7), true, false), - ("strict_constructor", b.error(INT), false, true), - ] { - let ty = Ty::Runtime(a.alloc(nash_ir::ty::RuntimeTy::Constr { - tag: 0, - fields: a.alloc_slice_copy(&[INT]), - })); - let value = b.constr(0, &[field], ty); - check( - name, - &b, - b.let_(bind(&b, ty), value, b.int(42)), - removes, - fails, - ); - } -} -#[test] -fn diverging_call_is_retained() { - let a = Arena::new(); - let b = Builder::new(&a); - let p = bind(&b, INT); - let f = bind(&b, unary(&b)); - let recur = b.app(b.var(f.name, f.ty), &[b.var(p.name, INT)], INT); - let root = b.let_rec( - &[RecBinder { - binder: f, - params: a.alloc_slice_copy(&[p]), - static_params: &[], - body: recur, - }], - b.let_( - bind(&b, INT), - b.app(b.var(f.name, f.ty), &[b.int(0)], INT), - b.int(42), - ), - ); - let after = dead_code::simplify_bindings(&b, root); - // Deliberately do not run an infinite program: exact identity proves that - // the unused recursive call and its strict evaluation remain intact. - assert!(std::ptr::eq(root, after)); - hygiene::validate(after, &[]).unwrap(); - insta::assert_snapshot!( - "diverging_call", - crate::harness::pass_snapshot( - b.arena, - root, - format!( - "--- core before\n{}\n--- core after\n{}", - pretty(root), - pretty(after) - ) - ) - ); -} -#[test] -fn unused_closure_releases_capture() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, INT); - let p = bind(&b, INT); - let lam = b.lam(&[p], b.var(x.name, INT)); - check( - "dead_capture", - &b, - b.let_(x, b.int(7), b.let_(bind(&b, lam.ty), lam, b.int(42))), - true, - false, - ); -} - -#[test] -fn accepted_cleanup_removes_safe_ignored_arguments() { - let a = Arena::new(); - let b = Builder::new(&a); - for (name, argument, logs) in [ - ("cleanup_safe_argument", b.delay(b.error(INT)), &[][..]), - ( - "cleanup_strict_argument", - b.trace(b.lit(Constant::string(&a, "kept")), b.int(9)), - &["kept"][..], - ), - ] { - let p = bind(&b, argument.ty); - let before = nash_ir::anf::normalize(&b, b.app(b.lam(&[p], b.int(42)), &[argument], INT)); - let after = nash_ir::small_inline::simplify(&b, before); - nash_ir::anf::validate(after).unwrap(); - hygiene::validate(after, &[]).unwrap(); - assert_eq!(before.ty, after.ty); - assert_eq!( - pretty(after), - pretty(nash_ir::small_inline::simplify(&b, after)) - ); - if logs.is_empty() { - assert!(matches!(after.kind, CoreKind::Lit(_))); - } - let baseline = crate::harness::eval_core_raw(&a, before); - let candidate = crate::harness::eval_core_raw(&a, after); - assert_eq!(baseline.observable, candidate.observable); - - assert_eq!(baseline.logs, candidate.logs); - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- core after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - pretty(after), - candidate.result, - candidate.logs - ) - ) - ); - } -} diff --git a/crates/nash-codegen/src/optimizer_tests/dead_code.rs b/crates/nash-codegen/src/optimizer_tests/dead_code.rs new file mode 100644 index 00000000..02096de6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/dead_code.rs @@ -0,0 +1,707 @@ +//! Dead-code elimination semantics with accepted-pipeline and isolated-pass evidence. + +mod bindings { + //! Safe unused nonrecursive bindings. + use nash_ir::{ + analysis, + build::Builder, + core::*, + dead_code, hygiene, + pretty::pretty, + ty::{ConstTy, TermTy, Ty}, + }; + use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + fn unary<'a>(b: &Builder<'a>) -> Ty<'a> { + Ty::Term( + b.arena + .alloc(TermTy::Fun(b.arena.alloc_slice_copy(&[INT]), INT)), + ) + } + fn bind<'a>(b: &Builder<'a>, ty: Ty<'a>) -> Binder<'a> { + Binder { + name: b.fresh("unused"), + ty, + } + } + fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, removes: bool, fails: bool) { + let after = dead_code::simplify_bindings(b, before); + + let baseline = crate::harness::eval_core_raw(b.arena, before); + let candidate = crate::harness::eval_core_raw(b.arena, after); + + assert_eq!(candidate.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + baseline.uplc, + pretty(after), + candidate.uplc, + candidate.result, + candidate.logs + ) + ) + ); + let normalized = nash_ir::anf::normalize(b, before); + nash_ir::anf::validate(dead_code::simplify_bindings(b, normalized)).unwrap(); + hygiene::validate(after, &[]).unwrap(); + // Properties independent of the expected snapshot. + assert_eq!(before.ty, after.ty); + assert_eq!( + pretty(after), + pretty(dead_code::simplify_bindings(b, after)) + ); + assert_eq!( + analysis::size_estimate(after).nodes < analysis::size_estimate(before).nodes, + removes + ); + assert_eq!(baseline.observable, candidate.observable); + assert_eq!(baseline.logs, candidate.logs); + } + #[test] + fn unused_safe_values() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, INT); + let values = [ + ("literal", b.int(9)), + ("closure_with_failure", b.lam(&[p], b.error(INT))), + ("delayed_failure", b.delay(b.error(INT))), + ( + "partial_builtin", + b.builtin(F::AddInteger, &[b.int(9)], unary(&b)), + ), + ( + "forced_builtin", + b.builtin( + F::HeadList, + &[], + Ty::Term(a.alloc(TermTy::Fun( + a.alloc_slice_copy(&[Ty::Const(a.alloc(ConstTy::List(INT)))]), + INT, + ))), + ), + ), + ]; + for (name, value) in values { + check( + name, + &b, + b.let_(bind(&b, value.ty), value, b.int(42)), + true, + false, + ); + } + } + #[test] + fn unused_strict_work_stays() { + let a = Arena::new(); + let b = Builder::new(&a); + let trace = b.trace(b.lit(Constant::string(&a, "kept")), b.int(7)); + for (name, value, fails) in [ + ("trace", trace, false), + ("failure", b.error(INT), true), + ("forced_failure", b.force(b.delay(b.error(INT)), INT), true), + ( + "saturated_builtin", + b.builtin(F::DivideInteger, &[b.int(1), b.int(0)], INT), + true, + ), + ( + "partial_strict_argument", + b.builtin(F::AddInteger, &[trace], unary(&b)), + false, + ), + ] { + check( + name, + &b, + b.let_(bind(&b, value.ty), value, b.int(42)), + false, + fails, + ); + } + } + #[test] + fn cascading_unused_bindings() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, INT); + let y = bind(&b, INT); + check( + "cascade", + &b, + b.let_(x, b.int(7), b.let_(y, b.var(x.name, INT), b.int(42))), + true, + false, + ); + } + #[test] + fn used_capture_stays() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, INT); + let p = bind(&b, INT); + check( + "used_capture", + &b, + b.let_(x, b.int(7), b.lam(&[p], b.var(x.name, INT))), + false, + false, + ); + } + #[test] + fn constructor_fields_are_strict() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, field, removes, fails) in [ + ("safe_constructor", b.int(7), true, false), + ("strict_constructor", b.error(INT), false, true), + ] { + let ty = Ty::Runtime(a.alloc(nash_ir::ty::RuntimeTy::Constr { + tag: 0, + fields: a.alloc_slice_copy(&[INT]), + })); + let value = b.constr(0, &[field], ty); + check( + name, + &b, + b.let_(bind(&b, ty), value, b.int(42)), + removes, + fails, + ); + } + } + #[test] + fn diverging_call_is_retained() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, INT); + let f = bind(&b, unary(&b)); + let recur = b.app(b.var(f.name, f.ty), &[b.var(p.name, INT)], INT); + let root = b.let_rec( + &[RecBinder { + binder: f, + params: a.alloc_slice_copy(&[p]), + static_params: &[], + body: recur, + }], + b.let_( + bind(&b, INT), + b.app(b.var(f.name, f.ty), &[b.int(0)], INT), + b.int(42), + ), + ); + let after = dead_code::simplify_bindings(&b, root); + insta::assert_snapshot!( + "diverging_call", + crate::harness::pass_snapshot( + b.arena, + root, + format!( + "--- core before\n{}\n--- core after\n{}", + pretty(root), + pretty(after) + ) + ) + ); + // Deliberately do not run an infinite program: exact identity proves that + // the unused recursive call and its strict evaluation remain intact. + assert!(std::ptr::eq(root, after)); + hygiene::validate(after, &[]).unwrap(); + } + #[test] + fn unused_closure_releases_capture() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, INT); + let p = bind(&b, INT); + let lam = b.lam(&[p], b.var(x.name, INT)); + check( + "dead_capture", + &b, + b.let_(x, b.int(7), b.let_(bind(&b, lam.ty), lam, b.int(42))), + true, + false, + ); + } + + #[test] + fn accepted_cleanup_removes_safe_ignored_arguments() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, argument) in [ + ("cleanup_safe_argument", b.delay(b.error(INT))), + ( + "cleanup_strict_argument", + b.trace(b.lit(Constant::string(&a, "kept")), b.int(9)), + ), + ] { + let p = bind(&b, argument.ty); + let before = + nash_ir::anf::normalize(&b, b.app(b.lam(&[p], b.int(42)), &[argument], INT)); + let after = nash_ir::small_inline::simplify(&b, before); + let baseline = crate::harness::eval_core_raw(&a, before); + let candidate = crate::harness::eval_core_raw(&a, after); + + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- core after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + pretty(after), + candidate.result, + candidate.logs + ) + ) + ); + assert_eq!(baseline.logs, candidate.logs); + assert_eq!(baseline.observable, candidate.observable); + nash_ir::anf::validate(after).unwrap(); + hygiene::validate(after, &[]).unwrap(); + assert_eq!(before.ty, after.ty); + assert_eq!( + pretty(after), + pretty(nash_ir::small_inline::simplify(&b, after)) + ); + } + } +} + +mod recursive { + //! Continuation-rooted recursive group reachability. + use nash_ir::{ + build::Builder, + core::*, + dead_code, hygiene, + pretty::pretty, + ty::{ConstTy, TermTy, Ty}, + }; + use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + fn bind<'a>(b: &Builder<'a>, text: &'a str, ty: Ty<'a>) -> Binder<'a> { + Binder { + name: b.fresh(text), + ty, + } + } + fn function<'a>(b: &Builder<'a>, text: &'a str, arity: usize) -> Binder<'a> { + bind( + b, + text, + Ty::Term(b.arena.alloc(TermTy::Fun( + b.arena.alloc_slice_copy(&vec![INT; arity]), + INT, + ))), + ) + } + fn def<'a>( + b: &Builder<'a>, + binder: Binder<'a>, + params: &[Binder<'a>], + body: &'a Core<'a>, + ) -> RecBinder<'a> { + RecBinder { + binder, + params: b.arena.alloc_slice_copy(params), + static_params: &[], + body, + } + } + fn call<'a>(b: &Builder<'a>, f: Binder<'a>, args: &[&'a Core<'a>]) -> &'a Core<'a> { + b.app(b.var(f.name, f.ty), args, INT) + } + fn trace<'a>(b: &Builder<'a>, message: &'a str, body: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, message)), body) + } + fn check<'a>(name: &str, b: &Builder<'a>, before: &'a Core<'a>, fails: bool) -> &'a Core<'a> { + let after = dead_code::prune_recursive(b, before); + let baseline = + crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, before).unwrap()); + let candidate = + crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, after).unwrap()); + + assert_eq!(candidate.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + baseline.uplc, + pretty(after), + candidate.uplc, + candidate.result, + candidate.logs + ) + ) + ); + hygiene::validate(before, &[]).unwrap(); + hygiene::validate(after, &[]).unwrap(); + + let anf = nash_ir::anf::normalize(b, before); + nash_ir::anf::validate(dead_code::prune_recursive(b, anf)).unwrap(); + // Properties independent of the expected snapshot. + assert_eq!(before.ty, after.ty); + assert!(std::ptr::eq(after, dead_code::prune_recursive(b, after))); + assert_eq!(baseline.observable, candidate.observable); + assert_eq!(baseline.logs, candidate.logs); + after + } + #[test] + fn unused_self_and_mutual_cycles() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "f", 1); + let g = function(&b, "g", 1); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let self_def = def( + &b, + f, + &[x], + trace(&b, "unreachable", call(&b, f, &[b.var(x.name, INT)])), + ); + check("unused_self", &b, b.let_rec(&[self_def], b.int(42)), false); + let fs = def(&b, f, &[x], call(&b, g, &[b.var(x.name, INT)])); + let gs = def(&b, g, &[y], call(&b, f, &[b.var(y.name, INT)])); + check( + "unused_cycle", + &b, + b.let_rec(&[fs, gs], trace(&b, "continuation", b.int(42))), + false, + ); + check( + "unused_failure", + &b, + b.let_rec(&[def(&b, f, &[x], b.error(INT))], b.int(42)), + false, + ); + } + #[test] + fn transitive_chain_retains_order_and_drops_cycle() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "f", 1); + let g = function(&b, "g", 1); + let dead = function(&b, "dead", 1); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let z = bind(&b, "z", INT); + let root = b.let_rec( + &[ + def(&b, g, &[y], trace(&b, "g", b.var(y.name, INT))), + def(&b, dead, &[z], call(&b, dead, &[b.var(z.name, INT)])), + def( + &b, + f, + &[x], + trace(&b, "f", call(&b, g, &[b.var(x.name, INT)])), + ), + ], + call(&b, f, &[b.int(42)]), + ); + check("transitive", &b, root, false); + } + #[test] + fn returned_partial_and_suspended_references_are_roots() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "f", 2); + let dead = function(&b, "dead", 1); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let z = bind(&b, "z", INT); + let defs = [ + def( + &b, + f, + &[x, y], + b.builtin( + F::AddInteger, + &[b.var(x.name, INT), b.var(y.name, INT)], + INT, + ), + ), + def(&b, dead, &[z], b.error(INT)), + ]; + let returned = b.app( + b.let_rec(&defs, b.var(f.name, f.ty)), + &[b.int(40), b.int(2)], + INT, + ); + check("returned", &b, returned, false); + let partial = b.app( + b.var(f.name, f.ty), + &[b.int(40)], + function(&b, "typeOnly", 1).ty, + ); + check( + "partial", + &b, + b.app(b.let_rec(&defs, partial), &[b.int(2)], INT), + false, + ); + let delayed = b.let_rec(&defs, b.delay(call(&b, f, &[b.int(40), b.int(2)]))); + check("delayed_capture", &b, b.force(delayed, INT), false); + let p = bind(&b, "p", INT); + let closure = b.let_rec( + &defs, + b.lam(&[p], call(&b, f, &[b.int(40), b.var(p.name, INT)])), + ); + check( + "lambda_capture", + &b, + b.app(closure, &[b.int(2)], INT), + false, + ); + } + #[test] + fn singleton_preserves_static_metadata_and_captures() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "f", 2); + let dead = function(&b, "dead", 1); + let x = bind(&b, "static", INT); + let n = bind(&b, "n", INT); + let z = bind(&b, "z", INT); + let capture = bind(&b, "capture", INT); + let body = b.if_( + b.builtin( + F::EqualsInteger, + &[b.var(n.name, INT), b.int(0)], + Ty::Const(&ConstTy::Bool), + ), + b.builtin( + F::AddInteger, + &[b.var(x.name, INT), b.var(capture.name, INT)], + INT, + ), + call( + &b, + f, + &[ + b.var(x.name, INT), + b.builtin(F::SubtractInteger, &[b.var(n.name, INT), b.int(1)], INT), + ], + ), + ); + let member = RecBinder { + static_params: &[0], + ..def(&b, f, &[x, n], body) + }; + let group = b.let_rec( + &[member, def(&b, dead, &[z], b.error(INT))], + call(&b, f, &[b.int(40), b.int(3)]), + ); + let after = check( + "singleton_metadata", + &b, + b.let_(capture, b.int(2), group), + false, + ); + let CoreKind::Let { body: after, .. } = after.kind else { + panic!("capture binding"); + }; + let CoreKind::LetRec { + binders: [kept], .. + } = after.kind + else { + panic!("singleton"); + }; + assert!(std::ptr::eq(kept.params, member.params)); + assert!(std::ptr::eq(kept.static_params, member.static_params)); + assert_eq!(kept.binder.ty, member.binder.ty); + } + #[test] + fn reachable_failure_stays() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "f", 1); + let x = bind(&b, "x", INT); + let root = b.let_rec( + &[def(&b, f, &[x], trace(&b, "failure", b.error(INT)))], + call(&b, f, &[b.int(42)]), + ); + let after = check("reachable_failure", &b, root, true); + assert!(std::ptr::eq(root, after)); + } + #[test] + fn delayed_workers_and_nested_groups() { + let a = Arena::new(); + let b = Builder::new(&a); + let value = b.delay(b.int(42)); + let worker = bind(&b, "worker", value.ty); + let member = def( + &b, + worker, + &[], + b.delay(b.if_( + b.lit(Constant::bool(&a, true)), + b.int(42), + b.force(b.var(worker.name, worker.ty), INT), + )), + ); + check( + "unused_delayed_worker", + &b, + b.let_rec(&[member], b.int(7)), + false, + ); + check( + "live_delayed_worker", + &b, + b.let_rec(&[member], b.force(b.var(worker.name, worker.ty), INT)), + false, + ); + let f = function(&b, "outer", 1); + let g = function(&b, "inner", 1); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let inner = b.let_rec( + &[def(&b, g, &[y], call(&b, f, &[b.var(y.name, INT)]))], + b.int(42), + ); + let root = b.let_rec(&[def(&b, f, &[x], b.var(x.name, INT))], inner); + check("nested_dead_capture", &b, root, false); + } + #[test] + fn unsupported_recursive_values_stay_rejected() { + let a = Arena::new(); + let b = Builder::new(&a); + let value = bind(&b, "value", INT); + let root = b.let_rec(&[def(&b, value, &[], b.error(INT))], b.int(42)); + let after = dead_code::prune_recursive(&b, root); + assert!(std::ptr::eq(root, after)); + assert_eq!( + crate::recursion::rewrite(&b, after).unwrap_err(), + crate::recursion::Error::RecursiveValue + ); + } + #[test] + fn reachable_mutual_cycle_survives() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "f", 1); + let g = function(&b, "g", 1); + let dead = function(&b, "dead", 1); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let z = bind(&b, "z", INT); + let step = |next, name| { + b.if_( + b.builtin( + F::EqualsInteger, + &[b.var(name, INT), b.int(0)], + Ty::Const(&ConstTy::Bool), + ), + b.int(42), + call( + &b, + next, + &[b.builtin(F::SubtractInteger, &[b.var(name, INT), b.int(1)], INT)], + ), + ) + }; + let root = b.let_rec( + &[ + def(&b, f, &[x], step(g, x.name)), + def(&b, dead, &[z], b.error(INT)), + def(&b, g, &[y], step(f, y.name)), + ], + call(&b, f, &[b.int(4)]), + ); + check("live_mutual_cycle", &b, root, false); + } + #[test] + fn cold_and_nested_references_remain_live() { + let a = Arena::new(); + let b = Builder::new(&a); + let f = function(&b, "outer", 1); + let g = function(&b, "inner", 1); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let outer = def(&b, f, &[x], b.var(x.name, INT)); + let inner = b.let_rec( + &[def(&b, g, &[y], call(&b, f, &[b.var(y.name, INT)]))], + call(&b, g, &[b.int(42)]), + ); + check("nested_live_capture", &b, b.let_rec(&[outer], inner), false); + let cold = b.let_rec( + &[def(&b, f, &[x], b.error(INT))], + b.if_( + b.lit(Constant::bool(&a, true)), + b.int(42), + call(&b, f, &[b.int(0)]), + ), + ); + let after = check("cold_reference", &b, cold, false); + assert!(std::ptr::eq(cold, after)); + } + + #[test] + fn accepted_cleanup_releases_dead_captures_but_preserves_effects() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, captured, suspended) in [ + ("cleanup_dead_delay_capture", b.delay(b.error(INT)), true), + ("cleanup_strict_capture", trace(&b, "kept", b.int(7)), false), + ] { + let capture = bind(&b, "capture", captured.ty); + let f = function(&b, "dead", 1); + let x = bind(&b, "x", INT); + let value = b.var(capture.name, capture.ty); + let read = if suspended { + b.force(value, INT) + } else { + value + }; + let body = b.builtin(F::AddInteger, &[read, read], INT); + let root = b.let_( + capture, + captured, + b.let_rec(&[def(&b, f, &[x], body)], b.int(42)), + ); + let before = nash_ir::anf::normalize(&b, root); + let after = nash_ir::small_inline::simplify(&b, before); + let baseline = + crate::harness::eval_core_raw(&a, crate::recursion::rewrite(&b, before).unwrap()); + let candidate = + crate::harness::eval_core_raw(&a, crate::recursion::rewrite(&b, after).unwrap()); + + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- core after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + pretty(after), + candidate.result, + candidate.logs + ) + ) + ); + assert_eq!(baseline.logs, candidate.logs); + assert_eq!(baseline.observable, candidate.observable); + assert_eq!(before.ty, after.ty); + nash_ir::anf::validate(after).unwrap(); + hygiene::validate(after, &[]).unwrap(); + assert!(std::ptr::eq( + after, + nash_ir::small_inline::simplify(&b, after) + )); + } + } +} diff --git a/crates/nash-codegen/src/optimizer_tests/dead_recursive.rs b/crates/nash-codegen/src/optimizer_tests/dead_recursive.rs deleted file mode 100644 index 1d3c260d..00000000 --- a/crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +++ /dev/null @@ -1,468 +0,0 @@ -//! Chunk 6 trial: continuation-rooted recursive group reachability. -use nash_ir::{ - build::Builder, - core::*, - dead_code, hygiene, - pretty::pretty, - ty::{ConstTy, TermTy, Ty}, -}; -use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; -const INT: Ty<'static> = Ty::Const(&ConstTy::Int); -fn bind<'a>(b: &Builder<'a>, text: &'a str, ty: Ty<'a>) -> Binder<'a> { - Binder { - name: b.fresh(text), - ty, - } -} -fn function<'a>(b: &Builder<'a>, text: &'a str, arity: usize) -> Binder<'a> { - bind( - b, - text, - Ty::Term(b.arena.alloc(TermTy::Fun( - b.arena.alloc_slice_copy(&vec![INT; arity]), - INT, - ))), - ) -} -fn def<'a>( - b: &Builder<'a>, - binder: Binder<'a>, - params: &[Binder<'a>], - body: &'a Core<'a>, -) -> RecBinder<'a> { - RecBinder { - binder, - params: b.arena.alloc_slice_copy(params), - static_params: &[], - body, - } -} -fn call<'a>(b: &Builder<'a>, f: Binder<'a>, args: &[&'a Core<'a>]) -> &'a Core<'a> { - b.app(b.var(f.name, f.ty), args, INT) -} -fn trace<'a>(b: &Builder<'a>, message: &'a str, body: &'a Core<'a>) -> &'a Core<'a> { - b.trace(b.lit(Constant::string(b.arena, message)), body) -} -fn count(core: &Core<'_>) -> usize { - let mut n = 0; - core.walk(&mut |node| { - if let CoreKind::LetRec { binders, .. } = node.kind { - n += binders.len(); - } - }); - n -} -fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, members: usize, fails: bool) { - let after = dead_code::prune_recursive(b, before); - hygiene::validate(before, &[]).unwrap(); - hygiene::validate(after, &[]).unwrap(); - - let anf = nash_ir::anf::normalize(b, before); - nash_ir::anf::validate(dead_code::prune_recursive(b, anf)).unwrap(); - let baseline = - crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, before).unwrap()); - let candidate = - crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, after).unwrap()); - - assert_eq!(candidate.result.starts_with("error:"), fails); - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - baseline.uplc, - pretty(after), - candidate.uplc, - candidate.result, - candidate.logs - ) - ) - ); - // Properties independent of the expected snapshot. - assert_eq!(before.ty, after.ty); - assert_eq!(count(after), members); - assert!(std::ptr::eq(after, dead_code::prune_recursive(b, after))); - assert_eq!(baseline.observable, candidate.observable); - assert_eq!(baseline.logs, candidate.logs); -} -#[test] -fn unused_self_and_mutual_cycles() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "f", 1); - let g = function(&b, "g", 1); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let self_def = def( - &b, - f, - &[x], - trace(&b, "unreachable", call(&b, f, &[b.var(x.name, INT)])), - ); - check( - "unused_self", - &b, - b.let_rec(&[self_def], b.int(42)), - 0, - false, - ); - let fs = def(&b, f, &[x], call(&b, g, &[b.var(x.name, INT)])); - let gs = def(&b, g, &[y], call(&b, f, &[b.var(y.name, INT)])); - check( - "unused_cycle", - &b, - b.let_rec(&[fs, gs], trace(&b, "continuation", b.int(42))), - 0, - false, - ); - check( - "unused_failure", - &b, - b.let_rec(&[def(&b, f, &[x], b.error(INT))], b.int(42)), - 0, - false, - ); -} -#[test] -fn transitive_chain_retains_order_and_drops_cycle() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "f", 1); - let g = function(&b, "g", 1); - let dead = function(&b, "dead", 1); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let z = bind(&b, "z", INT); - let root = b.let_rec( - &[ - def(&b, g, &[y], trace(&b, "g", b.var(y.name, INT))), - def(&b, dead, &[z], call(&b, dead, &[b.var(z.name, INT)])), - def( - &b, - f, - &[x], - trace(&b, "f", call(&b, g, &[b.var(x.name, INT)])), - ), - ], - call(&b, f, &[b.int(42)]), - ); - let after = dead_code::prune_recursive(&b, root); - let CoreKind::LetRec { binders, .. } = after.kind else { - panic!("retained group"); - }; - assert_eq!( - binders - .iter() - .map(|r| r.binder.name.text) - .collect::>(), - ["g", "f"] - ); - check("transitive", &b, root, 2, false); -} -#[test] -fn returned_partial_and_suspended_references_are_roots() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "f", 2); - let dead = function(&b, "dead", 1); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let z = bind(&b, "z", INT); - let defs = [ - def( - &b, - f, - &[x, y], - b.builtin( - F::AddInteger, - &[b.var(x.name, INT), b.var(y.name, INT)], - INT, - ), - ), - def(&b, dead, &[z], b.error(INT)), - ]; - let returned = b.app( - b.let_rec(&defs, b.var(f.name, f.ty)), - &[b.int(40), b.int(2)], - INT, - ); - check("returned", &b, returned, 1, false); - let partial = b.app( - b.var(f.name, f.ty), - &[b.int(40)], - function(&b, "typeOnly", 1).ty, - ); - check( - "partial", - &b, - b.app(b.let_rec(&defs, partial), &[b.int(2)], INT), - 1, - false, - ); - let delayed = b.let_rec(&defs, b.delay(call(&b, f, &[b.int(40), b.int(2)]))); - check("delayed_capture", &b, b.force(delayed, INT), 1, false); - let p = bind(&b, "p", INT); - let closure = b.let_rec( - &defs, - b.lam(&[p], call(&b, f, &[b.int(40), b.var(p.name, INT)])), - ); - check( - "lambda_capture", - &b, - b.app(closure, &[b.int(2)], INT), - 1, - false, - ); -} -#[test] -fn singleton_preserves_static_metadata_and_captures() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "f", 2); - let dead = function(&b, "dead", 1); - let x = bind(&b, "static", INT); - let n = bind(&b, "n", INT); - let z = bind(&b, "z", INT); - let capture = bind(&b, "capture", INT); - let body = b.if_( - b.builtin( - F::EqualsInteger, - &[b.var(n.name, INT), b.int(0)], - Ty::Const(&ConstTy::Bool), - ), - b.builtin( - F::AddInteger, - &[b.var(x.name, INT), b.var(capture.name, INT)], - INT, - ), - call( - &b, - f, - &[ - b.var(x.name, INT), - b.builtin(F::SubtractInteger, &[b.var(n.name, INT), b.int(1)], INT), - ], - ), - ); - let member = RecBinder { - static_params: &[0], - ..def(&b, f, &[x, n], body) - }; - let group = b.let_rec( - &[member, def(&b, dead, &[z], b.error(INT))], - call(&b, f, &[b.int(40), b.int(3)]), - ); - let after = dead_code::prune_recursive(&b, group); - let CoreKind::LetRec { - binders: [kept], .. - } = after.kind - else { - panic!("singleton"); - }; - assert!(std::ptr::eq(kept.params, member.params)); - assert_eq!(kept.static_params, &[0]); - assert_eq!(kept.binder.ty, member.binder.ty); - check( - "singleton_metadata", - &b, - b.let_(capture, b.int(2), group), - 1, - false, - ); -} -#[test] -fn reachable_failure_stays() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "f", 1); - let x = bind(&b, "x", INT); - let root = b.let_rec( - &[def(&b, f, &[x], trace(&b, "failure", b.error(INT)))], - call(&b, f, &[b.int(42)]), - ); - assert!(std::ptr::eq(root, dead_code::prune_recursive(&b, root))); - check("reachable_failure", &b, root, 1, true); -} -#[test] -fn delayed_workers_and_nested_groups() { - let a = Arena::new(); - let b = Builder::new(&a); - let value = b.delay(b.int(42)); - let worker = bind(&b, "worker", value.ty); - let member = def( - &b, - worker, - &[], - b.delay(b.if_( - b.lit(Constant::bool(&a, true)), - b.int(42), - b.force(b.var(worker.name, worker.ty), INT), - )), - ); - check( - "unused_delayed_worker", - &b, - b.let_rec(&[member], b.int(7)), - 0, - false, - ); - check( - "live_delayed_worker", - &b, - b.let_rec(&[member], b.force(b.var(worker.name, worker.ty), INT)), - 1, - false, - ); - let f = function(&b, "outer", 1); - let g = function(&b, "inner", 1); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let inner = b.let_rec( - &[def(&b, g, &[y], call(&b, f, &[b.var(y.name, INT)]))], - b.int(42), - ); - let root = b.let_rec(&[def(&b, f, &[x], b.var(x.name, INT))], inner); - check("nested_dead_capture", &b, root, 0, false); -} -#[test] -fn unsupported_recursive_values_stay_rejected() { - let a = Arena::new(); - let b = Builder::new(&a); - let value = bind(&b, "value", INT); - let root = b.let_rec(&[def(&b, value, &[], b.error(INT))], b.int(42)); - let after = dead_code::prune_recursive(&b, root); - assert!(std::ptr::eq(root, after)); - assert_eq!( - crate::recursion::rewrite(&b, after).unwrap_err(), - crate::recursion::Error::RecursiveValue - ); -} -#[test] -fn reachable_mutual_cycle_survives() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "f", 1); - let g = function(&b, "g", 1); - let dead = function(&b, "dead", 1); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let z = bind(&b, "z", INT); - let step = |next, name| { - b.if_( - b.builtin( - F::EqualsInteger, - &[b.var(name, INT), b.int(0)], - Ty::Const(&ConstTy::Bool), - ), - b.int(42), - call( - &b, - next, - &[b.builtin(F::SubtractInteger, &[b.var(name, INT), b.int(1)], INT)], - ), - ) - }; - let root = b.let_rec( - &[ - def(&b, f, &[x], step(g, x.name)), - def(&b, dead, &[z], b.error(INT)), - def(&b, g, &[y], step(f, y.name)), - ], - call(&b, f, &[b.int(4)]), - ); - check("live_mutual_cycle", &b, root, 2, false); -} -#[test] -fn cold_and_nested_references_remain_live() { - let a = Arena::new(); - let b = Builder::new(&a); - let f = function(&b, "outer", 1); - let g = function(&b, "inner", 1); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let outer = def(&b, f, &[x], b.var(x.name, INT)); - let inner = b.let_rec( - &[def(&b, g, &[y], call(&b, f, &[b.var(y.name, INT)]))], - call(&b, g, &[b.int(42)]), - ); - check( - "nested_live_capture", - &b, - b.let_rec(&[outer], inner), - 2, - false, - ); - let cold = b.let_rec( - &[def(&b, f, &[x], b.error(INT))], - b.if_( - b.lit(Constant::bool(&a, true)), - b.int(42), - call(&b, f, &[b.int(0)]), - ), - ); - assert!(std::ptr::eq(cold, dead_code::prune_recursive(&b, cold))); - check("cold_reference", &b, cold, 1, false); -} - -#[test] -fn accepted_cleanup_releases_dead_captures_but_preserves_effects() { - let a = Arena::new(); - let b = Builder::new(&a); - for (name, captured, suspended) in [ - ("cleanup_dead_delay_capture", b.delay(b.error(INT)), true), - ("cleanup_strict_capture", trace(&b, "kept", b.int(7)), false), - ] { - let capture = bind(&b, "capture", captured.ty); - let f = function(&b, "dead", 1); - let x = bind(&b, "x", INT); - let value = b.var(capture.name, capture.ty); - let read = if suspended { - b.force(value, INT) - } else { - value - }; - let body = b.builtin(F::AddInteger, &[read, read], INT); - let root = b.let_( - capture, - captured, - b.let_rec(&[def(&b, f, &[x], body)], b.int(42)), - ); - let before = nash_ir::anf::normalize(&b, root); - let after = nash_ir::small_inline::simplify(&b, before); - assert_eq!(count(after), 0); - if suspended { - assert!(matches!(after.kind, CoreKind::Lit(_))); - } - assert_eq!(before.ty, after.ty); - nash_ir::anf::validate(after).unwrap(); - hygiene::validate(after, &[]).unwrap(); - assert!(std::ptr::eq( - after, - nash_ir::small_inline::simplify(&b, after) - )); - let baseline = - crate::harness::eval_core_raw(&a, crate::recursion::rewrite(&b, before).unwrap()); - let candidate = - crate::harness::eval_core_raw(&a, crate::recursion::rewrite(&b, after).unwrap()); - assert_eq!(baseline.observable, candidate.observable); - assert_eq!(baseline.logs, candidate.logs); - - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- core after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - pretty(after), - candidate.result, - candidate.logs - ) - ) - ); - } -} diff --git a/crates/nash-codegen/src/optimizer_tests/force_delay.rs b/crates/nash-codegen/src/optimizer_tests/force_delay.rs index 8360815c..136f02a2 100644 --- a/crates/nash-codegen/src/optimizer_tests/force_delay.rs +++ b/crates/nash-codegen/src/optimizer_tests/force_delay.rs @@ -14,8 +14,6 @@ fn trace<'a>(b: &Builder<'a>, s: &'a str, x: &'a Core<'a>) -> &'a Core<'a> { fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, fails: bool) { let after = force_delay::reduce(b, before); - hygiene::validate(after, &[]).unwrap(); - let left = crate::harness::eval_core_raw(b.arena, before); let right = crate::harness::eval_core_raw(b.arena, after); @@ -36,6 +34,7 @@ fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, fails: bool) { ) ) ); + hygiene::validate(after, &[]).unwrap(); // Properties independent of the expected snapshot. assert_eq!(before.ty, after.ty); assert!(std::ptr::eq(after, force_delay::reduce(b, after))); @@ -104,11 +103,11 @@ fn reverse_pair_and_invalid_force_remain() { let a = Arena::new(); let b = Builder::new(&a); let invalid = b.force(b.int(42), INT); - assert!(std::ptr::eq(invalid, force_delay::reduce(&b, invalid))); check("invalid_force", &b, invalid, true); + assert!(std::ptr::eq(invalid, force_delay::reduce(&b, invalid))); let suspended = b.delay(invalid); - assert!(std::ptr::eq(suspended, force_delay::reduce(&b, suspended))); check("reverse_pair", &b, suspended, false); + assert!(std::ptr::eq(suspended, force_delay::reduce(&b, suspended))); } #[test] fn outer_type_view_is_retained() { @@ -138,8 +137,8 @@ fn exposed_let_body_needs_cleanup_but_not_another_anf_pass() { b.force(b.delay(delayed_body), INT), b.builtin(F::AddInteger, &[b.var(y.name, INT), b.int(21)], INT), ); - nash_ir::anf::validate(root).unwrap(); check("exposed_let", &b, root, false); + nash_ir::anf::validate(root).unwrap(); let after = nash_ir::small_inline::simplify(&b, root); nash_ir::anf::validate(after).unwrap(); let before_result = crate::harness::eval_core_raw(&a, root); diff --git a/crates/nash-codegen/src/optimizer_tests/inverse.rs b/crates/nash-codegen/src/optimizer_tests/inverse.rs new file mode 100644 index 00000000..18e74de5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/inverse.rs @@ -0,0 +1,148 @@ +//! Representation cancellation: isolated and complete O1 semantic evidence. +use nash_ir::{ + build::Builder, + core::*, + hygiene, inverse, + pretty::pretty, + ty::{ConstTy, Ty}, +}; +use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; +const INT: Ty<'static> = Ty::Const(&ConstTy::Int); +fn trace<'a>(b: &Builder<'a>, s: &'a str, x: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, s)), x) +} +fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, fails: bool) { + let after = inverse::reduce(b, before); + + let fixture = crate::harness::prepare_fixture(b.arena, before); + let left = &fixture.evaluated; + let right = crate::harness::eval_core_raw(b.arena, after); + + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + format!( + "{}\n--- isolated pass\n{}", + fixture.code_snapshot(), + format!( + "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + left.uplc, + pretty(after), + right.uplc, + right.result, + right.logs + ) + ) + ); + fixture.assert_equivalent(b.arena); + hygiene::validate(after, &[]).unwrap(); + // Properties independent of the expected snapshot. + assert_eq!(before.ty, after.ty); + assert!(std::ptr::eq(after, inverse::reduce(b, after))); + assert_eq!(left.observable, right.observable); + assert_eq!(left.logs, right.logs); +} + +#[test] +fn direct_integer_roundtrips() { + let a = Arena::new(); + let b = Builder::new(&a); + let data = nash_ir::ty::Ty::Big(&nash_ir::ty::BigTy::Data); + let wrap = |x| b.builtin(F::UnIData, &[b.builtin(F::IData, &[x], data)], INT); + for (name, value, fails) in [ + ("literal", b.int(42), false), + ("negative", b.int(-42), false), + ("trace", trace(&b, "before", b.int(42)), false), + ("wrong_kind", b.lit(Constant::bool(&a, true)), true), + ( + "forged_metadata", + b.with_type(b.lit(Constant::bool(&a, true)), INT), + true, + ), + ("failure", trace(&b, "before failure", b.error(INT)), true), + ] { + check(name, &b, wrap(value), fails); + } + let encoded = b.lit(Constant::data( + &a, + nash_plutus::data::PlutusData::integer_from(&a, 42), + )); + check( + "decoded", + &b, + wrap(b.builtin(F::UnIData, &[encoded], INT)), + false, + ); + check( + "decode_failure", + &b, + wrap(b.builtin(F::UnIData, &[b.int(1)], INT)), + true, + ); + check( + "reverse_valid", + &b, + b.builtin(F::IData, &[b.builtin(F::UnIData, &[encoded], INT)], data), + false, + ); + check( + "reverse_invalid", + &b, + b.builtin(F::IData, &[b.builtin(F::UnIData, &[b.int(1)], INT)], data), + true, + ); + check("nested", &b, wrap(wrap(b.int(42))), false); + let p = Binder { + name: b.fresh("x"), + ty: INT, + }; + check( + "unknown_valid", + &b, + b.app(b.lam(&[p], wrap(b.var(p.name, INT))), &[b.int(42)], INT), + false, + ); + check( + "unknown_invalid", + &b, + b.app( + b.lam(&[p], wrap(b.var(p.name, INT))), + &[b.lit(Constant::bool(&a, true))], + INT, + ), + true, + ); + check( + "cold", + &b, + b.if_( + b.lit(Constant::bool(&a, true)), + b.int(7), + wrap(trace(&b, "cold", b.int(42))), + ), + false, + ); + check( + "partial", + &b, + b.app( + b.builtin(F::UnIData, &[], nash_ir::ty::Ty::Erased), + &[b.builtin(F::IData, &[b.int(42)], data)], + INT, + ), + false, + ); +} + +#[path = "../../tests/support/inverse.rs"] +mod inputs; + +#[test] +fn representation_roundtrips() { + let arena = Arena::new(); + let b = Builder::new(&arena); + for (name, core, fails) in inputs::cases(&b) { + check(&format!("representation_{name}"), &b, core, fails); + } +} diff --git a/crates/nash-codegen/src/optimizer_tests/known_bool.rs b/crates/nash-codegen/src/optimizer_tests/known_bool.rs deleted file mode 100644 index b60a85f9..00000000 --- a/crates/nash-codegen/src/optimizer_tests/known_bool.rs +++ /dev/null @@ -1,225 +0,0 @@ -//! Known Boolean case semantics, independent of the accepted pipeline. -use nash_ir::{ - build::Builder, - core::*, - hygiene, known_case, - pretty::pretty, - ty::{ConstTy, Ty}, -}; -use nash_plutus::{arena::Arena, constant::Constant}; -const INT: Ty<'static> = Ty::Const(&ConstTy::Int); -fn trace<'a>(b: &Builder<'a>, s: &'a str, x: &'a Core<'a>) -> &'a Core<'a> { - b.trace(b.lit(Constant::string(b.arena, s)), x) -} -fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, fails: bool) { - let after = known_case::reduce_bool(b, before); - - hygiene::validate(after, &[]).unwrap(); - let left = crate::harness::eval_core_raw(b.arena, before); - let right = crate::harness::eval_core_raw(b.arena, after); - - assert_eq!(right.result.starts_with("error:"), fails); - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - left.uplc, - pretty(after), - right.uplc, - right.result, - right.logs - ) - ) - ); - // Properties independent of the expected snapshot. - assert_eq!(before.ty, after.ty); - assert_eq!(left.observable, right.observable); - assert_eq!(left.logs, right.logs); -} -#[test] -fn known_true_false_and_unselected_effects() { - let a = Arena::new(); - let b = Builder::new(&a); - for (value, name) in [(true, "true"), (false, "false")] { - let good = trace(&b, "chosen", b.int(42)); - let bad = trace(&b, "wrong", b.error(INT)); - check( - name, - &b, - b.if_( - b.lit(Constant::bool(&a, value)), - if value { good } else { bad }, - if value { bad } else { good }, - ), - false, - ); - } - check( - "chosen_failure", - &b, - b.if_( - b.lit(Constant::bool(&a, true)), - trace(&b, "chosen", b.error(INT)), - b.int(42), - ), - true, - ); -} -#[test] -fn defaults_missing_matches_and_reversed_order() { - let a = Arena::new(); - let b = Builder::new(&a); - let bs = [Branch { - test: Test::False, - binders: &[], - body: b.int(0), - }]; - let yes = b.lit(Constant::bool(&a, true)); - check( - "default", - &b, - b.case(CaseKind::Bool, yes, &bs, Some(b.int(42)), INT), - false, - ); - let missing = b.case(CaseKind::Bool, yes, &bs, None, INT); - assert!(std::ptr::eq(missing, known_case::reduce_bool(&b, missing))); - check("missing", &b, missing, true); - check( - "reversed", - &b, - b.case( - CaseKind::Bool, - yes, - &[ - bs[0], - Branch { - test: Test::True, - binders: &[], - body: b.int(42), - }, - ], - Some(b.error(INT)), - INT, - ), - false, - ); -} -#[test] -fn earlier_strict_work_remains_and_effectful_subject_is_not_folded() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = Binder { - name: b.fresh("ignored"), - ty: INT, - }; - let c = b.if_(b.lit(Constant::bool(&a, true)), b.int(42), b.error(INT)); - check( - "strict_trace", - &b, - b.let_(x, trace(&b, "before", b.int(0)), c), - false, - ); - check("strict_failure", &b, b.let_(x, b.error(INT), c), true); - let c = b.if_( - trace(&b, "subject", b.lit(Constant::bool(&a, true))), - b.int(42), - b.error(INT), - ); - assert!(std::ptr::eq(c, known_case::reduce_bool(&b, c))); - check("effectful_subject", &b, c, false); -} -#[test] -fn returned_functions_delays_and_nested_cases() { - let a = Arena::new(); - let b = Builder::new(&a); - let yes = b.lit(Constant::bool(&a, true)); - let p = Binder { - name: b.fresh("p"), - ty: INT, - }; - let f = b.lam(&[p], trace(&b, "called", b.var(p.name, p.ty))); - check( - "returned_function", - &b, - b.app(b.if_(yes, f, b.error(f.ty)), &[b.int(42)], INT), - false, - ); - let d = b.delay(trace(&b, "forced", b.int(42))); - check( - "returned_delay", - &b, - b.force(b.if_(yes, d, b.error(d.ty)), INT), - false, - ); - check( - "nested", - &b, - b.if_( - b.if_(yes, yes, b.lit(Constant::bool(&a, false))), - b.int(42), - b.error(INT), - ), - false, - ); -} -#[test] -fn malformed_boolean_tables_are_not_hidden() { - let a = Arena::new(); - let b = Builder::new(&a); - let p = Binder { - name: b.fresh("field"), - ty: INT, - }; - let yes = b.lit(Constant::bool(&a, true)); - for (name, bs) in [ - ( - "duplicate", - vec![ - Branch { - test: Test::True, - binders: &[], - body: b.int(42), - }, - Branch { - test: Test::True, - binders: &[], - body: b.int(0), - }, - ], - ), - ( - "wrong_test", - vec![Branch { - test: Test::Nil, - binders: &[], - body: b.int(42), - }], - ), - ( - "fields", - vec![Branch { - test: Test::True, - binders: b.arena.alloc_slice_copy(&[p]), - body: b.int(42), - }], - ), - ] { - let root = b.case(CaseKind::Bool, yes, &bs, None, INT); - let after = known_case::reduce_bool(&b, root); - assert!(std::ptr::eq(root, after)); - let left = crate::lower::lower(&a, root).unwrap_err(); - let right = crate::lower::lower(&a, after).unwrap_err(); - insta::assert_snapshot!( - name, - format!( - "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", - pretty(root), - pretty(after) - ) - ); - } -} diff --git a/crates/nash-codegen/src/optimizer_tests/known_case.rs b/crates/nash-codegen/src/optimizer_tests/known_case.rs new file mode 100644 index 00000000..bc9013bf --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/known_case.rs @@ -0,0 +1,3163 @@ +//! Known-case folding semantics with accepted-pipeline and isolated-pass evidence. + +mod boolean { + //! Known Boolean case semantics, independent of the accepted pipeline. + use nash_ir::{ + build::Builder, + core::*, + hygiene, known_case, + pretty::pretty, + ty::{ConstTy, Ty}, + }; + use nash_plutus::{arena::Arena, constant::Constant}; + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + fn trace<'a>(b: &Builder<'a>, s: &'a str, x: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, s)), x) + } + fn check<'a>(name: &str, b: &Builder<'a>, before: &'a Core<'a>, fails: bool) -> &'a Core<'a> { + let after = known_case::reduce_bool(b, before); + + let left = crate::harness::eval_core_raw(b.arena, before); + let right = crate::harness::eval_core_raw(b.arena, after); + + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + left.uplc, + pretty(after), + right.uplc, + right.result, + right.logs + ) + ) + ); + hygiene::validate(after, &[]).unwrap(); + // Properties independent of the expected snapshot. + assert_eq!(before.ty, after.ty); + assert_eq!(left.observable, right.observable); + assert_eq!(left.logs, right.logs); + after + } + #[test] + fn known_true_false_and_unselected_effects() { + let a = Arena::new(); + let b = Builder::new(&a); + for (value, name) in [(true, "true"), (false, "false")] { + let good = trace(&b, "chosen", b.int(42)); + let bad = trace(&b, "wrong", b.error(INT)); + check( + name, + &b, + b.if_( + b.lit(Constant::bool(&a, value)), + if value { good } else { bad }, + if value { bad } else { good }, + ), + false, + ); + } + check( + "chosen_failure", + &b, + b.if_( + b.lit(Constant::bool(&a, true)), + trace(&b, "chosen", b.error(INT)), + b.int(42), + ), + true, + ); + } + #[test] + fn defaults_missing_matches_and_reversed_order() { + let a = Arena::new(); + let b = Builder::new(&a); + let bs = [Branch { + test: Test::False, + binders: &[], + body: b.int(0), + }]; + let yes = b.lit(Constant::bool(&a, true)); + check( + "default", + &b, + b.case(CaseKind::Bool, yes, &bs, Some(b.int(42)), INT), + false, + ); + let missing = b.case(CaseKind::Bool, yes, &bs, None, INT); + let after = check("missing", &b, missing, true); + assert!(std::ptr::eq(missing, after)); + check( + "reversed", + &b, + b.case( + CaseKind::Bool, + yes, + &[ + bs[0], + Branch { + test: Test::True, + binders: &[], + body: b.int(42), + }, + ], + Some(b.error(INT)), + INT, + ), + false, + ); + } + #[test] + fn earlier_strict_work_remains_and_effectful_subject_is_not_folded() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = Binder { + name: b.fresh("ignored"), + ty: INT, + }; + let c = b.if_(b.lit(Constant::bool(&a, true)), b.int(42), b.error(INT)); + check( + "strict_trace", + &b, + b.let_(x, trace(&b, "before", b.int(0)), c), + false, + ); + check("strict_failure", &b, b.let_(x, b.error(INT), c), true); + let c = b.if_( + trace(&b, "subject", b.lit(Constant::bool(&a, true))), + b.int(42), + b.error(INT), + ); + let after = check("effectful_subject", &b, c, false); + assert!(std::ptr::eq(c, after)); + } + #[test] + fn returned_functions_delays_and_nested_cases() { + let a = Arena::new(); + let b = Builder::new(&a); + let yes = b.lit(Constant::bool(&a, true)); + let p = Binder { + name: b.fresh("p"), + ty: INT, + }; + let f = b.lam(&[p], trace(&b, "called", b.var(p.name, p.ty))); + check( + "returned_function", + &b, + b.app(b.if_(yes, f, b.error(f.ty)), &[b.int(42)], INT), + false, + ); + let d = b.delay(trace(&b, "forced", b.int(42))); + check( + "returned_delay", + &b, + b.force(b.if_(yes, d, b.error(d.ty)), INT), + false, + ); + check( + "nested", + &b, + b.if_( + b.if_(yes, yes, b.lit(Constant::bool(&a, false))), + b.int(42), + b.error(INT), + ), + false, + ); + } + #[test] + fn malformed_boolean_tables_are_not_hidden() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = Binder { + name: b.fresh("field"), + ty: INT, + }; + let yes = b.lit(Constant::bool(&a, true)); + for (name, bs) in [ + ( + "duplicate", + vec![ + Branch { + test: Test::True, + binders: &[], + body: b.int(42), + }, + Branch { + test: Test::True, + binders: &[], + body: b.int(0), + }, + ], + ), + ( + "wrong_test", + vec![Branch { + test: Test::Nil, + binders: &[], + body: b.int(42), + }], + ), + ( + "fields", + vec![Branch { + test: Test::True, + binders: b.arena.alloc_slice_copy(&[p]), + body: b.int(42), + }], + ), + ] { + let root = b.case(CaseKind::Bool, yes, &bs, None, INT); + let after = known_case::reduce_bool(&b, root); + let left = crate::lower::lower(&a, root).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + name, + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(root), + pretty(after) + ) + ); + assert!(std::ptr::eq(root, after)); + } + } +} + +mod constructor { + //! Direct native-constructor case folding, including isolated-pass evidence. + use nash_ir::{ + build::Builder, + core::*, + hygiene, known_case, + pretty::pretty, + ty::{ConstTy, RuntimeTy, Ty}, + }; + use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; + + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + fn bind<'a>(b: &Builder<'a>, label: &'a str) -> Binder<'a> { + Binder { + name: b.fresh(label), + ty: INT, + } + } + fn trace<'a>(b: &Builder<'a>, label: &'a str, value: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, label)), value) + } + fn constr<'a>(b: &Builder<'a>, tag: u16, fields: &[&'a Core<'a>]) -> &'a Core<'a> { + let types: Vec<_> = fields.iter().map(|f| f.ty).collect(); + let ty = Ty::Runtime(b.arena.alloc(RuntimeTy::Constr { + tag, + fields: b.arena.alloc_slice_copy(&types), + })); + b.constr(tag, fields, ty) + } + fn arm<'a>( + b: &Builder<'a>, + tag: u16, + binders: &[Binder<'a>], + body: &'a Core<'a>, + ) -> Branch<'a> { + Branch { + test: Test::Tag(tag), + binders: b.arena.alloc_slice_copy(binders), + body, + } + } + fn check<'a>(name: &str, b: &Builder<'a>, before: &'a Core<'a>, fails: bool) -> &'a Core<'a> { + let after = known_case::reduce_constr(b, before); + let left = crate::harness::eval_core_raw(b.arena, before); + let right = crate::harness::eval_core_raw(b.arena, after); + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + left.uplc, + pretty(after), + right.uplc, + right.result, + right.logs + ) + ) + ); + hygiene::validate(before, &[]).unwrap(); + hygiene::validate(after, &[]).unwrap(); + assert_eq!(before.ty, after.ty); + assert_eq!(left.observable, right.observable); + assert_eq!(left.logs, right.logs); + assert!(std::ptr::eq(after, known_case::reduce_constr(b, after))); + after + } + #[test] + fn selects_tag_with_fields_in_source_order() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "x"); + let y = bind(&b, "y"); + let body = trace( + &b, + "body", + b.builtin( + F::SubtractInteger, + &[b.var(x.name, INT), b.var(y.name, INT)], + INT, + ), + ); + let arms = [ + arm(&b, 1, &[x, y], body), + arm(&b, 0, &[], trace(&b, "cold", b.error(INT))), + ]; + check( + "field_order", + &b, + b.case( + CaseKind::Tag, + constr( + &b, + 1, + &[trace(&b, "first", b.int(50)), trace(&b, "second", b.int(8))], + ), + &arms, + None, + INT, + ), + false, + ); + } + + #[test] + fn nullary_and_expanded_wildcard_branches() { + let a = Arena::new(); + let b = Builder::new(&a); + for (tag, name) in [ + (0, "nullary"), + (1, "wildcard_one_field"), + (2, "wildcard_two_fields"), + ] { + let x = bind(&b, "ignored"); + let y = bind(&b, "ignored"); + let z = bind(&b, "ignored"); + let arms = [ + arm(&b, 0, &[], b.int(42)), + arm(&b, 1, &[x], b.int(42)), + arm(&b, 2, &[y, z], b.int(42)), + ]; + let fields: Vec<_> = (0..tag).map(|_| trace(&b, "field", b.int(0))).collect(); + check( + name, + &b, + b.case(CaseKind::Tag, constr(&b, tag, &fields), &arms, None, INT), + false, + ); + } + } + + #[test] + fn ignored_failing_field_still_fails_before_later_fields_and_body() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "ignored"); + let y = bind(&b, "ignored"); + check( + "ignored_failure", + &b, + b.case( + CaseKind::Tag, + constr( + &b, + 0, + &[ + trace(&b, "first", b.error(INT)), + trace(&b, "second", b.int(0)), + ], + ), + &[arm(&b, 0, &[x, y], trace(&b, "body", b.int(42)))], + None, + INT, + ), + true, + ); + } + + #[test] + fn returned_function_and_delay_capture_evaluated_fields() { + let a = Arena::new(); + let b = Builder::new(&a); + for (delayed, name) in [(false, "returned_function"), (true, "returned_delay")] { + let x = bind(&b, "x"); + let p = bind(&b, "p"); + let body = trace(&b, "body", b.var(x.name, INT)); + let result = if delayed { + b.delay(body) + } else { + b.lam(&[p], body) + }; + let case = b.case( + CaseKind::Tag, + constr(&b, 0, &[trace(&b, "field", b.int(42))]), + &[arm(&b, 0, &[x], result)], + None, + result.ty, + ); + let invoke = if delayed { + b.force(case, INT) + } else { + b.app(case, &[trace(&b, "argument", b.int(0))], INT) + }; + check(name, &b, invoke, false); + } + } + + #[test] + fn nested_cases_and_cold_construction() { + let a = Arena::new(); + let b = Builder::new(&a); + let inner = b.case( + CaseKind::Tag, + constr(&b, 0, &[]), + &[arm(&b, 0, &[], b.int(42))], + None, + INT, + ); + check( + "nested", + &b, + b.case( + CaseKind::Tag, + constr(&b, 0, &[]), + &[arm(&b, 0, &[], inner)], + None, + INT, + ), + false, + ); + let x = bind(&b, "ignored"); + let cold = b.case( + CaseKind::Tag, + constr(&b, 0, &[trace(&b, "cold", b.error(INT))]), + &[arm(&b, 0, &[x], b.int(0))], + None, + INT, + ); + check( + "cold", + &b, + b.if_(b.lit(Constant::bool(&a, true)), b.int(42), cold), + false, + ); + } + + #[test] + fn unknown_tag_and_arity_mismatch_are_unchanged() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "x"); + let cases = [ + ( + "unknown_tag", + constr(&b, 1, &[trace(&b, "field", b.int(0))]), + arm(&b, 0, &[], b.int(42)), + ), + ( + "extra_field", + constr(&b, 0, &[b.int(0)]), + arm(&b, 0, &[], b.int(42)), + ), + ]; + for (name, subject, branch) in cases { + let c = b.case(CaseKind::Tag, subject, &[branch], None, INT); + let after = check(name, &b, c, true); + assert!(std::ptr::eq(c, after)); + } + // Too few fields returns a lambda in UPLC; explicitly apply it for evaluation. + let c = b.case( + CaseKind::Tag, + constr(&b, 0, &[]), + &[arm(&b, 0, &[x], b.var(x.name, INT))], + None, + b.lam(&[x], b.var(x.name, INT)).ty, + ); + let root = b.app(c, &[b.int(42)], INT); + let after = check("missing_field", &b, root, false); + assert!(std::ptr::eq(root, after)); + } + + #[test] + fn invalid_tables_remain_lowering_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + let good = arm(&b, 0, &[], b.int(42)); + for (name, branches, default) in [ + ("sparse", vec![arm(&b, 59, &[], b.int(42))], None), + ("duplicate", vec![good, good], None), + ( + "wrong_test", + vec![Branch { + test: Test::True, + ..good + }], + None, + ), + ("unexpanded_default", vec![good], Some(b.int(0))), + ] { + let c = b.case(CaseKind::Tag, constr(&b, 0, &[]), &branches, default, INT); + let after = known_case::reduce_constr(&b, c); + let left = crate::lower::lower(&a, c).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + name, + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(c), + pretty(after) + ) + ); + assert!(std::ptr::eq(c, after)); + } + } + + #[test] + fn empty_table_and_effectful_subject_are_unchanged() { + let a = Arena::new(); + let b = Builder::new(&a); + let empty = b.case(CaseKind::Tag, constr(&b, 0, &[]), &[], None, INT); + let after = check("empty_table", &b, empty, true); + assert!(std::ptr::eq(empty, after)); + let subject = trace(&b, "subject", constr(&b, 0, &[])); + let c = b.case( + CaseKind::Tag, + subject, + &[arm(&b, 0, &[], b.int(42))], + None, + INT, + ); + let after = check("effectful_subject", &b, c, false); + assert!(std::ptr::eq(c, after)); + } + + // Retain isolated evidence for bound-constructor folding and its cleanup. + fn check_bound(name: &str, b: &Builder<'_>, original: &Core<'_>, fails: bool) { + let before = nash_ir::anf::normalize(b, original); + let folded = known_case::reduce_bound_constr(b, before); + let after = nash_ir::small_inline::simplify(b, folded); + let after = known_case::simplify_bound_constr(b, after); + let left = crate::harness::eval_core_raw(b.arena, before); + let middle = crate::harness::eval_core_raw(b.arena, folded); + let right = crate::harness::eval_core_raw(b.arena, after); + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + original, + format!( + "--- isolated ANF input\n{}\n--- isolated folded Core\n{}\n--- isolated cleaned Core\n{}\n--- isolated UPLC before\n{}\n--- isolated UPLC after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + pretty(folded), + pretty(after), + left.uplc, + right.uplc, + right.result, + right.logs + ) + ) + ); + for candidate in [before, folded, after] { + hygiene::validate(candidate, &[]).unwrap(); + assert_eq!(original.ty, candidate.ty); + } + for result in [middle, right] { + assert_eq!(left.observable, result.observable); + assert_eq!(left.logs, result.logs); + } + nash_ir::anf::validate(before).unwrap(); + nash_ir::anf::validate(after).unwrap(); + } + + fn bound_subject<'a>(b: &Builder<'a>, value: &'a Core<'a>) -> Binder<'a> { + Binder { + name: b.fresh("subject"), + ty: value.ty, + } + } + + #[test] + fn bound_aliases_repeated_matches_and_escaping_value() { + let a = Arena::new(); + let b = Builder::new(&a); + for (escape, name) in [(false, "bound_alias_repeated"), (true, "bound_escape")] { + let value = constr(&b, 0, &[trace(&b, "field", b.int(21))]); + let subject = bound_subject(&b, value); + let alias = bound_subject(&b, value); + let alias2 = bound_subject(&b, value); + let x = bind(&b, "x"); + let y = bind(&b, "y"); + let first = bind(&b, "first"); + let second = bind(&b, "second"); + let [match_first, match_second] = [(alias2, x), (subject, y)].map(|(s, field)| { + b.case( + CaseKind::Tag, + b.var(s.name, s.ty), + &[arm(&b, 0, &[field], b.var(field.name, field.ty))], + None, + INT, + ) + }); + let sum = b.builtin( + F::AddInteger, + &[b.var(first.name, INT), b.var(second.name, INT)], + INT, + ); + let result = if escape { + constr(&b, 0, &[b.var(subject.name, subject.ty), sum]) + } else { + sum + }; + let body = b.let_(first, match_first, b.let_(second, match_second, result)); + let original = b.let_( + subject, + value, + b.let_( + alias, + b.var(subject.name, subject.ty), + b.let_(alias2, b.var(alias.name, alias.ty), body), + ), + ); + check_bound(name, &b, original, false); + } + } + + #[test] + fn bound_fields_remain_strict_before_cold_match() { + let a = Arena::new(); + let b = Builder::new(&a); + for (fail, name) in [ + (false, "bound_cold_fields"), + (true, "bound_ignored_failure"), + ] { + let value = constr( + &b, + 0, + &[ + trace(&b, "first", if fail { b.error(INT) } else { b.int(7) }), + trace(&b, "second", b.int(8)), + ], + ); + let subject = bound_subject(&b, value); + let x = bind(&b, "ignored"); + let y = bind(&b, "ignored"); + let matched = b.case( + CaseKind::Tag, + b.var(subject.name, subject.ty), + &[arm(&b, 0, &[x, y], trace(&b, "cold", b.int(0)))], + None, + INT, + ); + let body = b.if_( + b.lit(Constant::bool(&a, false)), + matched, + trace(&b, "chosen", b.int(42)), + ); + check_bound(name, &b, b.let_(subject, value, body), fail); + } + } + + #[test] + fn bound_function_and_delay_fields_are_named_once() { + let a = Arena::new(); + let b = Builder::new(&a); + for (delayed, name) in [(false, "bound_function_field"), (true, "bound_delay_field")] { + let p = bind(&b, "parameter"); + let field = if delayed { + // Include an internal binder even in the delay. + b.delay(b.let_(p, b.int(21), trace(&b, "called", b.var(p.name, INT)))) + } else { + b.lam(&[p], trace(&b, "called", b.var(p.name, INT))) + }; + let value = constr(&b, 0, &[field]); + let subject = bound_subject(&b, value); + let x = Binder { + name: b.fresh("x"), + ty: field.ty, + }; + let y = Binder { + name: b.fresh("y"), + ty: field.ty, + }; + let matches = [x, y].map(|field| { + let invoke = if delayed { + b.force(b.var(field.name, field.ty), INT) + } else { + b.app(b.var(field.name, field.ty), &[b.int(21)], INT) + }; + b.case( + CaseKind::Tag, + b.var(subject.name, subject.ty), + &[arm(&b, 0, &[field], invoke)], + None, + INT, + ) + }); + let body = b.builtin(F::AddInteger, &matches, INT); + check_bound(name, &b, b.let_(subject, value, body), false); + } + } + + #[test] + fn bound_constructor_captured_by_function_and_delay() { + let a = Arena::new(); + let b = Builder::new(&a); + for (delayed, name) in [ + (false, "bound_function_capture"), + (true, "bound_delay_capture"), + ] { + let value = constr(&b, 0, &[trace(&b, "field", b.int(42))]); + let subject = bound_subject(&b, value); + let x = bind(&b, "x"); + let p = bind(&b, "ignored"); + let matched = b.case( + CaseKind::Tag, + b.var(subject.name, subject.ty), + &[arm(&b, 0, &[x], b.var(x.name, INT))], + None, + INT, + ); + let body = if delayed { + b.force(b.delay(matched), INT) + } else { + b.app(b.lam(&[p], matched), &[b.int(0)], INT) + }; + check_bound(name, &b, b.let_(subject, value, body), false); + } + } + + #[test] + fn bound_nullary_reordered_and_missing_tags() { + let a = Arena::new(); + let b = Builder::new(&a); + for (tag, name, fails) in [ + (0, "bound_nullary", false), + (1, "bound_reordered", false), + (2, "bound_missing_tag", true), + ] { + let value = constr(&b, tag, &[]); + let subject = bound_subject(&b, value); + let matched = b.case( + CaseKind::Tag, + b.var(subject.name, subject.ty), + &[arm(&b, 1, &[], b.int(42)), arm(&b, 0, &[], b.int(21))], + None, + INT, + ); + check_bound(name, &b, b.let_(subject, value, matched), fails); + } + } + + #[test] + fn bound_invalid_tables_are_unchanged() { + let a = Arena::new(); + let b = Builder::new(&a); + let good = arm(&b, 0, &[], b.int(42)); + for (name, branches, default) in [ + ("bound_sparse", vec![arm(&b, 59, &[], b.int(42))], None), + ("bound_duplicate", vec![good, good], None), + ( + "bound_wrong_test", + vec![Branch { + test: Test::True, + ..good + }], + None, + ), + ("bound_default", vec![good], Some(b.int(0))), + ] { + let value = constr(&b, 0, &[]); + let subject = bound_subject(&b, value); + let before = b.let_( + subject, + value, + b.case( + CaseKind::Tag, + b.var(subject.name, subject.ty), + &branches, + default, + INT, + ), + ); + let after = known_case::reduce_bound_constr(&b, before); + let left = crate::lower::lower(&a, before).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + name, + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(before), + pretty(after) + ) + ); + assert!(std::ptr::eq(before, after)); + } + } + + #[test] + fn bound_nested_constructor_facts_exposed_by_cleanup() { + let a = Arena::new(); + let b = Builder::new(&a); + let inner = constr(&b, 0, &[trace(&b, "field", b.int(42))]); + let inner_name = bound_subject(&b, inner); + let outer = constr(&b, 0, &[b.var(inner_name.name, inner_name.ty)]); + let outer_name = bound_subject(&b, outer); + let selected = bound_subject(&b, inner); + let x = bind(&b, "x"); + let inner_case = b.case( + CaseKind::Tag, + b.var(selected.name, selected.ty), + &[arm(&b, 0, &[x], b.var(x.name, INT))], + None, + INT, + ); + let outer_case = b.case( + CaseKind::Tag, + b.var(outer_name.name, outer_name.ty), + &[arm(&b, 0, &[selected], inner_case)], + None, + INT, + ); + check_bound( + "bound_nested", + &b, + b.let_(inner_name, inner, b.let_(outer_name, outer, outer_case)), + false, + ); + } + + #[test] + fn bound_empty_table_and_arity_mismatch_remain_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + for empty in [false, true] { + let value = constr(&b, 0, &[b.int(21), b.int(22)]); + let subject = bound_subject(&b, value); + let x = bind(&b, "x"); + let branches = [arm(&b, 0, &[x], b.var(x.name, INT))]; + let matched = b.case( + CaseKind::Tag, + b.var(subject.name, subject.ty), + if empty { &[] } else { &branches }, + None, + INT, + ); + check_bound( + if empty { "bound_empty" } else { "bound_arity" }, + &b, + b.let_(subject, value, matched), + true, + ); + } + } + #[test] + fn known_fields_positions_aliases_and_escape() { + for arity in [1, 3, 8] { + for index in 0..arity { + for escape in [false, true] { + let a = Arena::new(); + let b = Builder::new(&a); + let fields: Vec<_> = (0..arity).map(|i| b.int(i.into())).collect(); + let value = constr(&b, 0, &fields); + let subject = bound_subject(&b, value); + let alias = bound_subject(&b, value); + let get = b.field(b.var(alias.name, alias.ty), index, arity, INT); + let output = if escape { + constr(&b, 0, &[get, get, b.var(subject.name, subject.ty)]) + } else { + constr(&b, 0, &[get, get]) + }; + check_bound( + &format!("field_{arity}_{index}_escape_{escape}"), + &b, + b.let_( + subject, + value, + b.let_(alias, b.var(subject.name, subject.ty), output), + ), + false, + ); + } + } + } + } + + #[test] + fn known_fields_preserve_strict_effects() { + for index in 0..3 { + for failure in [false, true] { + let a = Arena::new(); + let b = Builder::new(&a); + let middle = if failure { b.error(INT) } else { b.int(2) }; + let value = constr( + &b, + 0, + &[ + trace(&b, "first", b.int(1)), + trace(&b, "middle", middle), + trace(&b, "last", b.int(3)), + ], + ); + check_bound( + &format!("field_effects_{index}_failure_{failure}"), + &b, + b.field(value, index, 3, INT), + failure, + ); + } + } + } + + #[test] + fn known_fields_preserve_runtime_shape_mismatches() { + let a = Arena::new(); + let b = Builder::new(&a); + check_bound( + "field_nonzero_tag", + &b, + b.field(constr(&b, 1, &[b.int(1)]), 0, 1, INT), + true, + ); + check_bound( + "field_extra_fields", + &b, + b.field(constr(&b, 0, &[b.int(1), b.int(2)]), 0, 1, INT), + true, + ); + let selector = b.field(constr(&b, 0, &[b.int(7)]), 0, 2, Ty::Erased); + check_bound( + "field_missing_field_returns_function", + &b, + b.app(selector, &[b.int(9)], INT), + false, + ); + } + + #[test] + fn known_fields_keep_delay_boundaries() { + for captured in [false, true] { + let a = Arena::new(); + let b = Builder::new(&a); + let value = constr(&b, 0, &[trace(&b, "constructed", b.int(7))]); + let subject = bound_subject(&b, value); + let get = b.field(b.var(subject.name, subject.ty), 0, 1, INT); + let delayed = if captured { + b.delay(get) + } else { + b.delay(b.let_(subject, value, get)) + }; + let thunk = bound_subject(&b, delayed); + let calls = constr( + &b, + 0, + &[ + b.force(b.var(thunk.name, thunk.ty), INT), + b.force(b.var(thunk.name, thunk.ty), INT), + ], + ); + let root = b.let_(thunk, delayed, calls); + let root = if captured { + b.let_(subject, value, root) + } else { + root + }; + check_bound(&format!("field_delay_captured_{captured}"), &b, root, false); + } + } + + #[test] + fn known_fields_nested_and_function_values() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "x"); + let fun = b.lam(&[x], trace(&b, "called", b.var(x.name, INT))); + let inner = constr(&b, 0, &[fun]); + let outer = constr(&b, 0, &[inner]); + let selected = b.field(b.field(outer, 0, 1, inner.ty), 0, 1, fun.ty); + let f = bound_subject(&b, selected); + let calls = constr( + &b, + 0, + &[ + b.app(b.var(f.name, f.ty), &[b.int(1)], INT), + b.app(b.var(f.name, f.ty), &[b.int(2)], INT), + ], + ); + check_bound( + "field_nested_function", + &b, + b.let_(f, selected, calls), + false, + ); + } +} + +mod list { + //! Isolated native-list case folding with accepted-pipeline comparisons. + use nash_ir::{ + anf, + build::Builder, + core::*, + hygiene, known_case, + pretty::pretty, + ty::{ConstTy, Ty}, + }; + use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant, typ::Type}; + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + const LIST: Ty<'static> = Ty::Const(&ConstTy::List(INT)); + fn bind<'a>(b: &Builder<'a>, text: &'a str, ty: Ty<'a>) -> Binder<'a> { + Binder { + name: b.fresh(text), + ty, + } + } + fn list<'a>(b: &Builder<'a>, values: &[i128]) -> &'a Core<'a> { + let values: Vec<_> = values + .iter() + .map(|&v| Constant::integer_from(b.arena, v)) + .collect(); + b.lit(Constant::proto_list( + b.arena, + &Type::Integer, + b.arena.alloc_slice_copy(&values), + )) + } + fn trace<'a>(b: &Builder<'a>, label: &'a str, value: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, label)), value) + } + fn arm<'a>( + b: &Builder<'a>, + test: Test<'a>, + binders: &[Binder<'a>], + body: &'a Core<'a>, + ) -> Branch<'a> { + Branch { + test, + binders: b.arena.alloc_slice_copy(binders), + body, + } + } + fn check(name: &str, b: &Builder<'_>, original: &Core<'_>, fails: bool) { + let before = anf::normalize(b, original); + let folded = known_case::reduce_list(b, before); + let after = nash_ir::small_inline::simplify(b, folded); + let after = known_case::simplify_list(b, after); + let left = crate::harness::eval_core_raw(b.arena, before); + let middle = crate::harness::eval_core_raw(b.arena, folded); + let right = crate::harness::eval_core_raw(b.arena, after); + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + original, + format!( + "--- isolated ANF input\n{}\n--- isolated folded Core\n{}\n--- isolated cleaned Core\n{}\n--- isolated UPLC before\n{}\n--- isolated UPLC after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + pretty(folded), + pretty(after), + left.uplc, + right.uplc, + right.result, + right.logs + ) + ) + ); + for core in [before, folded, after] { + hygiene::validate(core, &[]).unwrap(); + assert_eq!(original.ty, core.ty); + } + anf::validate(after).unwrap(); + for actual in [middle, right] { + assert_eq!(left.observable, actual.observable); + assert_eq!(left.logs, actual.logs); + } + assert!(std::ptr::eq(after, known_case::simplify_list(b, after))); + } + #[test] + fn literal_lists_select_nil_cons_and_tail() { + let a = Arena::new(); + let b = Builder::new(&a); + for (values, name) in [ + (&[][..], "empty"), + (&[42][..], "singleton"), + (&[42, 7, 9][..], "nonempty"), + ] { + let head = bind(&b, "head", INT); + let tail = bind(&b, "tail", LIST); + let c = b.case( + CaseKind::List, + list(&b, values), + &[ + arm( + &b, + Test::Cons, + &[head, tail], + trace(&b, "cons", b.var(tail.name, LIST)), + ), + arm(&b, Test::Nil, &[], trace(&b, "nil", list(&b, &[0]))), + ], + None, + LIST, + ); + check(name, &b, c, false); + } + } + #[test] + fn missing_arms_use_fallback_or_fail() { + let a = Arena::new(); + let b = Builder::new(&a); + for (values, name, default) in [ + (&[][..], "empty_default", true), + (&[42][..], "cons_default", true), + (&[][..], "empty_missing", false), + (&[42][..], "cons_missing", false), + ] { + let fallback = default.then(|| trace(&b, "fallback", b.int(42))); + check( + name, + &b, + b.case(CaseKind::List, list(&b, values), &[], fallback, INT), + !default, + ); + } + } + #[test] + fn explicit_arm_wins_over_failing_default() { + let a = Arena::new(); + let b = Builder::new(&a); + let h = bind(&b, "head", INT); + let t = bind(&b, "tail", LIST); + let c = b.case( + CaseKind::List, + list(&b, &[42]), + &[arm(&b, Test::Cons, &[h, t], b.var(h.name, INT))], + Some(trace(&b, "cold", b.error(INT))), + INT, + ); + check("explicit_wins", &b, c, false); + } + #[test] + fn mkcons_preserves_strict_head_tail_and_runtime_checks() { + let a = Arena::new(); + let b = Builder::new(&a); + for (mode, name) in [ + (0, "strict_order"), + (1, "head_failure"), + (2, "tail_failure"), + (3, "wrong_tail"), + (4, "wrong_head_type"), + (5, "function_head"), + (6, "delay_head"), + ] { + let p = bind(&b, "p", INT); + let head = match mode { + 1 => b.error(INT), + 4 => b.lit(Constant::bool(&a, true)), + 5 => b.lam(&[p], b.var(p.name, INT)), + 6 => b.delay(b.let_(p, b.int(42), b.var(p.name, INT))), + _ => b.int(42), + }; + let tail = match mode { + 2 => b.error(LIST), + 3 => b.int(0), + _ => list(&b, &[7]), + }; + let xs = b.builtin( + F::MkCons, + &[ + if mode >= 5 { + head + } else { + trace(&b, "head", head) + }, + trace(&b, "tail", tail), + ], + LIST, + ); + let h = bind(&b, "ignored", INT); + let t = bind(&b, "ignored", LIST); + let c = b.case( + CaseKind::List, + xs, + &[ + arm(&b, Test::Nil, &[], trace(&b, "cold", b.error(INT))), + arm(&b, Test::Cons, &[h, t], trace(&b, "body", b.int(21))), + ], + None, + INT, + ); + check(name, &b, c, mode != 0); + } + } + #[test] + fn aliases_repeated_matches_and_escaping_list() { + let a = Arena::new(); + let b = Builder::new(&a); + for (literal, name) in [(false, "bound_mkcons"), (true, "bound_literal")] { + let value = if literal { + list(&b, &[21, 7]) + } else { + b.builtin( + F::MkCons, + &[trace(&b, "head", b.int(21)), list(&b, &[7])], + LIST, + ) + }; + let xs = bind(&b, "xs", LIST); + let alias = bind(&b, "alias", LIST); + let alias2 = bind(&b, "alias2", LIST); + let cases = [0, 1].map(|_| { + let h = bind(&b, "head", INT); + let t = bind(&b, "tail", LIST); + b.case( + CaseKind::List, + b.var(alias2.name, LIST), + &[arm(&b, Test::Cons, &[h, t], b.var(h.name, INT))], + None, + INT, + ) + }); + let sum = b.builtin(F::AddInteger, &cases, INT); + let body = b.builtin(F::MkCons, &[sum, b.var(xs.name, LIST)], LIST); + check( + name, + &b, + b.let_( + xs, + value, + b.let_( + alias, + b.var(xs.name, LIST), + b.let_(alias2, b.var(alias.name, LIST), body), + ), + ), + false, + ); + } + } + #[test] + fn cold_match_does_not_delay_construction() { + let a = Arena::new(); + let b = Builder::new(&a); + let xs = bind(&b, "xs", LIST); + let value = b.builtin( + F::MkCons, + &[ + trace(&b, "head", b.int(42)), + trace(&b, "tail", list(&b, &[])), + ], + LIST, + ); + let h = bind(&b, "head", INT); + let t = bind(&b, "tail", LIST); + let c = b.case( + CaseKind::List, + b.var(xs.name, LIST), + &[arm( + &b, + Test::Cons, + &[h, t], + trace(&b, "cold", b.var(h.name, INT)), + )], + None, + INT, + ); + check( + "cold_match", + &b, + b.let_( + xs, + value, + b.if_( + b.lit(Constant::bool(&a, false)), + c, + trace(&b, "chosen", b.int(0)), + ), + ), + false, + ); + } + #[test] + fn nested_literal_tail_match_and_delayed_result() { + let a = Arena::new(); + let b = Builder::new(&a); + let h = bind(&b, "head", INT); + let t = bind(&b, "tail", LIST); + let h2 = bind(&b, "head", INT); + let t2 = bind(&b, "tail", LIST); + let inner = b.case( + CaseKind::List, + b.var(t.name, LIST), + &[arm(&b, Test::Cons, &[h2, t2], b.var(h2.name, INT))], + None, + INT, + ); + let delayed = b.delay(inner); + let c = b.case( + CaseKind::List, + list(&b, &[21, 42]), + &[arm(&b, Test::Cons, &[h, t], delayed)], + None, + delayed.ty, + ); + check("nested_tail_delay", &b, b.force(c, INT), false); + } + #[test] + fn unknown_subject_is_unchanged() { + let a = Arena::new(); + let b = Builder::new(&a); + let value = trace(&b, "subject", list(&b, &[])); + let c = b.case( + CaseKind::List, + value, + &[arm(&b, Test::Nil, &[], b.int(42))], + None, + INT, + ); + check("unknown_traced_subject", &b, c, false); + } + #[test] + fn malformed_tables_remain_lowering_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "x", INT); + let nil = arm(&b, Test::Nil, &[], b.int(42)); + let y = bind(&b, "tail", LIST); + let cons = arm(&b, Test::Cons, &[x, y], b.int(42)); + for (name, branches) in [ + ("duplicate_nil", vec![nil, nil]), + ("duplicate_cons", vec![cons, cons]), + ("nil_binder", vec![arm(&b, Test::Nil, &[x], b.int(42))]), + ("cons_arity", vec![arm(&b, Test::Cons, &[x], b.int(42))]), + ("wrong_test", vec![arm(&b, Test::True, &[], b.int(42))]), + ] { + let before = b.case(CaseKind::List, list(&b, &[]), &branches, None, INT); + let after = known_case::reduce_list(&b, before); + let left = crate::lower::lower(&a, before).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + name, + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(before), + pretty(after) + ) + ); + assert!(std::ptr::eq(before, after)); + } + } + + #[test] + fn partial_and_oversaturated_mkcons_are_not_facts() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, subject) in [ + ("partial_cons", b.builtin(F::MkCons, &[b.int(42)], LIST)), + ( + "oversaturated_cons", + b.app( + b.builtin(F::MkCons, &[b.int(42), list(&b, &[])], LIST), + &[b.int(9)], + LIST, + ), + ), + ] { + check( + name, + &b, + b.case(CaseKind::List, subject, &[], Some(b.int(0)), INT), + true, + ); + } + } + #[test] + fn nested_mkcons_tail_enables_second_match() { + let a = Arena::new(); + let b = Builder::new(&a); + let xs = b.builtin( + F::MkCons, + &[ + b.int(21), + b.builtin( + F::MkCons, + &[trace(&b, "inner", b.int(42)), list(&b, &[])], + LIST, + ), + ], + LIST, + ); + let h = bind(&b, "head", INT); + let t = bind(&b, "tail", LIST); + let h2 = bind(&b, "head", INT); + let t2 = bind(&b, "tail", LIST); + let inner = b.case( + CaseKind::List, + b.var(t.name, LIST), + &[arm(&b, Test::Cons, &[h2, t2], b.var(h2.name, INT))], + None, + INT, + ); + check( + "nested_mkcons", + &b, + b.case( + CaseKind::List, + xs, + &[arm(&b, Test::Cons, &[h, t], inner)], + None, + INT, + ), + false, + ); + } + + #[test] + fn repeated_literal_tails_share_one_derived_value() { + let a = Arena::new(); + let b = Builder::new(&a); + let xs = bind(&b, "xs", LIST); + let value = list(&b, &[21, 42, 7, 9]); + let cases = [0, 1].map(|_| { + let h = bind(&b, "head", INT); + let t = bind(&b, "tail", LIST); + b.case( + CaseKind::List, + b.var(xs.name, LIST), + &[arm(&b, Test::Cons, &[h, t], b.var(t.name, LIST))], + None, + LIST, + ) + }); + let ty = Ty::Runtime(a.alloc(nash_ir::ty::RuntimeTy::Constr { + tag: 0, + fields: a.alloc_slice_copy(&[LIST, LIST, LIST]), + })); + let body = b.constr(0, &[b.var(xs.name, LIST), cases[0], cases[1]], ty); + check("shared_literal_tails", &b, b.let_(xs, value, body), false); + } + + #[test] + fn literal_data_tail_preserves_element_metadata() { + let a = Arena::new(); + let b = Builder::new(&a); + let values = [ + Constant::data(&a, nash_plutus::data::PlutusData::integer_from(&a, 21)), + Constant::data(&a, nash_plutus::data::PlutusData::integer_from(&a, 42)), + ]; + let value = b.lit(Constant::proto_list( + &a, + &Type::Data, + a.alloc_slice_copy(&values), + )); + let head = bind(&b, "head", b.lit(values[0]).ty); + let tail = bind(&b, "tail", value.ty); + let c = b.case( + CaseKind::List, + value, + &[arm( + &b, + Test::Cons, + &[head, tail], + b.var(tail.name, tail.ty), + )], + None, + tail.ty, + ); + check("data_tail_metadata", &b, c, false); + } +} + +mod data { + //! Isolated literal Data-shape case folding with accepted-pipeline comparisons. + use nash_ir::{ + anf, + build::Builder, + core::*, + hygiene, known_case, + pretty::pretty, + ty::{ConstTy, Ty}, + }; + use nash_plutus::{ + arena::Arena, builtin::DefaultFunction as F, constant::Constant, data::PlutusData, + }; + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + const DATA: Ty<'static> = Ty::Big(&nash_ir::ty::BigTy::Data); + fn bind<'a>(b: &Builder<'a>, text: &'a str, ty: Ty<'a>) -> Binder<'a> { + Binder { + name: b.fresh(text), + ty, + } + } + fn trace<'a>(b: &Builder<'a>, label: &'a str, value: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, label)), value) + } + fn arm<'a>( + b: &Builder<'a>, + test: Test<'a>, + binders: &[Binder<'a>], + body: &'a Core<'a>, + ) -> Branch<'a> { + Branch { + test, + binders: b.arena.alloc_slice_copy(binders), + body, + } + } + fn check(name: &str, b: &Builder<'_>, original: &Core<'_>, fails: bool) { + let before = anf::normalize(b, original); + let folded = known_case::reduce_data(b, before); + let after = nash_ir::small_inline::simplify(b, folded); + let after = known_case::simplify_data(b, after); + let left = crate::harness::eval_core_raw(b.arena, before); + let middle = crate::harness::eval_core_raw(b.arena, folded); + let right = crate::harness::eval_core_raw(b.arena, after); + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + original, + format!( + "--- isolated ANF input\n{}\n--- isolated folded Core\n{}\n--- isolated cleaned Core\n{}\n--- isolated UPLC before\n{}\n--- isolated UPLC after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + pretty(folded), + pretty(after), + left.uplc, + right.uplc, + right.result, + right.logs + ) + ) + ); + for core in [before, folded, after] { + hygiene::validate(core, &[]).unwrap(); + assert_eq!(original.ty, core.ty); + } + anf::validate(after).unwrap(); + for actual in [middle, right] { + assert_eq!(left.observable, actual.observable); + assert_eq!(left.logs, actual.logs); + } + assert!(std::ptr::eq(after, known_case::simplify_data(b, after))); + } + fn literal<'a>(b: &Builder<'a>, data: &'a PlutusData<'a>) -> &'a Core<'a> { + b.lit(Constant::data(b.arena, data)) + } + fn shapes<'a>(a: &'a Arena) -> Vec<(&'static str, Test<'a>, &'a PlutusData<'a>, Ty<'a>)> { + let item = PlutusData::integer_from(a, 42); + let data_list = Ty::Const(a.alloc(ConstTy::List(DATA))); + let data_pair = Ty::Const(a.alloc(ConstTy::Pair(DATA, DATA))); + let map = Ty::Const(a.alloc(ConstTy::List(data_pair))); + let constr = Ty::Const(a.alloc(ConstTy::Pair(INT, data_list))); + vec![ + ("integer", Test::DataI, item, INT), + ( + "bytes", + Test::DataB, + PlutusData::byte_string(a, b"nash"), + Ty::Const(&ConstTy::Bytes), + ), + ( + "empty_list", + Test::DataList, + PlutusData::list(a, &[]), + data_list, + ), + ( + "list", + Test::DataList, + PlutusData::list(a, a.alloc_slice_copy(&[item])), + data_list, + ), + ("empty_map", Test::DataMap, PlutusData::map(a, &[]), map), + ( + "map", + Test::DataMap, + PlutusData::map( + a, + a.alloc_slice_copy(&[(item, item), (item, PlutusData::integer_from(a, 9))]), + ), + map, + ), + ( + "nullary_constr", + Test::DataConstr, + PlutusData::constr(a, 59, &[]), + constr, + ), + ( + "constr", + Test::DataConstr, + PlutusData::constr(a, 122, a.alloc_slice_copy(&[item])), + constr, + ), + ] + } + #[test] + fn all_shapes_bind_native_payload_and_ignore_cold_default() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, test, data, ty) in shapes(&a) { + let payload = bind(&b, "payload", ty); + check( + name, + &b, + b.case( + CaseKind::Data, + literal(&b, data), + &[arm(&b, test, &[payload], b.var(payload.name, ty))], + Some(trace(&b, "cold", b.error(ty))), + ty, + ), + false, + ); + } + } + #[test] + fn missing_shapes_use_default_or_fail() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, _, data, _) in shapes(&a) { + check( + &format!("{name}_default"), + &b, + b.case( + CaseKind::Data, + literal(&b, data), + &[], + Some(trace(&b, "fallback", b.int(9))), + INT, + ), + false, + ); + check( + &format!("{name}_missing"), + &b, + b.case(CaseKind::Data, literal(&b, data), &[], None, INT), + true, + ); + } + } + #[test] + fn aliases_repeated_payloads_and_escaping_original() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, test, data, ty) in shapes(&a) { + let value = bind(&b, "data", DATA); + let alias = bind(&b, "alias", DATA); + let branches: Vec<_> = (0..2) + .map(|_| { + let p = bind(&b, "payload", ty); + b.case( + CaseKind::Data, + b.var(alias.name, DATA), + &[arm(&b, test, &[p], b.var(p.name, ty))], + None, + ty, + ) + }) + .collect(); + let result = b.constr( + 0, + &[b.var(value.name, DATA), branches[0], branches[1]], + Ty::Erased, + ); + check( + &format!("shared_{name}"), + &b, + b.let_( + value, + literal(&b, data), + b.let_(alias, b.var(value.name, DATA), result), + ), + false, + ); + } + } + #[test] + fn strict_effects_survive_and_cold_branch_stays_cold() { + let a = Arena::new(); + let b = Builder::new(&a); + let effect = bind(&b, "effect", INT); + let value = bind(&b, "data", DATA); + let p = bind(&b, "payload", INT); + let c = b.case( + CaseKind::Data, + b.var(value.name, DATA), + &[arm( + &b, + Test::DataI, + &[p], + trace(&b, "selected", b.var(p.name, INT)), + )], + Some(trace(&b, "cold", b.error(INT))), + INT, + ); + check( + "strict_trace", + &b, + b.let_( + effect, + trace(&b, "before", b.int(0)), + b.let_(value, literal(&b, PlutusData::integer_from(&a, 42)), c), + ), + false, + ); + check( + "strict_failure", + &b, + b.let_( + effect, + trace(&b, "before", b.error(INT)), + b.let_(value, literal(&b, PlutusData::integer_from(&a, 42)), c), + ), + true, + ); + } + #[test] + fn returned_functions_and_delays_capture_payload() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, "payload", INT); + let x = bind(&b, "x", INT); + let body = b.builtin( + F::AddInteger, + &[b.var(p.name, INT), b.var(x.name, INT)], + INT, + ); + let function = b.lam(&[x], body); + let c = b.case( + CaseKind::Data, + literal(&b, PlutusData::integer_from(&a, 40)), + &[arm(&b, Test::DataI, &[p], function)], + None, + function.ty, + ); + check("returned_function", &b, b.app(c, &[b.int(2)], INT), false); + let delay = b.delay(trace(&b, "forced", b.var(p.name, INT))); + let c = b.case( + CaseKind::Data, + literal(&b, PlutusData::integer_from(&a, 42)), + &[arm(&b, Test::DataI, &[p], delay)], + None, + delay.ty, + ); + check("returned_delay", &b, b.force(c, INT), false); + } + #[test] + fn list_payload_exposes_nested_data_case() { + let a = Arena::new(); + let b = Builder::new(&a); + let list_ty = Ty::Const(&ConstTy::List(DATA)); + let xs = bind(&b, "xs", list_ty); + let h = bind(&b, "head", DATA); + let t = bind(&b, "tail", list_ty); + let n = bind(&b, "number", INT); + let number = b.case( + CaseKind::Data, + b.var(h.name, DATA), + &[arm(&b, Test::DataI, &[n], b.var(n.name, INT))], + None, + INT, + ); + let head = b.case( + CaseKind::List, + b.var(xs.name, list_ty), + &[arm(&b, Test::Cons, &[h, t], number)], + None, + INT, + ); + let data = PlutusData::list(&a, a.alloc_slice_copy(&[PlutusData::integer_from(&a, 42)])); + check( + "nested_data_list", + &b, + b.case( + CaseKind::Data, + literal(&b, data), + &[arm(&b, Test::DataList, &[xs], head)], + None, + INT, + ), + false, + ); + } + #[test] + fn unknown_traced_builtin_and_wrong_runtime_subjects_are_not_facts() { + let a = Arena::new(); + let b = Builder::new(&a); + let n = bind(&b, "number", INT); + for (name, value, fails) in [ + ( + "traced_subject", + trace(&b, "subject", literal(&b, PlutusData::integer_from(&a, 42))), + false, + ), + ( + "idata_subject", + b.builtin(F::IData, &[b.int(42)], DATA), + false, + ), + ( + "invalid_idata", + b.builtin(F::IData, &[b.lit(Constant::bool(&a, true))], DATA), + true, + ), + ("wrong_subject", b.with_type(b.int(42), DATA), true), + ] { + check( + name, + &b, + b.case( + CaseKind::Data, + value, + &[arm(&b, Test::DataI, &[n], b.var(n.name, INT))], + None, + INT, + ), + fails, + ); + } + } + #[test] + fn malformed_tables_remain_lowering_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, "p", INT); + let valid = arm(&b, Test::DataI, &[p], b.int(42)); + for (name, branches) in [ + ("duplicate_shape", vec![valid, valid]), + ( + "unselected_bad_arity", + vec![valid, arm(&b, Test::DataB, &[], b.int(9))], + ), + ( + "no_payload_binder", + vec![arm(&b, Test::DataI, &[], b.int(42))], + ), + ( + "extra_payload_binder", + vec![arm(&b, Test::DataI, &[p, p], b.int(42))], + ), + ( + "wrong_test", + vec![valid, arm(&b, Test::True, &[], b.int(9))], + ), + ] { + let before = b.case( + CaseKind::Data, + literal(&b, PlutusData::integer_from(&a, 42)), + &branches, + None, + INT, + ); + let after = known_case::reduce_data(&b, before); + let left = crate::lower::lower(&a, before).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + name, + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(before), + pretty(after) + ) + ); + assert!(std::ptr::eq(before, after)); + } + } + + #[test] + fn complete_table_selects_each_shape_with_unused_payload() { + let a = Arena::new(); + let b = Builder::new(&a); + let shapes = shapes(&a); + for (name, _, data, _) in &shapes { + let branches: Vec<_> = [0, 1, 2, 4, 6] + .iter() + .map(|&index| { + let (_, test, _, ty) = shapes[index]; + let p = bind(&b, "unused", ty); + arm(&b, test, &[p], trace(&b, name, b.int(index as i128))) + }) + .collect(); + check( + &format!("complete_{name}"), + &b, + b.case( + CaseKind::Data, + literal(&b, data), + &branches, + Some(b.error(INT)), + INT, + ), + false, + ); + } + } + #[test] + fn large_integer_and_constructor_tag_are_not_narrowed() { + let a = Arena::new(); + let b = Builder::new(&a); + let integer = a.alloc_integer("-340282366920938463463374607431768211457".parse().unwrap()); + let p = bind(&b, "integer", INT); + check( + "large_signed_integer", + &b, + b.case( + CaseKind::Data, + literal(&b, PlutusData::integer(&a, integer)), + &[arm(&b, Test::DataI, &[p], b.var(p.name, INT))], + None, + INT, + ), + false, + ); + let ty = Ty::Const(&ConstTy::Pair(INT, Ty::Const(&ConstTy::List(DATA)))); + let p = bind(&b, "constr", ty); + check( + "max_constructor_tag", + &b, + b.case( + CaseKind::Data, + literal(&b, PlutusData::constr(&a, u64::MAX, &[])), + &[arm(&b, Test::DataConstr, &[p], b.var(p.name, ty))], + None, + ty, + ), + false, + ); + } + + #[test] + fn captured_original_unknown_parameter_and_result_type_view() { + let a = Arena::new(); + let b = Builder::new(&a); + let data = bind(&b, "data", DATA); + let payload = bind(&b, "payload", INT); + let c = b.case( + CaseKind::Data, + b.var(data.name, DATA), + &[arm(&b, Test::DataI, &[payload], b.var(payload.name, INT))], + None, + INT, + ); + let delayed = b.delay(c); + check( + "captured_original", + &b, + b.let_( + data, + literal(&b, PlutusData::integer_from(&a, 42)), + b.force(delayed, INT), + ), + false, + ); + let function = b.lam(&[data], c); + check( + "unknown_parameter", + &b, + b.app( + function, + &[literal(&b, PlutusData::integer_from(&a, 42))], + INT, + ), + false, + ); + let c = b.case( + CaseKind::Data, + literal(&b, PlutusData::integer_from(&a, 42)), + &[arm(&b, Test::DataI, &[payload], b.int(9))], + None, + Ty::Erased, + ); + check("result_type_view", &b, c, false); + } + + mod wrappers { + //! Scalar and collection wrapper folding; constructor checks remain strict. + use super::*; + const BYTES: Ty<'static> = Ty::Const(&ConstTy::Bytes); + fn kinds<'a>(b: &Builder<'a>) -> [(F, Test<'a>, &'static str, &'a Core<'a>); 4] { + let data = Constant::data(b.arena, PlutusData::integer_from(b.arena, 42)); + let data_ty = &nash_plutus::typ::Type::Data; + let pair_ty = nash_plutus::typ::Type::pair(b.arena, data_ty, data_ty); + let other = Constant::data(b.arena, PlutusData::integer_from(b.arena, 7)); + let pair = Constant::proto_pair(b.arena, data_ty, data_ty, data, other); + let reverse = Constant::proto_pair(b.arena, data_ty, data_ty, other, data); + let duplicate = Constant::proto_pair(b.arena, data_ty, data_ty, data, data); + [ + (F::IData, Test::DataI, "integer", b.int(42)), + ( + F::BData, + Test::DataB, + "bytes", + b.lit(Constant::byte_string(b.arena, b"nash")), + ), + ( + F::ListData, + Test::DataList, + "list", + b.lit(Constant::proto_list( + b.arena, + data_ty, + b.arena.alloc_slice_copy(&[data]), + )), + ), + ( + F::MapData, + Test::DataMap, + "map", + b.lit(Constant::proto_list( + b.arena, + pair_ty, + b.arena.alloc_slice_copy(&[pair, reverse, duplicate]), + )), + ), + ] + } + fn check(name: &str, b: &Builder<'_>, original: &Core<'_>, fails: bool) { + let before = anf::normalize(b, original); + let folded = + known_case::reduce_constr_data(b, known_case::reduce_data_wrappers(b, before)); + let after = + known_case::simplify_constr_data(b, nash_ir::small_inline::simplify(b, folded)); + let left = crate::harness::eval_core_raw(b.arena, before); + let middle = crate::harness::eval_core_raw(b.arena, folded); + let right = crate::harness::eval_core_raw(b.arena, after); + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + original, + format!( + "--- isolated ANF input\n{}\n--- isolated folded Core\n{}\n--- isolated cleaned Core\n{}\n--- isolated UPLC before\n{}\n--- isolated UPLC after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + pretty(folded), + pretty(after), + left.uplc, + right.uplc, + right.result, + right.logs + ) + ) + ); + for core in [before, folded, after] { + hygiene::validate(core, &[]).unwrap(); + assert_eq!(original.ty, core.ty); + } + anf::validate(after).unwrap(); + for actual in [middle, right] { + assert_eq!(left.observable, actual.observable); + assert_eq!(left.logs, actual.logs); + } + assert!(std::ptr::eq( + after, + known_case::simplify_constr_data(b, after) + )); + } + #[test] + fn literal_and_variable_operands_select_payload() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + for parameter in [false, true] { + let x = bind(&b, "input", value.ty); + let p = bind(&b, "payload", value.ty); + let operand = if parameter { + b.var(x.name, x.ty) + } else { + value + }; + let c = b.case( + CaseKind::Data, + b.builtin(func, &[operand], DATA), + &[arm(&b, test, &[p], b.var(p.name, p.ty))], + Some(trace(&b, "cold", b.error(p.ty))), + p.ty, + ); + let root = if parameter { + b.app(b.lam(&[x], c), &[value], c.ty) + } else { + c + }; + check(&format!("{name}_parameter_{parameter}"), &b, root, false); + } + } + } + #[test] + fn strict_operands_and_intervening_effects_run_once() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + for fail in [false, true] { + let d = bind(&b, "data", DATA); + let p = bind(&b, "payload", value.ty); + let effect = bind(&b, "effect", INT); + let c = b.case( + CaseKind::Data, + b.var(d.name, DATA), + &[arm(&b, test, &[p], trace(&b, "selected", b.int(9)))], + None, + INT, + ); + let operand = + trace(&b, "operand", if fail { b.error(value.ty) } else { value }); + let root = b.let_( + d, + b.builtin(func, &[operand], DATA), + b.let_(effect, trace(&b, "between", b.int(0)), c), + ); + check(&format!("{name}_strict_failure_{fail}"), &b, root, fail); + } + } + } + #[test] + fn wrong_runtime_operands_fail_even_when_payload_is_unused() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, _) in kinds(&b) { + let x = bind(&b, "x", INT); + for (bad, kind) in [ + (b.lit(Constant::bool(&a, true)), "bool"), + (b.lam(&[x], b.var(x.name, INT)), "function"), + (b.delay(b.lam(&[x], b.var(x.name, INT))), "delay"), + ] { + for fallback in [false, true] { + let p = bind(&b, "unused", bad.ty); + let arms = if fallback { + vec![] + } else { + vec![arm(&b, test, &[p], b.int(9))] + }; + let c = b.case( + CaseKind::Data, + b.builtin(func, &[bad], DATA), + &arms, + Some(trace(&b, "unreachable", b.int(0))), + INT, + ); + check( + &format!("{name}_invalid_{kind}_fallback_{fallback}"), + &b, + c, + true, + ); + } + } + } + } + #[test] + fn missing_shape_uses_default_or_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + let (wrong, ty) = if test == Test::DataList { + (Test::DataI, INT) + } else { + (Test::DataList, Ty::Const(&ConstTy::List(DATA))) + }; + let p = bind(&b, "wrong", ty); + for default in [false, true] { + let c = b.case( + CaseKind::Data, + b.builtin(func, &[trace(&b, "operand", value)], DATA), + &[arm(&b, wrong, &[p], trace(&b, "wrong", b.error(INT)))], + default.then(|| trace(&b, "fallback", b.int(9))), + INT, + ); + check(&format!("{name}_default_{default}"), &b, c, !default); + } + } + } + #[test] + fn aliases_repeated_matches_and_original_escape() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + let d = bind(&b, "data", DATA); + let alias = bind(&b, "alias", DATA); + let fields: Vec<_> = (0..2) + .map(|_| { + let p = bind(&b, "payload", value.ty); + b.case( + CaseKind::Data, + b.var(alias.name, DATA), + &[arm(&b, test, &[p], b.var(p.name, p.ty))], + None, + p.ty, + ) + }) + .collect(); + let root = b.let_( + d, + b.builtin(func, &[trace(&b, "once", value)], DATA), + b.let_( + alias, + b.var(d.name, DATA), + b.constr(0, &[b.var(d.name, DATA), fields[0], fields[1]], Ty::Erased), + ), + ); + check(&format!("{name}_shared_escape"), &b, root, false); + } + } + #[test] + fn suspended_matches_do_not_delay_original_constructor() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + let d = bind(&b, "data", DATA); + let p = bind(&b, "payload", value.ty); + let c = b.case( + CaseKind::Data, + b.var(d.name, DATA), + &[arm(&b, test, &[p], b.var(p.name, p.ty))], + None, + p.ty, + ); + for cold in [false, true] { + let branch = b.if_( + b.lit(Constant::bool(&a, cold)), + value, + b.force(b.delay(c), p.ty), + ); + check( + &format!("{name}_captured_cold_{cold}"), + &b, + b.let_( + d, + b.builtin(func, &[trace(&b, "before", value)], DATA), + branch, + ), + false, + ); + } + } + } + #[test] + fn partial_overapplied_and_traced_producers_are_not_facts() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + let p = bind(&b, "payload", value.ty); + let full = b.builtin(func, &[value], DATA); + for (subject, label, fails) in [ + (b.builtin(func, &[], DATA), "partial", true), + (b.app(full, &[b.int(0)], DATA), "overapplied", true), + (trace(&b, "producer", full), "traced", false), + ] { + check( + &format!("{name}_{label}"), + &b, + b.case( + CaseKind::Data, + subject, + &[arm(&b, test, &[p], b.var(p.name, p.ty))], + None, + p.ty, + ), + fails, + ); + } + } + } + #[test] + fn collection_metadata_empty_lists_and_runtime_cons() { + use nash_plutus::typ::Type; + let a = Arena::new(); + let b = Builder::new(&a); + let data = Constant::data(&a, PlutusData::integer_from(&a, 42)); + let int = Constant::integer_from(&a, 7); + let pair_ty = Type::pair(&a, &Type::Data, &Type::Data); + let wrong_pair_ty = Type::pair(&a, &Type::Data, &Type::Integer); + let pair = Constant::proto_pair(&a, &Type::Data, &Type::Data, data, data); + let wrong_pair = Constant::proto_pair(&a, &Type::Data, &Type::Integer, data, int); + for (func, test, name, good_ty, item) in [ + (F::ListData, Test::DataList, "list", &Type::Data, data), + (F::MapData, Test::DataMap, "map", pair_ty, pair), + ] { + let empty = b.lit(Constant::proto_list(&a, good_ty, &[])); + let native = b.builtin(F::MkCons, &[b.lit(item), empty], empty.ty); + let (other_ty, other_item) = if func == F::MapData { + (&Type::Data, data) + } else { + (pair_ty, pair) + }; + for (label, value, fails) in [ + ( + "other_empty", + b.lit(Constant::proto_list(&a, other_ty, &[])), + true, + ), + ( + "other_items", + b.lit(Constant::proto_list( + &a, + other_ty, + a.alloc_slice_copy(&[other_item]), + )), + true, + ), + ("empty", empty, false), + ("cons", native, false), + ( + "wrong_empty", + b.lit(Constant::proto_list(&a, &Type::Integer, &[])), + true, + ), + ( + "wrong_items", + b.lit(Constant::proto_list( + &a, + &Type::Integer, + a.alloc_slice_copy(&[int]), + )), + true, + ), + ( + "wrong_pair_empty", + b.lit(Constant::proto_list(&a, wrong_pair_ty, &[])), + true, + ), + ( + "wrong_pair_items", + b.lit(Constant::proto_list( + &a, + wrong_pair_ty, + a.alloc_slice_copy(&[wrong_pair]), + )), + true, + ), + ] { + for used in [false, true] { + let p = bind(&b, "payload", empty.ty); + let body = if used { b.var(p.name, p.ty) } else { empty }; + check( + &format!("{name}_{label}_used_{used}"), + &b, + b.case( + CaseKind::Data, + b.builtin(func, &[value], DATA), + &[arm(&b, test, &[p], body)], + None, + body.ty, + ), + fails, + ); + } + } + } + } + + #[test] + fn collection_nested_wrappers_return_capturing_functions() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b).into_iter().skip(2) { + let p = bind(&b, "outer", value.ty); + let q = bind(&b, "inner", value.ty); + let x = bind(&b, "x", INT); + let fun = b.lam( + &[x], + b.constr(0, &[b.var(q.name, q.ty), b.var(x.name, x.ty)], Ty::Erased), + ); + let inner = b.case( + CaseKind::Data, + b.builtin(func, &[b.var(p.name, p.ty)], DATA), + &[arm(&b, test, &[q], fun)], + None, + fun.ty, + ); + let outer = b.case( + CaseKind::Data, + b.builtin(func, &[value], DATA), + &[arm(&b, test, &[p], inner)], + None, + inner.ty, + ); + check( + &format!("{name}_nested_returned_function"), + &b, + b.app(outer, &[b.int(7)], Ty::Erased), + false, + ); + } + } + + #[test] + fn repeated_matches_share_long_literal_bytes() { + let a = Arena::new(); + let b = Builder::new(&a); + let bytes = b.lit(Constant::byte_string(&a, a.alloc_slice_copy(&[7; 128]))); + let d = bind(&b, "data", DATA); + let fields: Vec<_> = (0..3) + .map(|_| { + let p = bind(&b, "payload", BYTES); + b.case( + CaseKind::Data, + b.var(d.name, DATA), + &[arm(&b, Test::DataB, &[p], b.var(p.name, BYTES))], + None, + BYTES, + ) + }) + .collect(); + check( + "shared_long_bytes", + &b, + b.let_( + d, + b.builtin(F::BData, &[bytes], DATA), + b.constr(0, &fields, Ty::Erased), + ), + false, + ); + } + #[test] + fn nested_wrapper_and_returned_function_preserve_type_views() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, "payload", INT); + let q = bind(&b, "inner", INT); + let x = bind(&b, "x", INT); + let fun = b.lam( + &[x], + b.builtin( + F::AddInteger, + &[b.var(q.name, INT), b.var(x.name, INT)], + INT, + ), + ); + let inner = b.case( + CaseKind::Data, + b.builtin(F::IData, &[b.var(p.name, INT)], DATA), + &[arm(&b, Test::DataI, &[q], fun)], + None, + fun.ty, + ); + let outer = b.case( + CaseKind::Data, + b.builtin(F::IData, &[b.int(40)], DATA), + &[arm(&b, Test::DataI, &[p], inner)], + None, + inner.ty, + ); + check( + "nested_returned_function", + &b, + b.with_type(b.app(outer, &[b.int(2)], INT), Ty::Erased), + false, + ); + } + #[test] + fn malformed_unselected_arms_remain_lowering_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + for (func, test, name, value) in kinds(&b) { + let p = bind(&b, "payload", value.ty); + let d = bind(&b, "data", DATA); + let valid = arm(&b, test, &[p], b.int(42)); + for (arms, label) in [ + (vec![valid, valid], "duplicate"), + ( + vec![ + valid, + arm( + &b, + if test == Test::DataList { + Test::DataI + } else { + Test::DataList + }, + &[], + b.int(0), + ), + ], + "unselected_arity", + ), + (vec![arm(&b, test, &[p, p], b.int(0))], "selected_arity"), + ( + vec![valid, arm(&b, Test::True, &[], b.int(0))], + "wrong_test", + ), + ] { + let before = b.let_( + d, + b.builtin(func, &[value], DATA), + b.case(CaseKind::Data, b.var(d.name, DATA), &arms, None, INT), + ); + let after = known_case::reduce_data_wrappers(&b, before); + let left = crate::lower::lower(&a, before).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + format!("{name}_invalid_{label}"), + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(before), + pretty(after) + ) + ); + assert!(std::ptr::eq(before, after)); + } + } + } + #[test] + fn producer_defaults_and_unknown_data_parameter() { + let a = Arena::new(); + let b = Builder::new(&a); + let list = b.lit(Constant::proto_list(&a, &nash_plutus::typ::Type::Data, &[])); + let map = b.lit(Constant::proto_list( + &a, + nash_plutus::typ::Type::pair( + &a, + &nash_plutus::typ::Type::Data, + &nash_plutus::typ::Type::Data, + ), + &[], + )); + for (name, subject) in [ + ("list_producer", b.builtin(F::ListData, &[list], DATA)), + ("map_producer", b.builtin(F::MapData, &[map], DATA)), + ( + "constr_producer", + b.builtin(F::ConstrData, &[b.int(0), list], DATA), + ), + ] { + check( + name, + &b, + b.case(CaseKind::Data, subject, &[], Some(b.int(42)), INT), + false, + ); + } + let d = bind(&b, "unknown", DATA); + let p = bind(&b, "payload", INT); + let c = b.case( + CaseKind::Data, + b.var(d.name, DATA), + &[arm(&b, Test::DataI, &[p], b.var(p.name, INT))], + None, + INT, + ); + check( + "unknown_data_parameter", + &b, + b.app( + b.lam(&[d], c), + &[literal(&b, PlutusData::integer_from(&a, 42))], + INT, + ), + false, + ); + } + fn constr_fields<'a>(b: &Builder<'a>, empty: bool) -> &'a Core<'a> { + let data = Constant::data(b.arena, PlutusData::integer_from(b.arena, 42)); + b.lit(Constant::proto_list( + b.arena, + &nash_plutus::typ::Type::Data, + if empty { + &[] + } else { + b.arena.alloc_slice_copy(&[data]) + }, + )) + } + fn constr_pair_ty<'a>(b: &Builder<'a>) -> Ty<'a> { + Ty::Const(b.arena.alloc(ConstTy::Pair( + INT, + Ty::Const(b.arena.alloc(ConstTy::List(DATA))), + ))) + } + #[test] + fn constr_literal_and_runtime_operands_supply_native_pair() { + let a = Arena::new(); + let b = Builder::new(&a); + for tag in [0, 59, u64::MAX] { + for empty in [false, true] { + for parameter in [false, true] { + let fields = constr_fields(&b, empty); + let t = bind(&b, "tag", INT); + let f = bind(&b, "fields", fields.ty); + let p = bind(&b, "pair", constr_pair_ty(&b)); + let root = b.case( + CaseKind::Data, + b.builtin( + F::ConstrData, + &[ + if parameter { + b.var(t.name, t.ty) + } else { + b.int(i128::from(tag)) + }, + if parameter { + b.var(f.name, f.ty) + } else { + fields + }, + ], + DATA, + ), + &[arm(&b, Test::DataConstr, &[p], b.var(p.name, p.ty))], + Some(trace(&b, "cold", b.error(p.ty))), + p.ty, + ); + let root = if parameter { + b.app( + b.lam(&[t, f], root), + &[b.int(i128::from(tag)), fields], + p.ty, + ) + } else { + root + }; + check( + &format!("constr_tag_{tag}_empty_{empty}_parameter_{parameter}"), + &b, + root, + false, + ); + } + } + } + } + #[test] + fn constr_operand_effects_failures_and_runtime_checks_stay_strict() { + let a = Arena::new(); + let b = Builder::new(&a); + let fields = constr_fields(&b, false); + for (label, tag, input, fails) in [ + ("valid", b.int(59), fields, false), + ("tag_failure", b.error(INT), fields, true), + ("fields_failure", b.int(59), b.error(fields.ty), true), + ("wrong_tag", b.lit(Constant::bool(&a, true)), fields, true), + ( + "wrong_fields", + b.int(59), + b.lit(Constant::bool(&a, true)), + true, + ), + ( + "wrong_empty_metadata", + b.int(59), + b.lit(Constant::proto_list( + &a, + &nash_plutus::typ::Type::Integer, + &[], + )), + true, + ), + ] { + for used in [false, true] { + let d = bind(&b, "data", DATA); + let effect = bind(&b, "effect", INT); + let p = bind(&b, "pair", constr_pair_ty(&b)); + let body = if used { + b.builtin(F::FstPair, &[b.var(p.name, p.ty)], INT) + } else { + b.int(9) + }; + let c = b.case( + CaseKind::Data, + b.var(d.name, DATA), + &[arm(&b, Test::DataConstr, &[p], trace(&b, "selected", body))], + None, + INT, + ); + check( + &format!("constr_{label}_used_{used}"), + &b, + b.let_( + d, + b.builtin( + F::ConstrData, + &[trace(&b, "tag", tag), trace(&b, "fields", input)], + DATA, + ), + b.let_(effect, trace(&b, "between", b.int(0)), c), + ), + fails, + ); + } + } + } + #[test] + fn constr_aliases_repeated_pair_uses_and_capture() { + let a = Arena::new(); + let b = Builder::new(&a); + for cold in [false, true] { + let fields = constr_fields(&b, false); + let d = bind(&b, "data", DATA); + let alias = bind(&b, "alias", DATA); + let p = bind(&b, "pair", constr_pair_ty(&b)); + let x = bind(&b, "x", INT); + let tag = bind(&b, "tag", INT); + let fs = bind(&b, "fields", fields.ty); + let pair_case = b.case( + CaseKind::Pair, + b.var(p.name, p.ty), + &[arm( + &b, + Test::Pair, + &[tag, fs], + b.constr( + 0, + &[b.var(tag.name, INT), b.var(fs.name, fs.ty)], + Ty::Erased, + ), + )], + None, + Ty::Erased, + ); + let fun = b.lam( + &[x], + b.constr( + 0, + &[b.var(p.name, p.ty), pair_case, b.var(x.name, x.ty)], + Ty::Erased, + ), + ); + let c = b.case( + CaseKind::Data, + b.var(alias.name, DATA), + &[arm(&b, Test::DataConstr, &[p], fun)], + None, + fun.ty, + ); + let p2 = bind(&b, "second", p.ty); + let c2 = b.case( + CaseKind::Data, + b.var(alias.name, DATA), + &[arm(&b, Test::DataConstr, &[p2], b.var(p2.name, p2.ty))], + None, + p2.ty, + ); + let selected = b.constr( + 0, + &[b.var(d.name, DATA), b.app(c, &[b.int(7)], Ty::Erased), c2], + Ty::Erased, + ); + let branch = b.if_( + b.lit(Constant::bool(&a, cold)), + b.constr(1, &[], Ty::Erased), + b.force(b.delay(selected), Ty::Erased), + ); + check( + &format!("constr_aliases_cold_{cold}"), + &b, + b.let_( + d, + b.builtin( + F::ConstrData, + &[trace(&b, "tag", b.int(59)), trace(&b, "fields", fields)], + DATA, + ), + b.let_(alias, b.var(d.name, DATA), branch), + ), + false, + ); + } + } + #[test] + fn constr_defaults_partial_and_traced_producers() { + let a = Arena::new(); + let b = Builder::new(&a); + let fields = constr_fields(&b, false); + for default in [false, true] { + let wrong = bind(&b, "wrong", INT); + check( + &format!("constr_default_{default}"), + &b, + b.case( + CaseKind::Data, + b.builtin(F::ConstrData, &[b.int(59), fields], DATA), + &[arm( + &b, + Test::DataI, + &[wrong], + trace(&b, "wrong", b.error(INT)), + )], + default.then(|| trace(&b, "default", b.int(9))), + INT, + ), + !default, + ); + } + let full = b.builtin(F::ConstrData, &[b.int(59), fields], DATA); + for (label, subject, fails) in [ + ("bare", b.builtin(F::ConstrData, &[], DATA), true), + ( + "partial", + b.builtin(F::ConstrData, &[b.int(59)], DATA), + true, + ), + ("overapplied", b.app(full, &[b.int(0)], DATA), true), + ("traced", trace(&b, "producer", full), false), + ] { + let p = bind(&b, "pair", constr_pair_ty(&b)); + check( + &format!("constr_{label}"), + &b, + b.case( + CaseKind::Data, + subject, + &[arm(&b, Test::DataConstr, &[p], b.var(p.name, p.ty))], + None, + p.ty, + ), + fails, + ); + } + } + #[test] + fn constr_invalid_tables_stay_lowering_errors() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, "pair", constr_pair_ty(&b)); + let d = bind(&b, "data", DATA); + let valid = arm(&b, Test::DataConstr, &[p], b.int(42)); + for (label, arms) in [ + ("duplicate", vec![valid, valid]), + ( + "unselected_arity", + vec![valid, arm(&b, Test::DataList, &[], b.int(0))], + ), + ( + "selected_arity", + vec![arm(&b, Test::DataConstr, &[], b.int(0))], + ), + ( + "wrong_test", + vec![valid, arm(&b, Test::True, &[], b.int(0))], + ), + ] { + let before = b.let_( + d, + b.builtin(F::ConstrData, &[b.int(59), constr_fields(&b, false)], DATA), + b.case(CaseKind::Data, b.var(d.name, DATA), &arms, None, INT), + ); + let after = known_case::reduce_constr_data(&b, before); + let left = crate::lower::lower(&a, before).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + format!("constr_invalid_{label}"), + format!( + "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", + pretty(before), + pretty(after) + ) + ); + assert!(std::ptr::eq(before, after)); + } + } + #[test] + fn constr_inside_cold_delay_is_not_evaluated() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, "pair", constr_pair_ty(&b)); + let c = b.case( + CaseKind::Data, + b.builtin( + F::ConstrData, + &[trace(&b, "cold", b.error(INT)), constr_fields(&b, false)], + DATA, + ), + &[arm(&b, Test::DataConstr, &[p], b.int(0))], + None, + INT, + ); + check( + "constr_cold_producer", + &b, + b.if_( + b.lit(Constant::bool(&a, false)), + b.force(b.delay(c), INT), + b.int(9), + ), + false, + ); + } + #[test] + fn constr_out_of_range_tags_retain_producer_without_evaluation() { + // The existing evaluator panics for these tags. Render the transformation + // and verify retained construction without executing that evaluator path. + let a = Arena::new(); + let b = Builder::new(&a); + for (label, tag) in [("negative", -1), ("too_large", i128::from(u64::MAX) + 1)] { + let p = bind(&b, "unused", constr_pair_ty(&b)); + let producer = + b.builtin(F::ConstrData, &[b.int(tag), constr_fields(&b, true)], DATA); + let core = b.case( + CaseKind::Data, + producer, + &[arm(&b, Test::DataConstr, &[p], b.int(9))], + None, + INT, + ); + let before = anf::normalize(&b, core); + let after = known_case::simplify_constr_data(&b, before); + let left = crate::lower::lower(&a, before).unwrap(); + let right = crate::lower::lower(&a, after).unwrap(); + insta::assert_snapshot!( + format!("constr_{label}_retained"), + crate::harness::pass_snapshot( + &a, + core, + format!( + "--- isolated Core before\n{}\n--- isolated Core after\n{}\n--- isolated UPLC before\n{}\n--- isolated UPLC after\n{}", + pretty(before), + pretty(after), + nash_plutus::pretty::term(left), + nash_plutus::pretty::term(right) + ) + ) + ); + hygiene::validate(after, &[]).unwrap(); + anf::validate(after).unwrap(); + assert_eq!(core.ty, after.ty); + let mut retained = false; + after.walk(&mut |node| { + if matches!(node.kind, CoreKind::Builtin {func: F::ConstrData, args: [t, _]} if matches!(t.kind, CoreKind::Lit(c) if *c == *Constant::integer_from(&a, tag))) { retained = true; } + }); + assert!(retained); + } + } + } +} + +mod literal { + use nash_ir::{ + build::Builder, + core::*, + hygiene, known_case, + pretty::pretty, + ty::{ConstTy, Ty}, + }; + use nash_plutus::{arena::Arena, constant::Constant}; + const INT: Ty<'static> = Ty::Const(&ConstTy::Int); + fn trace<'a>(b: &Builder<'a>, s: &'a str, x: &'a Core<'a>) -> &'a Core<'a> { + b.trace(b.lit(Constant::string(b.arena, s)), x) + } + fn check<'a>(name: &str, b: &Builder<'a>, before: &'a Core<'a>, fails: bool) -> &'a Core<'a> { + let after = known_case::reduce_literals(b, before); + + let left = crate::harness::eval_core_raw(b.arena, before); + let right = crate::harness::eval_core_raw(b.arena, after); + + assert_eq!(right.result.starts_with("error:"), fails); + insta::assert_snapshot!( + name, + crate::harness::pass_snapshot( + b.arena, + before, + format!( + "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + pretty(before), + left.uplc, + pretty(after), + right.uplc, + right.result, + right.logs + ) + ) + ); + hygiene::validate(after, &[]).unwrap(); + // Properties independent of the expected snapshot. + assert_eq!(before.ty, after.ty); + assert_eq!(left.observable, right.observable); + assert_eq!(left.logs, right.logs); + after + } + + #[test] + fn matches_misses_defaults_and_effects() { + for bytes in [false, true] { + for value in [0, 1, 2, 9] { + for fallback in [false, true] { + let a = Arena::new(); + let b = Builder::new(&a); + let literal = |n| { + if bytes { + b.lit(Constant::byte_string(&a, a.alloc_slice_copy(&[n]))) + } else { + b.int(n.into()) + } + }; + let test = |n| match literal(n).kind { + CoreKind::Lit(Constant::Integer(i)) => Test::Int(i), + CoreKind::Lit(Constant::ByteString(bs)) => Test::Bytes(bs), + _ => unreachable!(), + }; + let branches: Vec<_> = (0..3) + .map(|n| Branch { + test: test(n), + binders: &[], + body: trace( + &b, + if n == value { "chosen" } else { "unselected" }, + if n == 1 { + b.error(INT) + } else { + b.int(n.into()) + }, + ), + }) + .collect(); + let case = b.case( + if bytes { + CaseKind::Bytes + } else { + CaseKind::Int + }, + literal(value), + &branches, + fallback.then(|| trace(&b, "fallback", b.int(42))), + INT, + ); + let strict = Binder { + name: b.fresh("strict"), + ty: INT, + }; + let root = b.let_(strict, trace(&b, "before", b.int(7)), case); + check( + &format!("bytes_{bytes}_value_{value}_fallback_{fallback}"), + &b, + root, + value == 1 || (value == 9 && !fallback), + ); + } + } + } + } + + #[test] + fn empty_tables_and_nonmatching_subjects() { + let a = Arena::new(); + let b = Builder::new(&a); + for (name, kind, subject) in [ + ("negative", CaseKind::Int, b.int(-7)), + ( + "empty_bytes", + CaseKind::Bytes, + b.lit(Constant::byte_string(&a, &[])), + ), + ( + "wrong_runtime_kind", + CaseKind::Int, + b.lit(Constant::bool(&a, true)), + ), + ] { + for fallback in [false, true] { + check( + &format!("empty_{name}_{fallback}"), + &b, + b.case(kind, subject, &[], fallback.then(|| b.int(42)), INT), + !fallback, + ); + } + } + let p = Binder { + name: b.fresh("subject"), + ty: INT, + }; + let CoreKind::Lit(Constant::Integer(i)) = b.int(7).kind else { + unreachable!() + }; + let arms = [Branch { + test: Test::Int(i), + binders: &[], + body: b.int(42), + }]; + let matched = b.case( + CaseKind::Int, + b.var(p.name, p.ty), + &arms, + Some(b.int(0)), + INT, + ); + let root = b.app(b.lam(&[p], matched), &[b.int(7)], INT); + let after = check("unknown_subject", &b, root, false); + assert!(std::ptr::eq(root, after)); + let delay = b.delay(trace(&b, "forced", b.int(42))); + let arms = [Branch { + test: Test::Int(i), + binders: &[], + body: delay, + }]; + check( + "selected_delay", + &b, + b.force(b.case(CaseKind::Int, b.int(7), &arms, None, delay.ty), INT), + false, + ); + check( + "effectful_subject", + &b, + b.case( + CaseKind::Int, + trace(&b, "subject", b.int(7)), + &[Branch { + test: Test::Int(i), + binders: &[], + body: b.int(42), + }], + None, + INT, + ), + false, + ); + } + + #[test] + fn invalid_tables_remain_errors() { + for mode in 0..3 { + let a = Arena::new(); + let b = Builder::new(&a); + let CoreKind::Lit(Constant::Integer(i)) = b.int(7).kind else { + unreachable!() + }; + let binder = Binder { + name: b.fresh("bad"), + ty: INT, + }; + let arm = Branch { + test: if mode == 0 { Test::True } else { Test::Int(i) }, + binders: if mode == 1 { + a.alloc_slice_copy(&[binder]) + } else { + &[] + }, + body: b.int(42), + }; + let arms = if mode == 2 { vec![arm, arm] } else { vec![arm] }; + let root = b.case(CaseKind::Int, b.int(7), &arms, Some(b.int(0)), INT); + let after = known_case::reduce_literals(&b, root); + let left = crate::lower::lower(&a, root).unwrap_err(); + let right = crate::lower::lower(&a, after).unwrap_err(); + insta::assert_snapshot!( + format!("invalid_literal_{mode}"), + format!( + "--- before\n{}\n{left:?}\n--- after\n{}\n{right:?}", + pretty(root), + pretty(after) + ) + ); + assert!(std::ptr::eq(root, after)); + } + } +} diff --git a/crates/nash-codegen/src/optimizer_tests/known_constr.rs b/crates/nash-codegen/src/optimizer_tests/known_constr.rs deleted file mode 100644 index fb71cc7a..00000000 --- a/crates/nash-codegen/src/optimizer_tests/known_constr.rs +++ /dev/null @@ -1,309 +0,0 @@ -//! Direct native-constructor case folding, including isolated-pass evidence. -use nash_ir::{ - build::Builder, - core::*, - hygiene, known_case, - pretty::pretty, - ty::{ConstTy, RuntimeTy, Ty}, -}; -use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; - -const INT: Ty<'static> = Ty::Const(&ConstTy::Int); -fn bind<'a>(b: &Builder<'a>, label: &'a str) -> Binder<'a> { - Binder { - name: b.fresh(label), - ty: INT, - } -} -fn trace<'a>(b: &Builder<'a>, label: &'a str, value: &'a Core<'a>) -> &'a Core<'a> { - b.trace(b.lit(Constant::string(b.arena, label)), value) -} -fn constr<'a>(b: &Builder<'a>, tag: u16, fields: &[&'a Core<'a>]) -> &'a Core<'a> { - let types: Vec<_> = fields.iter().map(|f| f.ty).collect(); - let ty = Ty::Runtime(b.arena.alloc(RuntimeTy::Constr { - tag, - fields: b.arena.alloc_slice_copy(&types), - })); - b.constr(tag, fields, ty) -} -fn arm<'a>(b: &Builder<'a>, tag: u16, binders: &[Binder<'a>], body: &'a Core<'a>) -> Branch<'a> { - Branch { - test: Test::Tag(tag), - binders: b.arena.alloc_slice_copy(binders), - body, - } -} -fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, fails: bool) { - let after = known_case::reduce_constr(b, before); - let left = crate::harness::eval_core_raw(b.arena, before); - let right = crate::harness::eval_core_raw(b.arena, after); - assert_eq!(right.result.starts_with("error:"), fails); - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - left.uplc, - pretty(after), - right.uplc, - right.result, - right.logs - ) - ) - ); - hygiene::validate(before, &[]).unwrap(); - hygiene::validate(after, &[]).unwrap(); - assert_eq!(before.ty, after.ty); - assert_eq!(left.observable, right.observable); - assert_eq!(left.logs, right.logs); - assert!(std::ptr::eq(after, known_case::reduce_constr(b, after))); -} - -#[test] -fn selects_tag_with_fields_in_source_order() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, "x"); - let y = bind(&b, "y"); - let body = trace( - &b, - "body", - b.builtin( - F::SubtractInteger, - &[b.var(x.name, INT), b.var(y.name, INT)], - INT, - ), - ); - let arms = [ - arm(&b, 1, &[x, y], body), - arm(&b, 0, &[], trace(&b, "cold", b.error(INT))), - ]; - check( - "field_order", - &b, - b.case( - CaseKind::Tag, - constr( - &b, - 1, - &[trace(&b, "first", b.int(50)), trace(&b, "second", b.int(8))], - ), - &arms, - None, - INT, - ), - false, - ); -} - -#[test] -fn nullary_and_expanded_wildcard_branches() { - let a = Arena::new(); - let b = Builder::new(&a); - for (tag, name) in [ - (0, "nullary"), - (1, "wildcard_one_field"), - (2, "wildcard_two_fields"), - ] { - let x = bind(&b, "ignored"); - let y = bind(&b, "ignored"); - let z = bind(&b, "ignored"); - let arms = [ - arm(&b, 0, &[], b.int(42)), - arm(&b, 1, &[x], b.int(42)), - arm(&b, 2, &[y, z], b.int(42)), - ]; - let fields: Vec<_> = (0..tag).map(|_| trace(&b, "field", b.int(0))).collect(); - check( - name, - &b, - b.case(CaseKind::Tag, constr(&b, tag, &fields), &arms, None, INT), - false, - ); - } -} - -#[test] -fn ignored_failing_field_still_fails_before_later_fields_and_body() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, "ignored"); - let y = bind(&b, "ignored"); - check( - "ignored_failure", - &b, - b.case( - CaseKind::Tag, - constr( - &b, - 0, - &[ - trace(&b, "first", b.error(INT)), - trace(&b, "second", b.int(0)), - ], - ), - &[arm(&b, 0, &[x, y], trace(&b, "body", b.int(42)))], - None, - INT, - ), - true, - ); -} - -#[test] -fn returned_function_and_delay_capture_evaluated_fields() { - let a = Arena::new(); - let b = Builder::new(&a); - for (delayed, name) in [(false, "returned_function"), (true, "returned_delay")] { - let x = bind(&b, "x"); - let p = bind(&b, "p"); - let body = trace(&b, "body", b.var(x.name, INT)); - let result = if delayed { - b.delay(body) - } else { - b.lam(&[p], body) - }; - let case = b.case( - CaseKind::Tag, - constr(&b, 0, &[trace(&b, "field", b.int(42))]), - &[arm(&b, 0, &[x], result)], - None, - result.ty, - ); - let invoke = if delayed { - b.force(case, INT) - } else { - b.app(case, &[trace(&b, "argument", b.int(0))], INT) - }; - check(name, &b, invoke, false); - } -} - -#[test] -fn nested_cases_and_cold_construction() { - let a = Arena::new(); - let b = Builder::new(&a); - let inner = b.case( - CaseKind::Tag, - constr(&b, 0, &[]), - &[arm(&b, 0, &[], b.int(42))], - None, - INT, - ); - check( - "nested", - &b, - b.case( - CaseKind::Tag, - constr(&b, 0, &[]), - &[arm(&b, 0, &[], inner)], - None, - INT, - ), - false, - ); - let x = bind(&b, "ignored"); - let cold = b.case( - CaseKind::Tag, - constr(&b, 0, &[trace(&b, "cold", b.error(INT))]), - &[arm(&b, 0, &[x], b.int(0))], - None, - INT, - ); - check( - "cold", - &b, - b.if_(b.lit(Constant::bool(&a, true)), b.int(42), cold), - false, - ); -} - -#[test] -fn unknown_tag_and_arity_mismatch_are_unchanged() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, "x"); - let cases = [ - ( - "unknown_tag", - constr(&b, 1, &[trace(&b, "field", b.int(0))]), - arm(&b, 0, &[], b.int(42)), - ), - ( - "extra_field", - constr(&b, 0, &[b.int(0)]), - arm(&b, 0, &[], b.int(42)), - ), - ]; - for (name, subject, branch) in cases { - let c = b.case(CaseKind::Tag, subject, &[branch], None, INT); - check(name, &b, c, true); - assert!(std::ptr::eq(c, known_case::reduce_constr(&b, c))); - } - // Too few fields returns a lambda in UPLC; explicitly apply it for evaluation. - let c = b.case( - CaseKind::Tag, - constr(&b, 0, &[]), - &[arm(&b, 0, &[x], b.var(x.name, INT))], - None, - b.lam(&[x], b.var(x.name, INT)).ty, - ); - check("missing_field", &b, b.app(c, &[b.int(42)], INT), false); - assert!(std::ptr::eq(c, known_case::reduce_constr(&b, c))); -} - -#[test] -fn invalid_tables_remain_lowering_errors() { - let a = Arena::new(); - let b = Builder::new(&a); - let good = arm(&b, 0, &[], b.int(42)); - for (name, branches, default) in [ - ("sparse", vec![arm(&b, 59, &[], b.int(42))], None), - ("duplicate", vec![good, good], None), - ( - "wrong_test", - vec![Branch { - test: Test::True, - ..good - }], - None, - ), - ("unexpanded_default", vec![good], Some(b.int(0))), - ] { - let c = b.case(CaseKind::Tag, constr(&b, 0, &[]), &branches, default, INT); - let after = known_case::reduce_constr(&b, c); - let left = crate::lower::lower(&a, c).unwrap_err(); - let right = crate::lower::lower(&a, after).unwrap_err(); - insta::assert_snapshot!( - name, - format!( - "--- before\n{}\n--- after\n{}\n--- errors\n{left:?}\n{right:?}", - pretty(c), - pretty(after) - ) - ); - assert!(std::ptr::eq(c, after)); - } -} - -#[test] -fn empty_table_and_effectful_subject_are_unchanged() { - let a = Arena::new(); - let b = Builder::new(&a); - let empty = b.case(CaseKind::Tag, constr(&b, 0, &[]), &[], None, INT); - check("empty_table", &b, empty, true); - assert!(std::ptr::eq(empty, known_case::reduce_constr(&b, empty))); - let subject = trace(&b, "subject", constr(&b, 0, &[])); - let c = b.case( - CaseKind::Tag, - subject, - &[arm(&b, 0, &[], b.int(42))], - None, - INT, - ); - check("effectful_subject", &b, c, false); - assert!(std::ptr::eq(c, known_case::reduce_constr(&b, c))); -} diff --git a/crates/nash-codegen/src/optimizer_tests/mod.rs b/crates/nash-codegen/src/optimizer_tests/mod.rs index 2e8c38e8..c3116f4a 100644 --- a/crates/nash-codegen/src/optimizer_tests/mod.rs +++ b/crates/nash-codegen/src/optimizer_tests/mod.rs @@ -1,17 +1,16 @@ //! Cross-phase optimizer semantics. Snapshots pair Core and UPLC before/after. //! Source-level snapshots live under build/tests/optimizer.rs. //! Performance assertions belong only in tools/optimizer-perf. -pub(crate) mod anf; +mod anf; mod beta; mod builtin_sharing; mod constant_sharing; -mod dead_bindings; -mod dead_recursive; +mod dead_code; mod force_delay; -mod known_bool; -mod known_constr; +mod known_case; mod propagate; mod single_use; mod small_inline; mod unused_params; -mod unused_params_pre_anf; + +mod inverse; diff --git a/crates/nash-codegen/src/optimizer_tests/propagate.rs b/crates/nash-codegen/src/optimizer_tests/propagate.rs index 5d458419..434b40f9 100644 --- a/crates/nash-codegen/src/optimizer_tests/propagate.rs +++ b/crates/nash-codegen/src/optimizer_tests/propagate.rs @@ -22,10 +22,6 @@ fn traced<'a>(b: &Builder<'a>, message: &'a str, value: &'a Core<'a>) -> &'a Cor fn check<'a>(name: &str, b: &Builder<'a>, core: &'a Core<'a>, fails: bool) { let before = anf::normalize(b, core); let after = propagate(b, before); - for phase in [before, after] { - anf::validate(phase).unwrap(); - hygiene::validate(phase, &[]).unwrap(); - } let baseline = crate::harness::eval_core_raw(b.arena, before); let candidate = crate::harness::eval_core_raw(b.arena, after); @@ -51,6 +47,10 @@ fn check<'a>(name: &str, b: &Builder<'a>, core: &'a Core<'a>, fails: bool) { ) ) ); + for phase in [before, after] { + anf::validate(phase).unwrap(); + hygiene::validate(phase, &[]).unwrap(); + } // Properties independent of the expected snapshot. assert_eq!(before.ty, after.ty); assert_eq!(pretty(after), pretty(propagate(b, after))); diff --git a/crates/nash-codegen/src/optimizer_tests/single_use.rs b/crates/nash-codegen/src/optimizer_tests/single_use.rs index bc50776e..923a2039 100644 --- a/crates/nash-codegen/src/optimizer_tests/single_use.rs +++ b/crates/nash-codegen/src/optimizer_tests/single_use.rs @@ -1,4 +1,4 @@ -//! Rule 3 candidate: paired Core/UPLC semantics, without budget assertions. +//! Accepted rule 3: paired Core/UPLC semantics, without budget assertions. use nash_ir::{ anf, build::Builder, @@ -22,10 +22,6 @@ fn traced<'a>(b: &Builder<'a>, message: &'a str, value: &'a Core<'a>) -> &'a Cor fn check<'a>(name: &str, b: &Builder<'a>, core: &'a Core<'a>, fails: bool) { let before = nash_ir::beta::simplify(b, anf::normalize(b, core)); let after = simplify(b, before); - for phase in [before, after] { - anf::validate(phase).unwrap(); - hygiene::validate(phase, &[]).unwrap(); - } let baseline = crate::harness::eval_core_raw(b.arena, before); let candidate = crate::harness::eval_core_raw(b.arena, after); @@ -51,6 +47,10 @@ fn check<'a>(name: &str, b: &Builder<'a>, core: &'a Core<'a>, fails: bool) { ) ) ); + for phase in [before, after] { + anf::validate(phase).unwrap(); + hygiene::validate(phase, &[]).unwrap(); + } // Properties independent of the expected snapshot. assert_eq!(before.ty, after.ty); assert_eq!(pretty(after), pretty(simplify(b, after))); diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__anf__ignored_field_strict.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__anf__ignored_field_strict.snap index 2c86e166..0e6cea44 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__anf__ignored_field_strict.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__anf__ignored_field_strict.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/optimizer_tests/anf.rs -assertion_line: 53 expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before static lifting\\n{}\\n--- core after static lifting / before ANF\\n{}\\n--- core after ANF\\n{}\\n--- rewritten core (no second ANF)\\n{}\\n--- baseline\\n{}\\n--- candidate\\n{}\",\npretty(fresh), pretty(lifted), pretty(first_anf), pretty(after),\nsemantic_output(&baseline), semantic_output(&normalized),))" --- --- unoptimized Core @@ -14,15 +13,12 @@ field@0/2 (constr 0 42 (trace "ignored field" in error)) (lam generated_1 (lam generated_2 generated_1)))) --- optimized Core let anf#1 : int = trace "ignored field" in error in -let anf#2 : @constr[0](int, int) = constr 0 42 anf#1 in -field@0/2 anf#2 +42 --- optimized UPLC (program 1.1.0 - [(lam builtin_7 - [(lam anf_3 - [(lam anf_4 (case anf_4 (lam generated_5 (lam generated_6 generated_5)))) - (constr 0 (con integer 42) anf_3)]) - (force [[builtin_7 (con string "ignored field")] (delay (error))])]) + [(lam builtin_3 + [(lam anf_2 (con integer 42)) + (force [[builtin_3 (con string "ignored field")] (delay (error))])]) (force (builtin trace))]) --- isolated pass --- core before static lifting diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__discarded_data_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__discarded_data_default.snap index 88672595..770e5034 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__discarded_data_default.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__discarded_data_default.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/optimizer_tests/builtin_sharing.rs -assertion_line: 45 expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\nnash_plutus::pretty::term(before), nash_plutus::pretty::term(after),\ncandidate.result, candidate.logs))" --- --- unoptimized Core @@ -25,26 +24,10 @@ case@Data iData 42 of [(builtin iData) (con integer 42)]]) --- optimized Core let anf#11 : Data = iData 42 in -case@Data anf#11 of - DataConstr unused#1 -> 42 - DataMap unused#2 -> 42 - DataList unused#8 -> 42 - DataI unused#9 -> 42 - DataB unused#10 -> 42 - _ -> trace "never" in error +42 --- optimized UPLC (program 1.1.0 - [(lam builtin_15 - [(lam anf_3 - [(lam generated_14 - (force - [[[[[[builtin_15 generated_14] (delay (con integer 42))] (delay (con integer 42))] - (delay (con integer 42))] - (delay (con integer 42))] - (delay (con integer 42))])) - anf_3]) - [(builtin iData) (con integer 42)]]) - (force (builtin chooseData))]) + [(lam anf_1 (con integer 42)) [(builtin iData) (con integer 42)]]) --- isolated pass --- uplc before [(lam generated_8 diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__lowered_data.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__lowered_data.snap index b77f969a..1cbbcb3a 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__lowered_data.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__builtin_sharing__lowered_data.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/optimizer_tests/builtin_sharing.rs -assertion_line: 45 expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\nnash_plutus::pretty::term(before), nash_plutus::pretty::term(after),\ncandidate.result, candidate.logs))" --- --- unoptimized Core @@ -21,24 +20,13 @@ case@Data iData 42 of [(builtin iData) (con integer 42)]]) --- optimized Core let anf#3 : Data = iData 42 in -case@Data anf#3 of - DataI decoded#2 -> trace "integer" in decoded#2 - _ -> error +trace "integer" in 42 --- optimized UPLC (program 1.1.0 - [(lam builtin_6 - [(lam builtin_7 - [(lam anf_1 - [(lam generated_5 - (force - [[[[[[builtin_7 generated_5] (delay (error))] (delay (error))] (delay (error))] - (delay - [(lam decoded_4 (force [[builtin_6 (con string "integer")] (delay decoded_4)])) - [(builtin unIData) generated_5]])] - (delay (error))])) - anf_1]) - [(builtin iData) (con integer 42)]]) - (force (builtin chooseData))]) + [(lam builtin_2 + [(lam anf_1 + (force [[builtin_2 (con string "integer")] (delay (con integer 42))])) + [(builtin iData) (con integer 42)]]) (force (builtin trace))]) --- isolated pass --- uplc before diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cascade.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cascade.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cascade.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cascade.snap index a56ac62e..a6e67100 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cascade.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cascade.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cleanup_safe_argument.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cleanup_safe_argument.snap similarity index 90% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cleanup_safe_argument.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cleanup_safe_argument.snap index bcd807d5..1818f5df 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cleanup_safe_argument.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cleanup_safe_argument.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 258 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(after), candidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cleanup_strict_argument.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cleanup_strict_argument.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cleanup_strict_argument.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cleanup_strict_argument.snap index 8b76ef96..6bd147d9 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__cleanup_strict_argument.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__cleanup_strict_argument.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 258 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(after), candidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__closure_with_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__closure_with_failure.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__closure_with_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__closure_with_failure.snap index 7c60b312..4f015119 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__closure_with_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__closure_with_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__dead_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__dead_capture.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__dead_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__dead_capture.snap index e1dc2a22..13727690 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__dead_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__dead_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__delayed_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__delayed_failure.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__delayed_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__delayed_failure.snap index e83ae11b..cb628d7f 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__delayed_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__delayed_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__diverging_call.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__diverging_call.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__diverging_call.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__diverging_call.snap index 35b05330..a3c9537d 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__diverging_call.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__diverging_call.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 199 expression: "crate::harness::pass_snapshot(b.arena, root,\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\", pretty(root),\npretty(after)))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__failure.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__failure.snap index fca6deb4..e8914351 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__forced_builtin.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__forced_builtin.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__forced_builtin.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__forced_builtin.snap index 575a6a9b..6cceb61a 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__forced_builtin.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__forced_builtin.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__forced_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__forced_failure.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__forced_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__forced_failure.snap index d75d3d70..2e404773 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__forced_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__forced_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__literal.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__literal.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__literal.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__literal.snap index 27956e2a..2faf90b7 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__literal.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__literal.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__partial_builtin.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__partial_builtin.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__partial_builtin.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__partial_builtin.snap index d99dde41..bba845ac 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__partial_builtin.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__partial_builtin.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__partial_strict_argument.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__partial_strict_argument.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__partial_strict_argument.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__partial_strict_argument.snap index f2c8369d..7777600d 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__partial_strict_argument.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__partial_strict_argument.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__safe_constructor.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__safe_constructor.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__safe_constructor.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__safe_constructor.snap index 9f414e85..e7c8f0dd 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__safe_constructor.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__safe_constructor.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__saturated_builtin.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__saturated_builtin.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__saturated_builtin.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__saturated_builtin.snap index bf763a42..b5b1cfb9 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__saturated_builtin.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__saturated_builtin.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__strict_constructor.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__strict_constructor.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__strict_constructor.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__strict_constructor.snap index b30700ea..67dc1a80 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__strict_constructor.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__strict_constructor.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__trace.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__trace.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__trace.snap index 3869e532..4bb3e84b 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__trace.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__trace.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__used_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__used_capture.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__used_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__used_capture.snap index 8bfc8468..3b226f2c 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_bindings__used_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__bindings__used_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_bindings.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 34 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cleanup_dead_delay_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cleanup_dead_delay_capture.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cleanup_dead_delay_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cleanup_dead_delay_capture.snap index 88293d1e..331c7f58 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cleanup_dead_delay_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cleanup_dead_delay_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 453 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(after), candidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cleanup_strict_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cleanup_strict_capture.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cleanup_strict_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cleanup_strict_capture.snap index e41733f8..e89d1ff6 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cleanup_strict_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cleanup_strict_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 453 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(after), candidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cold_reference.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cold_reference.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cold_reference.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cold_reference.snap index d514e104..b05b8328 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__cold_reference.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__cold_reference.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__delayed_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__delayed_capture.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__delayed_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__delayed_capture.snap index 3ff7a1ac..745a3109 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__delayed_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__delayed_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__lambda_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__lambda_capture.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__lambda_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__lambda_capture.snap index 38f600c9..5bcfa66b 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__lambda_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__lambda_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__live_delayed_worker.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__live_delayed_worker.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__live_delayed_worker.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__live_delayed_worker.snap index 01412e3b..f30d64ed 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__live_delayed_worker.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__live_delayed_worker.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__live_mutual_cycle.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__live_mutual_cycle.snap similarity index 83% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__live_mutual_cycle.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__live_mutual_cycle.snap index 6a463c6a..67605097 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__live_mutual_cycle.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__live_mutual_cycle.snap @@ -1,6 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs -assertion_line: 68 +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core @@ -95,28 +94,28 @@ in f#1 4 --- uplc before (program 1.1.0 - [(lam dispatch_11 + [(lam dispatch_7 [(lam f_1 [(lam dead_3 [(lam g_2 [f_1 (con integer 4)]) - (lam y_25 [dispatch_11 (constr 2 dispatch_11 y_25)])]) - (lam z_26 [dispatch_11 (constr 1 dispatch_11 z_26)])]) - (lam x_27 [dispatch_11 (constr 0 dispatch_11 x_27)])]) - (lam request_12 + (lam y_21 [dispatch_7 (constr 2 dispatch_7 y_21)])]) + (lam z_22 [dispatch_7 (constr 1 dispatch_7 z_22)])]) + (lam x_23 [dispatch_7 (constr 0 dispatch_7 x_23)])]) + (lam request_8 (case - request_12 - (lam self_13 + request_8 + (lam self_9 (lam x_4 (case [[(builtin equalsInteger) x_4] (con integer 0)] - [self_13 (constr 2 self_13 [[(builtin subtractInteger) x_4] (con integer 1)])] + [self_9 (constr 2 self_9 [[(builtin subtractInteger) x_4] (con integer 1)])] (con integer 42)))) - (lam self_17 (lam z_6 (error))) - (lam self_21 + (lam self_13 (lam z_6 (error))) + (lam self_17 (lam y_5 (case [[(builtin equalsInteger) y_5] (con integer 0)] - [self_21 (constr 0 self_21 [[(builtin subtractInteger) y_5] (con integer 1)])] + [self_17 (constr 0 self_17 [[(builtin subtractInteger) y_5] (con integer 1)])] (con integer 42))))))]) --- core after letrec @@ -130,25 +129,25 @@ in f#1 4 --- uplc after (program 1.1.0 - [(lam dispatch_28 + [(lam dispatch_24 [(lam f_1 [(lam g_2 [f_1 (con integer 4)]) - (lam y_36 [dispatch_28 (constr 1 dispatch_28 y_36)])]) - (lam x_37 [dispatch_28 (constr 0 dispatch_28 x_37)])]) - (lam request_29 + (lam y_32 [dispatch_24 (constr 1 dispatch_24 y_32)])]) + (lam x_33 [dispatch_24 (constr 0 dispatch_24 x_33)])]) + (lam request_25 (case - request_29 - (lam self_30 + request_25 + (lam self_26 (lam x_4 (case [[(builtin equalsInteger) x_4] (con integer 0)] - [self_30 (constr 1 self_30 [[(builtin subtractInteger) x_4] (con integer 1)])] + [self_26 (constr 1 self_26 [[(builtin subtractInteger) x_4] (con integer 1)])] (con integer 42)))) - (lam self_33 + (lam self_29 (lam y_5 (case [[(builtin equalsInteger) y_5] (con integer 0)] - [self_33 (constr 0 self_33 [[(builtin subtractInteger) y_5] (con integer 1)])] + [self_29 (constr 0 self_29 [[(builtin subtractInteger) y_5] (con integer 1)])] (con integer 42))))))]) --- result (con integer 42) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__nested_dead_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__nested_dead_capture.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__nested_dead_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__nested_dead_capture.snap index 77265b24..e8c8b385 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__nested_dead_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__nested_dead_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__nested_live_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__nested_live_capture.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__nested_live_capture.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__nested_live_capture.snap index 42531d5b..313af027 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__nested_live_capture.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__nested_live_capture.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__partial.snap similarity index 79% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__partial.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__partial.snap index ee2f710a..c712f427 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__partial.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__partial.snap @@ -1,6 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs -assertion_line: 68 +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core @@ -42,16 +41,16 @@ in f#1 40) 2 --- uplc before (program 1.1.0 - [[(lam dispatch_24 + [[(lam dispatch_23 [(lam f_1 [(lam dead_2 [f_1 (con integer 40)]) - (lam z_34 [dispatch_24 (constr 1 dispatch_24 z_34)])]) - (lam x_35 (lam y_36 [dispatch_24 (constr 0 dispatch_24 x_35 y_36)]))]) - (lam request_25 + (lam z_33 [dispatch_23 (constr 1 dispatch_23 z_33)])]) + (lam x_34 (lam y_35 [dispatch_23 (constr 0 dispatch_23 x_34 y_35)]))]) + (lam request_24 (case - request_25 - (lam self_26 (lam x_3 (lam y_4 [[(builtin addInteger) x_3] y_4]))) - (lam self_30 (lam z_5 (error)))))] + request_24 + (lam self_25 (lam x_3 (lam y_4 [[(builtin addInteger) x_3] y_4]))) + (lam self_29 (lam z_5 (error)))))] (con integer 2)]) --- core after (letrec @@ -61,8 +60,8 @@ f#1 40) 2 --- uplc after (program 1.1.0 [[(lam f_1 [f_1 (con integer 40)]) - [(lam self_37 [self_37 self_37]) - (lam self_37 (lam x_3 (lam y_4 [[(builtin addInteger) x_3] y_4])))]] + [(lam self_36 [self_36 self_36]) + (lam self_36 (lam x_3 (lam y_4 [[(builtin addInteger) x_3] y_4])))]] (con integer 2)]) --- result (con integer 42) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__reachable_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__reachable_failure.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__reachable_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__reachable_failure.snap index 631d2622..56595997 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__reachable_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__reachable_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__returned.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__returned.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__returned.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__returned.snap index 94699072..3e23b17b 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__returned.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__returned.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__singleton_metadata.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__singleton_metadata.snap similarity index 85% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__singleton_metadata.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__singleton_metadata.snap index d496c3bb..15cf3d7f 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__singleton_metadata.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__singleton_metadata.snap @@ -1,6 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs -assertion_line: 68 +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core @@ -71,23 +70,23 @@ f#1 40 3 --- uplc before (program 1.1.0 [(lam capture_6 - [(lam dispatch_10 + [(lam dispatch_7 [(lam f_1 [(lam dead_2 [[f_1 (con integer 40)] (con integer 3)]) - (lam z_20 [dispatch_10 (constr 1 dispatch_10 z_20)])]) - (lam static_21 (lam n_22 [dispatch_10 (constr 0 dispatch_10 static_21 n_22)]))]) - (lam request_11 + (lam z_17 [dispatch_7 (constr 1 dispatch_7 z_17)])]) + (lam static_18 (lam n_19 [dispatch_7 (constr 0 dispatch_7 static_18 n_19)]))]) + (lam request_8 (case - request_11 - (lam self_12 + request_8 + (lam self_9 (lam static_3 (lam n_4 (case [[(builtin equalsInteger) n_4] (con integer 0)] - [self_12 - (constr 0 self_12 static_3 [[(builtin subtractInteger) n_4] (con integer 1)])] + [self_9 + (constr 0 self_9 static_3 [[(builtin subtractInteger) n_4] (con integer 1)])] [[(builtin addInteger) static_3] capture_6])))) - (lam self_16 (lam z_5 (error)))))]) + (lam self_13 (lam z_5 (error)))))]) (con integer 2)]) --- core after let capture#6 : int = 2 in @@ -103,12 +102,12 @@ f#1 40 3 [(lam f_1 [[f_1 (con integer 40)] (con integer 3)]) (lam static_3 (lam n_4 - [[(lam self_23 [self_23 self_23]) - (lam self_23 + [[(lam self_20 [self_20 self_20]) + (lam self_20 (lam n_4 (case [[(builtin equalsInteger) n_4] (con integer 0)] - [[self_23 self_23] [[(builtin subtractInteger) n_4] (con integer 1)]] + [[self_20 self_20] [[(builtin subtractInteger) n_4] (con integer 1)]] [[(builtin addInteger) static_3] capture_6])))] n_4]))]) (con integer 2)]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__transitive.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__transitive.snap similarity index 98% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__transitive.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__transitive.snap index bf77e1ac..2c617bdb 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__transitive.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__transitive.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_cycle.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_cycle.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_cycle.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_cycle.snap index af35f79d..6b862e1d 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_cycle.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_cycle.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_delayed_worker.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_delayed_worker.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_delayed_worker.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_delayed_worker.snap index 50fc3036..7344fcb5 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_delayed_worker.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_delayed_worker.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_failure.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_failure.snap index eb690017..cd1d9243 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_self.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_self.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_self.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_self.snap index 8e257aca..a5a8617f 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_recursive__unused_self.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__dead_code__recursive__unused_self.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/dead_recursive.rs +source: crates/nash-codegen/src/optimizer_tests/dead_code.rs assertion_line: 68 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__cold.snap new file mode 100644 index 00000000..8aa920c3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__cold.snap @@ -0,0 +1,47 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bool true of + True -> 7 + False -> unIData (iData (trace "cold" in 42)) +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool True) + [(builtin unIData) + [(builtin iData) + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 42))])]] + (con integer 7))) +--- optimized Core +7 +--- optimized UPLC +(program 1.1.0 (con integer 7)) +--- isolated pass +--- core before +case@Bool true of + True -> 7 + False -> unIData (iData (trace "cold" in 42)) +--- uplc before +(program 1.1.0 + (case + (con bool True) + [(builtin unIData) + [(builtin iData) + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 42))])]] + (con integer 7))) +--- core after +case@Bool true of + True -> 7 + False -> trace "cold" in 42 +--- uplc after +(program 1.1.0 + (case + (con bool True) + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 42))]) + (con integer 7))) +--- result +(con integer 7) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__decode_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__decode_failure.snap new file mode 100644 index 00000000..48dd4dc8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__decode_failure.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (unIData 1)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con integer 1)]]]) +--- optimized Core +unIData 1 +--- optimized UPLC +(program 1.1.0 [(builtin unIData) (con integer 1)]) +--- isolated pass +--- core before +unIData (iData (unIData 1)) +--- uplc before +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con integer 1)]]]) +--- core after +unIData 1 +--- uplc after +(program 1.1.0 [(builtin unIData) (con integer 1)]) +--- result +error: Runtime(NotData(Integer(1))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__decoded.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__decoded.snap new file mode 100644 index 00000000..a3564075 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__decoded.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (unIData (con data (I 42)))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con data (I 42))]]]) +--- optimized Core +unIData (con data (I 42)) +--- optimized UPLC +(program 1.1.0 [(builtin unIData) (con data (I 42))]) +--- isolated pass +--- core before +unIData (iData (unIData (con data (I 42)))) +--- uplc before +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con data (I 42))]]]) +--- core after +unIData (con data (I 42)) +--- uplc after +(program 1.1.0 [(builtin unIData) (con data (I 42))]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__failure.snap new file mode 100644 index 00000000..8cd4ed78 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__failure.snap @@ -0,0 +1,43 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (trace "before failure" in error)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before failure")] (delay (error))])]]) +--- optimized Core +let anf#1 : int = trace "before failure" in error in +let anf#2 : Data = iData anf#1 in +unIData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_3 [(lam anf_4 [(builtin unIData) anf_4]) [(builtin iData) anf_3]]) + (force [[builtin_5 (con string "before failure")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +unIData (iData (trace "before failure" in error)) +--- uplc before +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before failure")] (delay (error))])]]) +--- core after +unIData (iData (trace "before failure" in error)) +--- uplc after +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before failure")] (delay (error))])]]) +--- result +error: ExplicitErrorTerm +--- logs +["before failure"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__forged_metadata.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__forged_metadata.snap new file mode 100644 index 00000000..e423198c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__forged_metadata.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData true) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool True)]]) +--- optimized Core +let anf#1 : Data = iData true in +unIData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unIData) anf_2]) [(builtin iData) (con bool True)]]) +--- isolated pass +--- core before +unIData (iData true) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool True)]]) +--- core after +unIData (iData true) +--- uplc after +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__literal.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__literal.snap new file mode 100644 index 00000000..2475edde --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__literal.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData 42) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 42)]]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- core before +unIData (iData 42) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 42)]]) +--- core after +42 +--- uplc after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__negative.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__negative.snap new file mode 100644 index 00000000..f31da4eb --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__negative.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData -42) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer -42)]]) +--- optimized Core +-42 +--- optimized UPLC +(program 1.1.0 (con integer -42)) +--- isolated pass +--- core before +unIData (iData -42) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer -42)]]) +--- core after +-42 +--- uplc after +(program 1.1.0 (con integer -42)) +--- result +(con integer -42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__nested.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__nested.snap new file mode 100644 index 00000000..79e7228c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__nested.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (unIData (iData 42))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) + [(builtin iData) [(builtin unIData) [(builtin iData) (con integer 42)]]]]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- core before +unIData (iData (unIData (iData 42))) +--- uplc before +(program 1.1.0 + [(builtin unIData) + [(builtin iData) [(builtin unIData) [(builtin iData) (con integer 42)]]]]) +--- core after +42 +--- uplc after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__partial.snap new file mode 100644 index 00000000..27cd4c5c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__partial.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData 42) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 42)]]) +--- optimized Core +let anf#1 : Data = iData 42 in +unIData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unIData) anf_2]) [(builtin iData) (con integer 42)]]) +--- isolated pass +--- core before +unIData (iData 42) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 42)]]) +--- core after +unIData (iData 42) +--- uplc after +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 42)]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_bound.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_bound.snap new file mode 100644 index 00000000..568e581a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_bound.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +trace "after encoding" in unBData alias#7 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unBData) alias_7])])) + encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- optimized Core +let x#1 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#2 : Data = bData x#1 in +trace "after encoding" in x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 (force [[builtin_5 (con string "after encoding")] (delay x_3)])) + [(builtin bData) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con bytestring #68656c6c6f))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +trace "after encoding" in unBData alias#7 +--- uplc before +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unBData) alias_7])])) + encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- core after +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +trace "after encoding" in x#5 +--- uplc after +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 + (force [[(force (builtin trace)) (con string "after encoding")] (delay x_5)])) + encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- result +(con bytestring #68656c6c6f) +--- logs +["once", "after encoding"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_bound_invalid.snap new file mode 100644 index 00000000..334d5f27 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_bound_invalid.snap @@ -0,0 +1,65 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#5 : bytes = trace "operand" in false in +let encoded#6 : Data = bData x#5 in +trace "must not run" in unBData encoded#6 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unBData) encoded_6])])) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- optimized Core +let x#1 : bytes = trace "operand" in false in +let encoded#2 : Data = bData x#1 in +trace "must not run" in unBData encoded#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 + (force + [[builtin_5 (con string "must not run")] (delay [(builtin unBData) encoded_4])])) + [(builtin bData) x_3]]) + (force [[builtin_5 (con string "operand")] (delay (con bool False))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#5 : bytes = trace "operand" in false in +let encoded#6 : Data = bData x#5 in +trace "must not run" in unBData encoded#6 +--- uplc before +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unBData) encoded_6])])) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- core after +let x#5 : bytes = trace "operand" in false in +let encoded#6 : Data = bData x#5 in +trace "must not run" in unBData encoded#6 +--- uplc after +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unBData) encoded_6])])) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- result +error: Runtime(TypeMismatch(ByteString, Boolean(false))) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_captured.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_captured.snap new file mode 100644 index 00000000..9f88a2ee --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_captured.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +force (delay (unBData alias#7)) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 (force (delay [(builtin unBData) alias_7]))) encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- optimized Core +let x#1 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#2 : Data = bData x#1 in +x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 [(lam encoded_4 x_3) [(builtin bData) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con bytestring #68656c6c6f))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +force (delay (unBData alias#7)) +--- uplc before +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 (force (delay [(builtin unBData) alias_7]))) encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- core after +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +force (delay x#5) +--- uplc after +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 [(lam alias_7 (force (delay x_5))) encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- result +(con bytestring #68656c6c6f) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_cold.snap new file mode 100644 index 00000000..793f6967 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_cold.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bool true of + True -> (con bytestring #68656c6c6f) + False -> unBData (bData (trace "cold" in (con bytestring #68656c6c6f))) +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool True) + [(builtin unBData) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con bytestring #68656c6c6f))])]] + (con bytestring #68656c6c6f))) +--- optimized Core +(con bytestring #68656c6c6f) +--- optimized UPLC +(program 1.1.0 (con bytestring #68656c6c6f)) +--- isolated pass +--- core before +case@Bool true of + True -> (con bytestring #68656c6c6f) + False -> unBData (bData (trace "cold" in (con bytestring #68656c6c6f))) +--- uplc before +(program 1.1.0 + (case + (con bool True) + [(builtin unBData) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con bytestring #68656c6c6f))])]] + (con bytestring #68656c6c6f))) +--- core after +case@Bool true of + True -> (con bytestring #68656c6c6f) + False -> trace "cold" in (con bytestring #68656c6c6f) +--- uplc after +(program 1.1.0 + (case + (con bool True) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con bytestring #68656c6c6f))]) + (con bytestring #68656c6c6f))) +--- result +(con bytestring #68656c6c6f) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_decode_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_decode_failure.snap new file mode 100644 index 00000000..f7075f83 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_decode_failure.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData (unBData 0)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unBData) [(builtin bData) [(builtin unBData) (con integer 0)]]]) +--- optimized Core +unBData 0 +--- optimized UPLC +(program 1.1.0 [(builtin unBData) (con integer 0)]) +--- isolated pass +--- core before +unBData (bData (unBData 0)) +--- uplc before +(program 1.1.0 + [(builtin unBData) [(builtin bData) [(builtin unBData) (con integer 0)]]]) +--- core after +unBData 0 +--- uplc after +(program 1.1.0 [(builtin unBData) (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_decoded.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_decoded.snap new file mode 100644 index 00000000..eb0ad132 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_decoded.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData (unBData (con data (B #68656c6c6f)))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unBData) + [(builtin bData) [(builtin unBData) (con data (B #68656c6c6f))]]]) +--- optimized Core +unBData (con data (B #68656c6c6f)) +--- optimized UPLC +(program 1.1.0 [(builtin unBData) (con data (B #68656c6c6f))]) +--- isolated pass +--- core before +unBData (bData (unBData (con data (B #68656c6c6f)))) +--- uplc before +(program 1.1.0 + [(builtin unBData) + [(builtin bData) [(builtin unBData) (con data (B #68656c6c6f))]]]) +--- core after +unBData (con data (B #68656c6c6f)) +--- uplc after +(program 1.1.0 [(builtin unBData) (con data (B #68656c6c6f))]) +--- result +(con bytestring #68656c6c6f) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_direct.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_direct.snap new file mode 100644 index 00000000..2fdf05d0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_direct.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData (con bytestring #68656c6c6f)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]]) +--- optimized Core +(con bytestring #68656c6c6f) +--- optimized UPLC +(program 1.1.0 (con bytestring #68656c6c6f)) +--- isolated pass +--- core before +unBData (bData (con bytestring #68656c6c6f)) +--- uplc before +(program 1.1.0 + [(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]]) +--- core after +(con bytestring #68656c6c6f) +--- uplc after +(program 1.1.0 (con bytestring #68656c6c6f)) +--- result +(con bytestring #68656c6c6f) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_escaping.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_escaping.snap new file mode 100644 index 00000000..ea909673 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_escaping.snap @@ -0,0 +1,67 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +constr 0 encoded#6 (unBData alias#7) (unBData alias#7) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 + (constr 0 encoded_6 [(builtin unBData) alias_7] [(builtin unBData) alias_7])) + encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- optimized Core +let x#1 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#2 : Data = bData x#1 in +constr 0 encoded#2 x#1 x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 [(lam encoded_4 (constr 0 encoded_4 x_3 x_3)) [(builtin bData) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con bytestring #68656c6c6f))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +constr 0 encoded#6 (unBData alias#7) (unBData alias#7) +--- uplc before +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 + [(lam alias_7 + (constr 0 encoded_6 [(builtin unBData) alias_7] [(builtin unBData) alias_7])) + encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- core after +let x#5 : bytes = trace "once" in (con bytestring #68656c6c6f) in +let encoded#6 : Data = bData x#5 in +let alias#7 : Data = encoded#6 in +constr 0 encoded#6 x#5 x#5 +--- uplc after +(program 1.1.0 + [(lam x_5 + [(lam encoded_6 [(lam alias_7 (constr 0 encoded_6 x_5 x_5)) encoded_6]) + [(builtin bData) x_5]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #68656c6c6f))])]) +--- result +(constr 0 + (con data (B #68656c6c6f)) + (con bytestring #68656c6c6f) + (con bytestring #68656c6c6f)) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_oversaturated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_oversaturated.snap new file mode 100644 index 00000000..2974680e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_oversaturated.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData (con bytestring #68656c6c6f)) 1 +--- unoptimized UPLC +(program 1.1.0 + [[(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]] + (con integer 1)]) +--- optimized Core +(con bytestring #68656c6c6f) 1 +--- optimized UPLC +(program 1.1.0 [(con bytestring #68656c6c6f) (con integer 1)]) +--- isolated pass +--- core before +unBData (bData (con bytestring #68656c6c6f)) 1 +--- uplc before +(program 1.1.0 + [[(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]] + (con integer 1)]) +--- core after +(con bytestring #68656c6c6f) 1 +--- uplc after +(program 1.1.0 [(con bytestring #68656c6c6f) (con integer 1)]) +--- result +error: NonFunctionApplication(Con(Integer(1)), Con(ByteString([104, 101, 108, 108, 111]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_partial.snap new file mode 100644 index 00000000..cb110be4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_partial.snap @@ -0,0 +1,31 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData (con bytestring #68656c6c6f)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]]) +--- optimized Core +let anf#1 : Data = bData (con bytestring #68656c6c6f) in +unBData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unBData) anf_2]) + [(builtin bData) (con bytestring #68656c6c6f)]]) +--- isolated pass +--- core before +unBData (bData (con bytestring #68656c6c6f)) +--- uplc before +(program 1.1.0 + [(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]]) +--- core after +unBData (bData (con bytestring #68656c6c6f)) +--- uplc after +(program 1.1.0 + [(builtin unBData) [(builtin bData) (con bytestring #68656c6c6f)]]) +--- result +(con bytestring #68656c6c6f) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_reverse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_reverse.snap new file mode 100644 index 00000000..a63e7f5a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_reverse.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +bData (unBData (con data (B #68656c6c6f))) +--- unoptimized UPLC +(program 1.1.0 [(builtin bData) [(builtin unBData) (con data (B #68656c6c6f))]]) +--- optimized Core +(con data (B #68656c6c6f)) +--- optimized UPLC +(program 1.1.0 (con data (B #68656c6c6f))) +--- isolated pass +--- core before +bData (unBData (con data (B #68656c6c6f))) +--- uplc before +(program 1.1.0 [(builtin bData) [(builtin unBData) (con data (B #68656c6c6f))]]) +--- core after +(con data (B #68656c6c6f)) +--- uplc after +(program 1.1.0 (con data (B #68656c6c6f))) +--- result +(con data (B #68656c6c6f)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_reverse_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_reverse_bound_invalid.snap new file mode 100644 index 00000000..f2691673 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_reverse_bound_invalid.snap @@ -0,0 +1,58 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let encoded#6 : Data = 0 in +let x#5 : bytes = unBData encoded#6 in +trace "must not run" in bData x#5 +--- unoptimized UPLC +(program 1.1.0 + [(lam encoded_6 + [(lam x_5 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin bData) x_5])])) + [(builtin unBData) encoded_6]]) + (con integer 0)]) +--- optimized Core +let x#2 : bytes = unBData 0 in +trace "must not run" in bData x#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam x_1 + (force [[builtin_2 (con string "must not run")] (delay [(builtin bData) x_1])])) + [(builtin unBData) (con integer 0)]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let encoded#6 : Data = 0 in +let x#5 : bytes = unBData encoded#6 in +trace "must not run" in bData x#5 +--- uplc before +(program 1.1.0 + [(lam encoded_6 + [(lam x_5 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin bData) x_5])])) + [(builtin unBData) encoded_6]]) + (con integer 0)]) +--- core after +let encoded#6 : Data = 0 in +let x#5 : bytes = unBData encoded#6 in +trace "must not run" in bData x#5 +--- uplc after +(program 1.1.0 + [(lam encoded_6 + [(lam x_5 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin bData) x_5])])) + [(builtin unBData) encoded_6]]) + (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_trace.snap new file mode 100644 index 00000000..dec8a1c0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_trace.snap @@ -0,0 +1,42 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData (trace "operand" in (con bytestring #68656c6c6f))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unBData) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #68656c6c6f))])]]) +--- optimized Core +trace "operand" in (con bytestring #68656c6c6f) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force + [[builtin_1 (con string "operand")] (delay (con bytestring #68656c6c6f))])) + (force (builtin trace))]) +--- isolated pass +--- core before +unBData (bData (trace "operand" in (con bytestring #68656c6c6f))) +--- uplc before +(program 1.1.0 + [(builtin unBData) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #68656c6c6f))])]]) +--- core after +trace "operand" in (con bytestring #68656c6c6f) +--- uplc after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #68656c6c6f))])) +--- result +(con bytestring #68656c6c6f) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_unknown_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_unknown_invalid.snap new file mode 100644 index 00000000..024022ec --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_unknown_invalid.snap @@ -0,0 +1,33 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\unknown#8 : bytes -> unBData (bData unknown#8)) false +--- unoptimized UPLC +(program 1.1.0 + [(lam unknown_8 [(builtin unBData) [(builtin bData) unknown_8]]) + (con bool False)]) +--- optimized Core +let anf#2 : Data = bData false in +unBData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unBData) anf_1]) [(builtin bData) (con bool False)]]) +--- isolated pass +--- core before +(\unknown#8 : bytes -> unBData (bData unknown#8)) false +--- uplc before +(program 1.1.0 + [(lam unknown_8 [(builtin unBData) [(builtin bData) unknown_8]]) + (con bool False)]) +--- core after +(\unknown#8 : bytes -> unBData (bData unknown#8)) false +--- uplc after +(program 1.1.0 + [(lam unknown_8 [(builtin unBData) [(builtin bData) unknown_8]]) + (con bool False)]) +--- result +error: Runtime(TypeMismatch(ByteString, Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_wrong_kind.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_wrong_kind.snap new file mode 100644 index 00000000..f4085baf --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_bytes_wrong_kind.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unBData (bData false) +--- unoptimized UPLC +(program 1.1.0 [(builtin unBData) [(builtin bData) (con bool False)]]) +--- optimized Core +let anf#1 : Data = bData false in +unBData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unBData) anf_2]) [(builtin bData) (con bool False)]]) +--- isolated pass +--- core before +unBData (bData false) +--- uplc before +(program 1.1.0 [(builtin unBData) [(builtin bData) (con bool False)]]) +--- core after +unBData (bData false) +--- uplc after +(program 1.1.0 [(builtin unBData) [(builtin bData) (con bool False)]]) +--- result +error: Runtime(TypeMismatch(ByteString, Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_bad_fields.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_bad_fields.snap new file mode 100644 index 00000000..cf931787 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_bad_fields.snap @@ -0,0 +1,58 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let tag#22 : int = 0 in +let fields#21 : list Data = false in +let constructor#23 : Data = constrData tag#22 fields#21 in +sndPair (unConstrData constructor#23) +--- unoptimized UPLC +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(force (force (builtin sndPair))) [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con bool False)]) + (con integer 0)]) +--- optimized Core +let fields#2 : list Data = false in +let constructor#3 : Data = constrData 0 fields#2 in +fields#2 +--- optimized UPLC +(program 1.1.0 + [(lam fields_1 + [(lam constructor_4 fields_1) [[(builtin constrData) (con integer 0)] fields_1]]) + (con bool False)]) +--- isolated pass +--- core before +let tag#22 : int = 0 in +let fields#21 : list Data = false in +let constructor#23 : Data = constrData tag#22 fields#21 in +sndPair (unConstrData constructor#23) +--- uplc before +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(force (force (builtin sndPair))) [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con bool False)]) + (con integer 0)]) +--- core after +let tag#22 : int = 0 in +let fields#21 : list Data = false in +let constructor#23 : Data = constrData tag#22 fields#21 in +fields#21 +--- uplc after +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 fields_21) [[(builtin constrData) tag_22] fields_21]]) + (con bool False)]) + (con integer 0)]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_bad_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_bad_tag.snap new file mode 100644 index 00000000..88d7c36c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_bad_tag.snap @@ -0,0 +1,70 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let tag#22 : int = false in +let fields#21 : list Data = trace "fields evaluated" in (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +fstPair (unConstrData constructor#23) +--- unoptimized UPLC +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(force (force (builtin fstPair))) [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (force + [[(force (builtin trace)) (con string "fields evaluated")] + (delay (con (list data) [(I 7)]))])]) + (con bool False)]) +--- optimized Core +let tag#1 : int = false in +let fields#2 : list Data = trace "fields evaluated" in (con (list data) [(I 7)]) in +let constructor#3 : Data = constrData tag#1 fields#2 in +tag#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam tag_4 + [(lam fields_5 + [(lam constructor_6 tag_4) [[(builtin constrData) tag_4] fields_5]]) + (force + [[builtin_7 (con string "fields evaluated")] (delay (con (list data) [(I 7)]))])]) + (con bool False)]) + (force (builtin trace))]) +--- isolated pass +--- core before +let tag#22 : int = false in +let fields#21 : list Data = trace "fields evaluated" in (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +fstPair (unConstrData constructor#23) +--- uplc before +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(force (force (builtin fstPair))) [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (force + [[(force (builtin trace)) (con string "fields evaluated")] + (delay (con (list data) [(I 7)]))])]) + (con bool False)]) +--- core after +let tag#22 : int = false in +let fields#21 : list Data = trace "fields evaluated" in (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +tag#22 +--- uplc after +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 tag_22) [[(builtin constrData) tag_22] fields_21]]) + (force + [[(force (builtin trace)) (con string "fields evaluated")] + (delay (con (list data) [(I 7)]))])]) + (con bool False)]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(false))) +--- logs +["fields evaluated"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_fields.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_fields.snap new file mode 100644 index 00000000..d16cfee8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_fields.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +sndPair payload#24 +--- unoptimized UPLC +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 [(force (force (builtin sndPair))) payload_24]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- optimized Core +let fields#2 : list Data = (con (list data) [(I 7)]) in +let constructor#3 : Data = constrData 0 fields#2 in +let payload#4 : 'erased = unConstrData constructor#3 in +fields#2 +--- optimized UPLC +(program 1.1.0 + [(lam fields_1 + [(lam constructor_5 + [(lam payload_6 fields_1) [(builtin unConstrData) constructor_5]]) + [[(builtin constrData) (con integer 0)] fields_1]]) + (con (list data) [(I 7)])]) +--- isolated pass +--- core before +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +sndPair payload#24 +--- uplc before +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 [(force (force (builtin sndPair))) payload_24]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- core after +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +fields#21 +--- uplc after +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 fields_21) [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- result +(con (list data) [(I 7)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_known_reverse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_known_reverse.snap new file mode 100644 index 00000000..83b06f38 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_known_reverse.snap @@ -0,0 +1,64 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let constructor#23 : Data = (con data (Constr 3 [I 7])) in +let payload#24 : 'erased = unConstrData constructor#23 in +trace "after decoding" in constrData (fstPair payload#24) (sndPair payload#24) +--- unoptimized UPLC +(program 1.1.0 + [(lam constructor_23 + [(lam payload_24 + (force + [[(force (builtin trace)) (con string "after decoding")] + (delay + [[(builtin constrData) [(force (force (builtin fstPair))) payload_24]] + [(force (force (builtin sndPair))) payload_24]])])) + [(builtin unConstrData) constructor_23]]) + (con data (Constr 3 [I 7]))]) +--- optimized Core +let constructor#1 : Data = (con data (Constr 3 [I 7])) in +let payload#2 : 'erased = unConstrData constructor#1 in +trace "after decoding" in constructor#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam constructor_3 + [(lam payload_4 + (force [[builtin_5 (con string "after decoding")] (delay constructor_3)])) + [(builtin unConstrData) constructor_3]]) + (con data (Constr 3 [I 7]))]) + (force (builtin trace))]) +--- isolated pass +--- core before +let constructor#23 : Data = (con data (Constr 3 [I 7])) in +let payload#24 : 'erased = unConstrData constructor#23 in +trace "after decoding" in constrData (fstPair payload#24) (sndPair payload#24) +--- uplc before +(program 1.1.0 + [(lam constructor_23 + [(lam payload_24 + (force + [[(force (builtin trace)) (con string "after decoding")] + (delay + [[(builtin constrData) [(force (force (builtin fstPair))) payload_24]] + [(force (force (builtin sndPair))) payload_24]])])) + [(builtin unConstrData) constructor_23]]) + (con data (Constr 3 [I 7]))]) +--- core after +let constructor#23 : Data = (con data (Constr 3 [I 7])) in +let payload#24 : 'erased = unConstrData constructor#23 in +trace "after decoding" in constructor#23 +--- uplc after +(program 1.1.0 + [(lam constructor_23 + [(lam payload_24 + (force + [[(force (builtin trace)) (con string "after decoding")] (delay constructor_23)])) + [(builtin unConstrData) constructor_23]]) + (con data (Constr 3 [I 7]))]) +--- result +(con data (Constr 3 [I 7])) +--- logs +["after decoding"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_rebuild.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_rebuild.snap new file mode 100644 index 00000000..39e761ee --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_rebuild.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +constrData (fstPair payload#24) (sndPair payload#24) +--- unoptimized UPLC +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 + [[(builtin constrData) [(force (force (builtin fstPair))) payload_24]] + [(force (force (builtin sndPair))) payload_24]]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- optimized Core +let fields#2 : list Data = (con (list data) [(I 7)]) in +let constructor#3 : Data = constrData 0 fields#2 in +let payload#4 : 'erased = unConstrData constructor#3 in +constrData 0 fields#2 +--- optimized UPLC +(program 1.1.0 + [(lam partial_7 + [(lam fields_1 + [(lam constructor_5 + [(lam payload_6 [partial_7 fields_1]) [(builtin unConstrData) constructor_5]]) + [partial_7 fields_1]]) + (con (list data) [(I 7)])]) + [(builtin constrData) (con integer 0)]]) +--- isolated pass +--- core before +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +constrData (fstPair payload#24) (sndPair payload#24) +--- uplc before +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 + [[(builtin constrData) [(force (force (builtin fstPair))) payload_24]] + [(force (force (builtin sndPair))) payload_24]]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- core after +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +constrData tag#22 fields#21 +--- uplc after +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 [[(builtin constrData) tag_22] fields_21]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- result +(con data (Constr 0 [I 7])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_tag.snap new file mode 100644 index 00000000..1a3113ef --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_tag.snap @@ -0,0 +1,65 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +fstPair payload#24 +--- unoptimized UPLC +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 [(force (force (builtin fstPair))) payload_24]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- optimized Core +let constructor#3 : Data = constrData 0 (con (list data) [(I 7)]) in +let payload#4 : 'erased = unConstrData constructor#3 in +0 +--- optimized UPLC +(program 1.1.0 + [(lam constructor_1 + [(lam payload_2 (con integer 0)) [(builtin unConstrData) constructor_1]]) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 7)])]]) +--- isolated pass +--- core before +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +fstPair payload#24 +--- uplc before +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 [(force (force (builtin fstPair))) payload_24]) + [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- core after +let tag#22 : int = 0 in +let fields#21 : list Data = (con (list data) [(I 7)]) in +let constructor#23 : Data = constrData tag#22 fields#21 in +let payload#24 : 'erased = unConstrData constructor#23 in +tag#22 +--- uplc after +(program 1.1.0 + [(lam tag_22 + [(lam fields_21 + [(lam constructor_23 + [(lam payload_24 tag_22) [(builtin unConstrData) constructor_23]]) + [[(builtin constrData) tag_22] fields_21]]) + (con (list data) [(I 7)])]) + (con integer 0)]) +--- result +(con integer 0) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_wrong_variant.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_wrong_variant.snap new file mode 100644 index 00000000..34037b7e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_constructor_wrong_variant.snap @@ -0,0 +1,64 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let constructor#23 : Data = (con data (I 7)) in +let payload#24 : 'erased = unConstrData constructor#23 in +trace "after decoding" in constrData (fstPair payload#24) (sndPair payload#24) +--- unoptimized UPLC +(program 1.1.0 + [(lam constructor_23 + [(lam payload_24 + (force + [[(force (builtin trace)) (con string "after decoding")] + (delay + [[(builtin constrData) [(force (force (builtin fstPair))) payload_24]] + [(force (force (builtin sndPair))) payload_24]])])) + [(builtin unConstrData) constructor_23]]) + (con data (I 7))]) +--- optimized Core +let constructor#1 : Data = (con data (I 7)) in +let payload#2 : 'erased = unConstrData constructor#1 in +trace "after decoding" in constructor#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam constructor_3 + [(lam payload_4 + (force [[builtin_5 (con string "after decoding")] (delay constructor_3)])) + [(builtin unConstrData) constructor_3]]) + (con data (I 7))]) + (force (builtin trace))]) +--- isolated pass +--- core before +let constructor#23 : Data = (con data (I 7)) in +let payload#24 : 'erased = unConstrData constructor#23 in +trace "after decoding" in constrData (fstPair payload#24) (sndPair payload#24) +--- uplc before +(program 1.1.0 + [(lam constructor_23 + [(lam payload_24 + (force + [[(force (builtin trace)) (con string "after decoding")] + (delay + [[(builtin constrData) [(force (force (builtin fstPair))) payload_24]] + [(force (force (builtin sndPair))) payload_24]])])) + [(builtin unConstrData) constructor_23]]) + (con data (I 7))]) +--- core after +let constructor#23 : Data = (con data (I 7)) in +let payload#24 : 'erased = unConstrData constructor#23 in +trace "after decoding" in constructor#23 +--- uplc after +(program 1.1.0 + [(lam constructor_23 + [(lam payload_24 + (force + [[(force (builtin trace)) (con string "after decoding")] (delay constructor_23)])) + [(builtin unConstrData) constructor_23]]) + (con data (I 7))]) +--- result +error: Runtime(MalFormedData(Integer(7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_bound.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_bound.snap new file mode 100644 index 00000000..646001a7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_bound.snap @@ -0,0 +1,67 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +trace "after encoding" in unIData alias#3 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unIData) alias_3])])) + encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- optimized Core +let x#4 : int = trace "once" in 7 in +let encoded#5 : Data = iData x#4 in +trace "after encoding" in x#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam x_1 + [(lam encoded_2 (force [[builtin_3 (con string "after encoding")] (delay x_1)])) + [(builtin iData) x_1]]) + (force [[builtin_3 (con string "once")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +trace "after encoding" in unIData alias#3 +--- uplc before +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unIData) alias_3])])) + encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- core after +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +trace "after encoding" in x#1 +--- uplc after +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 + (force [[(force (builtin trace)) (con string "after encoding")] (delay x_1)])) + encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- result +(con integer 7) +--- logs +["once", "after encoding"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_bound_invalid.snap new file mode 100644 index 00000000..d248d5a4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_bound_invalid.snap @@ -0,0 +1,65 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#1 : int = trace "operand" in false in +let encoded#2 : Data = iData x#1 in +trace "must not run" in unIData encoded#2 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unIData) encoded_2])])) + [(builtin iData) x_1]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- optimized Core +let x#3 : int = trace "operand" in false in +let encoded#4 : Data = iData x#3 in +trace "must not run" in unIData encoded#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam x_1 + [(lam encoded_2 + (force + [[builtin_3 (con string "must not run")] (delay [(builtin unIData) encoded_2])])) + [(builtin iData) x_1]]) + (force [[builtin_3 (con string "operand")] (delay (con bool False))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#1 : int = trace "operand" in false in +let encoded#2 : Data = iData x#1 in +trace "must not run" in unIData encoded#2 +--- uplc before +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unIData) encoded_2])])) + [(builtin iData) x_1]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- core after +let x#1 : int = trace "operand" in false in +let encoded#2 : Data = iData x#1 in +trace "must not run" in unIData encoded#2 +--- uplc after +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unIData) encoded_2])])) + [(builtin iData) x_1]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(false))) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_captured.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_captured.snap new file mode 100644 index 00000000..d9e7419e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_captured.snap @@ -0,0 +1,54 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +force (delay (unIData alias#3)) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 (force (delay [(builtin unIData) alias_3]))) encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- optimized Core +let x#4 : int = trace "once" in 7 in +let encoded#5 : Data = iData x#4 in +x#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam x_1 [(lam encoded_2 x_1) [(builtin iData) x_1]]) + (force [[builtin_3 (con string "once")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +force (delay (unIData alias#3)) +--- uplc before +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 (force (delay [(builtin unIData) alias_3]))) encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- core after +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +force (delay x#1) +--- uplc after +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 [(lam alias_3 (force (delay x_1))) encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- result +(con integer 7) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_cold.snap new file mode 100644 index 00000000..36f9c627 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_cold.snap @@ -0,0 +1,47 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bool true of + True -> 7 + False -> unIData (iData (trace "cold" in 7)) +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool True) + [(builtin unIData) + [(builtin iData) + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 7))])]] + (con integer 7))) +--- optimized Core +7 +--- optimized UPLC +(program 1.1.0 (con integer 7)) +--- isolated pass +--- core before +case@Bool true of + True -> 7 + False -> unIData (iData (trace "cold" in 7)) +--- uplc before +(program 1.1.0 + (case + (con bool True) + [(builtin unIData) + [(builtin iData) + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 7))])]] + (con integer 7))) +--- core after +case@Bool true of + True -> 7 + False -> trace "cold" in 7 +--- uplc after +(program 1.1.0 + (case + (con bool True) + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 7))]) + (con integer 7))) +--- result +(con integer 7) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_decode_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_decode_failure.snap new file mode 100644 index 00000000..4a72fd21 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_decode_failure.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (unIData 0)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con integer 0)]]]) +--- optimized Core +unIData 0 +--- optimized UPLC +(program 1.1.0 [(builtin unIData) (con integer 0)]) +--- isolated pass +--- core before +unIData (iData (unIData 0)) +--- uplc before +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con integer 0)]]]) +--- core after +unIData 0 +--- uplc after +(program 1.1.0 [(builtin unIData) (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_decoded.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_decoded.snap new file mode 100644 index 00000000..d4c0f245 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_decoded.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (unIData (con data (I 7)))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con data (I 7))]]]) +--- optimized Core +unIData (con data (I 7)) +--- optimized UPLC +(program 1.1.0 [(builtin unIData) (con data (I 7))]) +--- isolated pass +--- core before +unIData (iData (unIData (con data (I 7)))) +--- uplc before +(program 1.1.0 + [(builtin unIData) [(builtin iData) [(builtin unIData) (con data (I 7))]]]) +--- core after +unIData (con data (I 7)) +--- uplc after +(program 1.1.0 [(builtin unIData) (con data (I 7))]) +--- result +(con integer 7) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_direct.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_direct.snap new file mode 100644 index 00000000..b3a468cd --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_direct.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData 7) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 7)]]) +--- optimized Core +7 +--- optimized UPLC +(program 1.1.0 (con integer 7)) +--- isolated pass +--- core before +unIData (iData 7) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 7)]]) +--- core after +7 +--- uplc after +(program 1.1.0 (con integer 7)) +--- result +(con integer 7) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_escaping.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_escaping.snap new file mode 100644 index 00000000..9f632b1f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_escaping.snap @@ -0,0 +1,58 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +constr 0 encoded#2 (unIData alias#3) (unIData alias#3) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 + (constr 0 encoded_2 [(builtin unIData) alias_3] [(builtin unIData) alias_3])) + encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- optimized Core +let x#4 : int = trace "once" in 7 in +let encoded#5 : Data = iData x#4 in +constr 0 encoded#5 x#4 x#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam x_1 [(lam encoded_2 (constr 0 encoded_2 x_1 x_1)) [(builtin iData) x_1]]) + (force [[builtin_3 (con string "once")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +constr 0 encoded#2 (unIData alias#3) (unIData alias#3) +--- uplc before +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 + [(lam alias_3 + (constr 0 encoded_2 [(builtin unIData) alias_3] [(builtin unIData) alias_3])) + encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- core after +let x#1 : int = trace "once" in 7 in +let encoded#2 : Data = iData x#1 in +let alias#3 : Data = encoded#2 in +constr 0 encoded#2 x#1 x#1 +--- uplc after +(program 1.1.0 + [(lam x_1 + [(lam encoded_2 [(lam alias_3 (constr 0 encoded_2 x_1 x_1)) encoded_2]) + [(builtin iData) x_1]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 7))])]) +--- result +(constr 0 (con data (I 7)) (con integer 7) (con integer 7)) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_oversaturated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_oversaturated.snap new file mode 100644 index 00000000..8572d917 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_oversaturated.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData 7) 1 +--- unoptimized UPLC +(program 1.1.0 + [[(builtin unIData) [(builtin iData) (con integer 7)]] (con integer 1)]) +--- optimized Core +7 1 +--- optimized UPLC +(program 1.1.0 [(con integer 7) (con integer 1)]) +--- isolated pass +--- core before +unIData (iData 7) 1 +--- uplc before +(program 1.1.0 + [[(builtin unIData) [(builtin iData) (con integer 7)]] (con integer 1)]) +--- core after +7 1 +--- uplc after +(program 1.1.0 [(con integer 7) (con integer 1)]) +--- result +error: NonFunctionApplication(Con(Integer(1)), Con(Integer(7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_partial.snap new file mode 100644 index 00000000..bbb6ca95 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_partial.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData 7) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 7)]]) +--- optimized Core +let anf#1 : Data = iData 7 in +unIData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unIData) anf_2]) [(builtin iData) (con integer 7)]]) +--- isolated pass +--- core before +unIData (iData 7) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 7)]]) +--- core after +unIData (iData 7) +--- uplc after +(program 1.1.0 [(builtin unIData) [(builtin iData) (con integer 7)]]) +--- result +(con integer 7) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_reverse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_reverse.snap new file mode 100644 index 00000000..cfa13fc5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_reverse.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +iData (unIData (con data (I 7))) +--- unoptimized UPLC +(program 1.1.0 [(builtin iData) [(builtin unIData) (con data (I 7))]]) +--- optimized Core +(con data (I 7)) +--- optimized UPLC +(program 1.1.0 (con data (I 7))) +--- isolated pass +--- core before +iData (unIData (con data (I 7))) +--- uplc before +(program 1.1.0 [(builtin iData) [(builtin unIData) (con data (I 7))]]) +--- core after +(con data (I 7)) +--- uplc after +(program 1.1.0 (con data (I 7))) +--- result +(con data (I 7)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_reverse_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_reverse_bound_invalid.snap new file mode 100644 index 00000000..8e835edc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_reverse_bound_invalid.snap @@ -0,0 +1,58 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let encoded#2 : Data = 0 in +let x#1 : int = unIData encoded#2 in +trace "must not run" in iData x#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam encoded_2 + [(lam x_1 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin iData) x_1])])) + [(builtin unIData) encoded_2]]) + (con integer 0)]) +--- optimized Core +let x#4 : int = unIData 0 in +trace "must not run" in iData x#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam x_1 + (force [[builtin_2 (con string "must not run")] (delay [(builtin iData) x_1])])) + [(builtin unIData) (con integer 0)]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let encoded#2 : Data = 0 in +let x#1 : int = unIData encoded#2 in +trace "must not run" in iData x#1 +--- uplc before +(program 1.1.0 + [(lam encoded_2 + [(lam x_1 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin iData) x_1])])) + [(builtin unIData) encoded_2]]) + (con integer 0)]) +--- core after +let encoded#2 : Data = 0 in +let x#1 : int = unIData encoded#2 in +trace "must not run" in iData x#1 +--- uplc after +(program 1.1.0 + [(lam encoded_2 + [(lam x_1 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin iData) x_1])])) + [(builtin unIData) encoded_2]]) + (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_trace.snap new file mode 100644 index 00000000..323cb955 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_trace.snap @@ -0,0 +1,38 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (trace "operand" in 7)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 7))])]]) +--- optimized Core +trace "operand" in 7 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "operand")] (delay (con integer 7))])) + (force (builtin trace))]) +--- isolated pass +--- core before +unIData (iData (trace "operand" in 7)) +--- uplc before +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 7))])]]) +--- core after +trace "operand" in 7 +--- uplc after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 7))])) +--- result +(con integer 7) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_unknown_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_unknown_invalid.snap new file mode 100644 index 00000000..51bb060f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_unknown_invalid.snap @@ -0,0 +1,33 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\unknown#4 : int -> unIData (iData unknown#4)) false +--- unoptimized UPLC +(program 1.1.0 + [(lam unknown_4 [(builtin unIData) [(builtin iData) unknown_4]]) + (con bool False)]) +--- optimized Core +let anf#2 : Data = iData false in +unIData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unIData) anf_1]) [(builtin iData) (con bool False)]]) +--- isolated pass +--- core before +(\unknown#4 : int -> unIData (iData unknown#4)) false +--- uplc before +(program 1.1.0 + [(lam unknown_4 [(builtin unIData) [(builtin iData) unknown_4]]) + (con bool False)]) +--- core after +(\unknown#4 : int -> unIData (iData unknown#4)) false +--- uplc after +(program 1.1.0 + [(lam unknown_4 [(builtin unIData) [(builtin iData) unknown_4]]) + (con bool False)]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_wrong_kind.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_wrong_kind.snap new file mode 100644 index 00000000..fd51c55f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_integer_wrong_kind.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData false) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool False)]]) +--- optimized Core +let anf#1 : Data = iData false in +unIData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unIData) anf_2]) [(builtin iData) (con bool False)]]) +--- isolated pass +--- core before +unIData (iData false) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool False)]]) +--- core after +unIData (iData false) +--- uplc after +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool False)]]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_bound.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_bound.snap new file mode 100644 index 00000000..0ccfce63 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_bound.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +trace "after encoding" in unListData alias#11 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unListData) alias_11])])) + encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- optimized Core +let x#1 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#2 : Data = listData x#1 in +trace "after encoding" in x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 (force [[builtin_5 (con string "after encoding")] (delay x_3)])) + [(builtin listData) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con (list data) [(I 7)]))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +trace "after encoding" in unListData alias#11 +--- uplc before +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unListData) alias_11])])) + encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- core after +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +trace "after encoding" in x#9 +--- uplc after +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 + (force [[(force (builtin trace)) (con string "after encoding")] (delay x_9)])) + encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- result +(con (list data) [(I 7)]) +--- logs +["once", "after encoding"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_bound_invalid.snap new file mode 100644 index 00000000..336d801f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_bound_invalid.snap @@ -0,0 +1,66 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#9 : list Data = trace "operand" in false in +let encoded#10 : Data = listData x#9 in +trace "must not run" in unListData encoded#10 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unListData) encoded_10])])) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- optimized Core +let x#1 : list Data = trace "operand" in false in +let encoded#2 : Data = listData x#1 in +trace "must not run" in unListData encoded#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 + (force + [[builtin_5 (con string "must not run")] + (delay [(builtin unListData) encoded_4])])) + [(builtin listData) x_3]]) + (force [[builtin_5 (con string "operand")] (delay (con bool False))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#9 : list Data = trace "operand" in false in +let encoded#10 : Data = listData x#9 in +trace "must not run" in unListData encoded#10 +--- uplc before +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unListData) encoded_10])])) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- core after +let x#9 : list Data = trace "operand" in false in +let encoded#10 : Data = listData x#9 in +trace "must not run" in unListData encoded#10 +--- uplc after +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unListData) encoded_10])])) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_captured.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_captured.snap new file mode 100644 index 00000000..af21d782 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_captured.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +force (delay (unListData alias#11)) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 (force (delay [(builtin unListData) alias_11]))) encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- optimized Core +let x#1 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#2 : Data = listData x#1 in +x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 [(lam encoded_4 x_3) [(builtin listData) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con (list data) [(I 7)]))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +force (delay (unListData alias#11)) +--- uplc before +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 (force (delay [(builtin unListData) alias_11]))) encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- core after +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +force (delay x#9) +--- uplc after +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 [(lam alias_11 (force (delay x_9))) encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- result +(con (list data) [(I 7)]) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_cold.snap new file mode 100644 index 00000000..b760415b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_cold.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bool true of + True -> (con (list data) [(I 7)]) + False -> unListData (listData (trace "cold" in (con (list data) [(I 7)]))) +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool True) + [(builtin unListData) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con (list data) [(I 7)]))])]] + (con (list data) [(I 7)]))) +--- optimized Core +(con (list data) [(I 7)]) +--- optimized UPLC +(program 1.1.0 (con (list data) [(I 7)])) +--- isolated pass +--- core before +case@Bool true of + True -> (con (list data) [(I 7)]) + False -> unListData (listData (trace "cold" in (con (list data) [(I 7)]))) +--- uplc before +(program 1.1.0 + (case + (con bool True) + [(builtin unListData) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con (list data) [(I 7)]))])]] + (con (list data) [(I 7)]))) +--- core after +case@Bool true of + True -> (con (list data) [(I 7)]) + False -> trace "cold" in (con (list data) [(I 7)]) +--- uplc after +(program 1.1.0 + (case + (con bool True) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con (list data) [(I 7)]))]) + (con (list data) [(I 7)]))) +--- result +(con (list data) [(I 7)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_decode_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_decode_failure.snap new file mode 100644 index 00000000..4d2e0815 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_decode_failure.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (unListData 0)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unListData) + [(builtin listData) [(builtin unListData) (con integer 0)]]]) +--- optimized Core +unListData 0 +--- optimized UPLC +(program 1.1.0 [(builtin unListData) (con integer 0)]) +--- isolated pass +--- core before +unListData (listData (unListData 0)) +--- uplc before +(program 1.1.0 + [(builtin unListData) + [(builtin listData) [(builtin unListData) (con integer 0)]]]) +--- core after +unListData 0 +--- uplc after +(program 1.1.0 [(builtin unListData) (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_decoded.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_decoded.snap new file mode 100644 index 00000000..f1c64c9a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_decoded.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (unListData (con data (List [I 7])))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unListData) + [(builtin listData) [(builtin unListData) (con data (List [I 7]))]]]) +--- optimized Core +unListData (con data (List [I 7])) +--- optimized UPLC +(program 1.1.0 [(builtin unListData) (con data (List [I 7]))]) +--- isolated pass +--- core before +unListData (listData (unListData (con data (List [I 7])))) +--- uplc before +(program 1.1.0 + [(builtin unListData) + [(builtin listData) [(builtin unListData) (con data (List [I 7]))]]]) +--- core after +unListData (con data (List [I 7])) +--- uplc after +(program 1.1.0 [(builtin unListData) (con data (List [I 7]))]) +--- result +(con (list data) [(I 7)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_direct.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_direct.snap new file mode 100644 index 00000000..0e42a8ec --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_direct.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (con (list data) [(I 7)])) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]]) +--- optimized Core +(con (list data) [(I 7)]) +--- optimized UPLC +(program 1.1.0 (con (list data) [(I 7)])) +--- isolated pass +--- core before +unListData (listData (con (list data) [(I 7)])) +--- uplc before +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]]) +--- core after +(con (list data) [(I 7)]) +--- uplc after +(program 1.1.0 (con (list data) [(I 7)])) +--- result +(con (list data) [(I 7)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_escaping.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_escaping.snap new file mode 100644 index 00000000..f7a2ca6b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_escaping.snap @@ -0,0 +1,74 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +constr 0 encoded#10 (unListData alias#11) (unListData alias#11) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 + (constr 0 + encoded_10 + [(builtin unListData) alias_11] + [(builtin unListData) alias_11])) + encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- optimized Core +let x#1 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#2 : Data = listData x#1 in +constr 0 encoded#2 x#1 x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 (constr 0 encoded_4 x_3 x_3)) [(builtin listData) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con (list data) [(I 7)]))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +constr 0 encoded#10 (unListData alias#11) (unListData alias#11) +--- uplc before +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 + [(lam alias_11 + (constr 0 + encoded_10 + [(builtin unListData) alias_11] + [(builtin unListData) alias_11])) + encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- core after +let x#9 : list Data = trace "once" in (con (list data) [(I 7)]) in +let encoded#10 : Data = listData x#9 in +let alias#11 : Data = encoded#10 in +constr 0 encoded#10 x#9 x#9 +--- uplc after +(program 1.1.0 + [(lam x_9 + [(lam encoded_10 [(lam alias_11 (constr 0 encoded_10 x_9 x_9)) encoded_10]) + [(builtin listData) x_9]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 7)]))])]) +--- result +(constr 0 + (con data (List [I 7])) + (con (list data) [(I 7)]) + (con (list data) [(I 7)])) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_oversaturated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_oversaturated.snap new file mode 100644 index 00000000..c6d39ffb --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_oversaturated.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (con (list data) [(I 7)])) 1 +--- unoptimized UPLC +(program 1.1.0 + [[(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]] + (con integer 1)]) +--- optimized Core +(con (list data) [(I 7)]) 1 +--- optimized UPLC +(program 1.1.0 [(con (list data) [(I 7)]) (con integer 1)]) +--- isolated pass +--- core before +unListData (listData (con (list data) [(I 7)])) 1 +--- uplc before +(program 1.1.0 + [[(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]] + (con integer 1)]) +--- core after +(con (list data) [(I 7)]) 1 +--- uplc after +(program 1.1.0 [(con (list data) [(I 7)]) (con integer 1)]) +--- result +error: NonFunctionApplication(Con(Integer(1)), Con(ProtoList(Data, [Data(Integer(7))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_partial.snap new file mode 100644 index 00000000..c82d666e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_partial.snap @@ -0,0 +1,31 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (con (list data) [(I 7)])) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]]) +--- optimized Core +let anf#1 : Data = listData (con (list data) [(I 7)]) in +unListData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unListData) anf_2]) + [(builtin listData) (con (list data) [(I 7)])]]) +--- isolated pass +--- core before +unListData (listData (con (list data) [(I 7)])) +--- uplc before +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]]) +--- core after +unListData (listData (con (list data) [(I 7)])) +--- uplc after +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list data) [(I 7)])]]) +--- result +(con (list data) [(I 7)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_reverse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_reverse.snap new file mode 100644 index 00000000..668b787f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_reverse.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +listData (unListData (con data (List [I 7]))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin listData) [(builtin unListData) (con data (List [I 7]))]]) +--- optimized Core +(con data (List [I 7])) +--- optimized UPLC +(program 1.1.0 (con data (List [I 7]))) +--- isolated pass +--- core before +listData (unListData (con data (List [I 7]))) +--- uplc before +(program 1.1.0 + [(builtin listData) [(builtin unListData) (con data (List [I 7]))]]) +--- core after +(con data (List [I 7])) +--- uplc after +(program 1.1.0 (con data (List [I 7]))) +--- result +(con data (List [I 7])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_reverse_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_reverse_bound_invalid.snap new file mode 100644 index 00000000..1e61a855 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_reverse_bound_invalid.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let encoded#10 : Data = 0 in +let x#9 : list Data = unListData encoded#10 in +trace "must not run" in listData x#9 +--- unoptimized UPLC +(program 1.1.0 + [(lam encoded_10 + [(lam x_9 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin listData) x_9])])) + [(builtin unListData) encoded_10]]) + (con integer 0)]) +--- optimized Core +let x#2 : list Data = unListData 0 in +trace "must not run" in listData x#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam x_1 + (force + [[builtin_2 (con string "must not run")] (delay [(builtin listData) x_1])])) + [(builtin unListData) (con integer 0)]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let encoded#10 : Data = 0 in +let x#9 : list Data = unListData encoded#10 in +trace "must not run" in listData x#9 +--- uplc before +(program 1.1.0 + [(lam encoded_10 + [(lam x_9 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin listData) x_9])])) + [(builtin unListData) encoded_10]]) + (con integer 0)]) +--- core after +let encoded#10 : Data = 0 in +let x#9 : list Data = unListData encoded#10 in +trace "must not run" in listData x#9 +--- uplc after +(program 1.1.0 + [(lam encoded_10 + [(lam x_9 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin listData) x_9])])) + [(builtin unListData) encoded_10]]) + (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_trace.snap new file mode 100644 index 00000000..18a2b0ce --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_trace.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (trace "operand" in (con (list data) [(I 7)]))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unListData) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 7)]))])]]) +--- optimized Core +trace "operand" in (con (list data) [(I 7)]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "operand")] (delay (con (list data) [(I 7)]))])) + (force (builtin trace))]) +--- isolated pass +--- core before +unListData (listData (trace "operand" in (con (list data) [(I 7)]))) +--- uplc before +(program 1.1.0 + [(builtin unListData) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 7)]))])]]) +--- core after +trace "operand" in (con (list data) [(I 7)]) +--- uplc after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 7)]))])) +--- result +(con (list data) [(I 7)]) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_unknown_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_unknown_invalid.snap new file mode 100644 index 00000000..0d1f9256 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_unknown_invalid.snap @@ -0,0 +1,33 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\unknown#12 : list Data -> unListData (listData unknown#12)) false +--- unoptimized UPLC +(program 1.1.0 + [(lam unknown_12 [(builtin unListData) [(builtin listData) unknown_12]]) + (con bool False)]) +--- optimized Core +let anf#2 : Data = listData false in +unListData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unListData) anf_1]) [(builtin listData) (con bool False)]]) +--- isolated pass +--- core before +(\unknown#12 : list Data -> unListData (listData unknown#12)) false +--- uplc before +(program 1.1.0 + [(lam unknown_12 [(builtin unListData) [(builtin listData) unknown_12]]) + (con bool False)]) +--- core after +(\unknown#12 : list Data -> unListData (listData unknown#12)) false +--- uplc after +(program 1.1.0 + [(lam unknown_12 [(builtin unListData) [(builtin listData) unknown_12]]) + (con bool False)]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_wrong_kind.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_wrong_kind.snap new file mode 100644 index 00000000..bee56727 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_wrong_kind.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData false) +--- unoptimized UPLC +(program 1.1.0 [(builtin unListData) [(builtin listData) (con bool False)]]) +--- optimized Core +let anf#1 : Data = listData false in +unListData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unListData) anf_2]) [(builtin listData) (con bool False)]]) +--- isolated pass +--- core before +unListData (listData false) +--- uplc before +(program 1.1.0 [(builtin unListData) [(builtin listData) (con bool False)]]) +--- core after +unListData (listData false) +--- uplc after +(program 1.1.0 [(builtin unListData) [(builtin listData) (con bool False)]]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_wrong_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_wrong_tag.snap new file mode 100644 index 00000000..b835039d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_list_wrong_tag.snap @@ -0,0 +1,31 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unListData (listData (con (list integer) [])) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list integer) [])]]) +--- optimized Core +let anf#1 : 'erased = listData (con (list integer) []) in +unListData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unListData) anf_2]) + [(builtin listData) (con (list integer) [])]]) +--- isolated pass +--- core before +unListData (listData (con (list integer) [])) +--- uplc before +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list integer) [])]]) +--- core after +unListData (listData (con (list integer) [])) +--- uplc after +(program 1.1.0 + [(builtin unListData) [(builtin listData) (con (list integer) [])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_bound.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_bound.snap new file mode 100644 index 00000000..5e78781e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_bound.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +trace "after encoding" in unMapData alias#15 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unMapData) alias_15])])) + encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- optimized Core +let x#1 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#2 : Data = mapData x#1 in +trace "after encoding" in x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 (force [[builtin_5 (con string "after encoding")] (delay x_3)])) + [(builtin mapData) x_3]]) + (force + [[builtin_5 (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +trace "after encoding" in unMapData alias#15 +--- uplc before +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin unMapData) alias_15])])) + encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- core after +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +trace "after encoding" in x#13 +--- uplc after +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 + (force [[(force (builtin trace)) (con string "after encoding")] (delay x_13)])) + encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +["once", "after encoding"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_bound_invalid.snap new file mode 100644 index 00000000..82c6137b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_bound_invalid.snap @@ -0,0 +1,66 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#13 : list (pair Data Data) = trace "operand" in false in +let encoded#14 : Data = mapData x#13 in +trace "must not run" in unMapData encoded#14 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unMapData) encoded_14])])) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- optimized Core +let x#1 : list (pair Data Data) = trace "operand" in false in +let encoded#2 : Data = mapData x#1 in +trace "must not run" in unMapData encoded#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 + (force + [[builtin_5 (con string "must not run")] + (delay [(builtin unMapData) encoded_4])])) + [(builtin mapData) x_3]]) + (force [[builtin_5 (con string "operand")] (delay (con bool False))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#13 : list (pair Data Data) = trace "operand" in false in +let encoded#14 : Data = mapData x#13 in +trace "must not run" in unMapData encoded#14 +--- uplc before +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unMapData) encoded_14])])) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- core after +let x#13 : list (pair Data Data) = trace "operand" in false in +let encoded#14 : Data = mapData x#13 in +trace "must not run" in unMapData encoded#14 +--- uplc after +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin unMapData) encoded_14])])) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_captured.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_captured.snap new file mode 100644 index 00000000..f76f9864 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_captured.snap @@ -0,0 +1,62 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +force (delay (unMapData alias#15)) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 (force (delay [(builtin unMapData) alias_15]))) encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- optimized Core +let x#1 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#2 : Data = mapData x#1 in +x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 [(lam encoded_4 x_3) [(builtin mapData) x_3]]) + (force + [[builtin_5 (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +force (delay (unMapData alias#15)) +--- uplc before +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 (force (delay [(builtin unMapData) alias_15]))) encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- core after +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +force (delay x#13) +--- uplc after +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 [(lam alias_15 (force (delay x_13))) encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_cold.snap new file mode 100644 index 00000000..275dc232 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_cold.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bool true of + True -> (con (list (pair data data)) [((I 7), (I 7))]) + False -> unMapData (mapData (trace "cold" in (con (list (pair data data)) [((I 7), (I 7))]))) +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool True) + [(builtin unMapData) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]] + (con (list (pair data data)) [((I 7), (I 7))]))) +--- optimized Core +(con (list (pair data data)) [((I 7), (I 7))]) +--- optimized UPLC +(program 1.1.0 (con (list (pair data data)) [((I 7), (I 7))])) +--- isolated pass +--- core before +case@Bool true of + True -> (con (list (pair data data)) [((I 7), (I 7))]) + False -> unMapData (mapData (trace "cold" in (con (list (pair data data)) [((I 7), (I 7))]))) +--- uplc before +(program 1.1.0 + (case + (con bool True) + [(builtin unMapData) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]] + (con (list (pair data data)) [((I 7), (I 7))]))) +--- core after +case@Bool true of + True -> (con (list (pair data data)) [((I 7), (I 7))]) + False -> trace "cold" in (con (list (pair data data)) [((I 7), (I 7))]) +--- uplc after +(program 1.1.0 + (case + (con bool True) + (force + [[(force (builtin trace)) (con string "cold")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))]) + (con (list (pair data data)) [((I 7), (I 7))]))) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_decode_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_decode_failure.snap new file mode 100644 index 00000000..65a757ae --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_decode_failure.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (unMapData 0)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unMapData) [(builtin mapData) [(builtin unMapData) (con integer 0)]]]) +--- optimized Core +unMapData 0 +--- optimized UPLC +(program 1.1.0 [(builtin unMapData) (con integer 0)]) +--- isolated pass +--- core before +unMapData (mapData (unMapData 0)) +--- uplc before +(program 1.1.0 + [(builtin unMapData) [(builtin mapData) [(builtin unMapData) (con integer 0)]]]) +--- core after +unMapData 0 +--- uplc after +(program 1.1.0 [(builtin unMapData) (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_decoded.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_decoded.snap new file mode 100644 index 00000000..399579ad --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_decoded.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (unMapData (con data (Map [(I 7, I 7)])))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) [(builtin unMapData) (con data (Map [(I 7, I 7)]))]]]) +--- optimized Core +unMapData (con data (Map [(I 7, I 7)])) +--- optimized UPLC +(program 1.1.0 [(builtin unMapData) (con data (Map [(I 7, I 7)]))]) +--- isolated pass +--- core before +unMapData (mapData (unMapData (con data (Map [(I 7, I 7)])))) +--- uplc before +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) [(builtin unMapData) (con data (Map [(I 7, I 7)]))]]]) +--- core after +unMapData (con data (Map [(I 7, I 7)])) +--- uplc after +(program 1.1.0 [(builtin unMapData) (con data (Map [(I 7, I 7)]))]) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_direct.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_direct.snap new file mode 100644 index 00000000..0ce171af --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_direct.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]]) +--- optimized Core +(con (list (pair data data)) [((I 7), (I 7))]) +--- optimized UPLC +(program 1.1.0 (con (list (pair data data)) [((I 7), (I 7))])) +--- isolated pass +--- core before +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) +--- uplc before +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]]) +--- core after +(con (list (pair data data)) [((I 7), (I 7))]) +--- uplc after +(program 1.1.0 (con (list (pair data data)) [((I 7), (I 7))])) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_escaping.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_escaping.snap new file mode 100644 index 00000000..be77980b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_escaping.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +constr 0 encoded#14 (unMapData alias#15) (unMapData alias#15) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 + (constr 0 + encoded_14 + [(builtin unMapData) alias_15] + [(builtin unMapData) alias_15])) + encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- optimized Core +let x#1 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#2 : Data = mapData x#1 in +constr 0 encoded#2 x#1 x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 [(lam encoded_4 (constr 0 encoded_4 x_3 x_3)) [(builtin mapData) x_3]]) + (force + [[builtin_5 (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +constr 0 encoded#14 (unMapData alias#15) (unMapData alias#15) +--- uplc before +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 + [(lam alias_15 + (constr 0 + encoded_14 + [(builtin unMapData) alias_15] + [(builtin unMapData) alias_15])) + encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- core after +let x#13 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 7), (I 7))]) in +let encoded#14 : Data = mapData x#13 in +let alias#15 : Data = encoded#14 in +constr 0 encoded#14 x#13 x#13 +--- uplc after +(program 1.1.0 + [(lam x_13 + [(lam encoded_14 [(lam alias_15 (constr 0 encoded_14 x_13 x_13)) encoded_14]) + [(builtin mapData) x_13]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]) +--- result +(constr 0 + (con data (Map [(I 7, I 7)])) + (con (list (pair data data)) [((I 7), (I 7))]) + (con (list (pair data data)) [((I 7), (I 7))])) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_oversaturated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_oversaturated.snap new file mode 100644 index 00000000..ec9e8483 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_oversaturated.snap @@ -0,0 +1,31 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) 1 +--- unoptimized UPLC +(program 1.1.0 + [[(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]] + (con integer 1)]) +--- optimized Core +(con (list (pair data data)) [((I 7), (I 7))]) 1 +--- optimized UPLC +(program 1.1.0 [(con (list (pair data data)) [((I 7), (I 7))]) (con integer 1)]) +--- isolated pass +--- core before +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) 1 +--- uplc before +(program 1.1.0 + [[(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]] + (con integer 1)]) +--- core after +(con (list (pair data data)) [((I 7), (I 7))]) 1 +--- uplc after +(program 1.1.0 [(con (list (pair data data)) [((I 7), (I 7))]) (con integer 1)]) +--- result +error: NonFunctionApplication(Con(Integer(1)), Con(ProtoList(Pair(Data, Data), [ProtoPair(Data, Data, Data(Integer(7)), Data(Integer(7)))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_partial.snap new file mode 100644 index 00000000..54d20556 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_partial.snap @@ -0,0 +1,34 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]]) +--- optimized Core +let anf#1 : Data = mapData (con (list (pair data data)) [((I 7), (I 7))]) in +unMapData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unMapData) anf_2]) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]]) +--- isolated pass +--- core before +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) +--- uplc before +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]]) +--- core after +unMapData (mapData (con (list (pair data data)) [((I 7), (I 7))])) +--- uplc after +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) (con (list (pair data data)) [((I 7), (I 7))])]]) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_reverse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_reverse.snap new file mode 100644 index 00000000..02a8b1ed --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_reverse.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +mapData (unMapData (con data (Map [(I 7, I 7)]))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin mapData) [(builtin unMapData) (con data (Map [(I 7, I 7)]))]]) +--- optimized Core +(con data (Map [(I 7, I 7)])) +--- optimized UPLC +(program 1.1.0 (con data (Map [(I 7, I 7)]))) +--- isolated pass +--- core before +mapData (unMapData (con data (Map [(I 7, I 7)]))) +--- uplc before +(program 1.1.0 + [(builtin mapData) [(builtin unMapData) (con data (Map [(I 7, I 7)]))]]) +--- core after +(con data (Map [(I 7, I 7)])) +--- uplc after +(program 1.1.0 (con data (Map [(I 7, I 7)]))) +--- result +(con data (Map [(I 7, I 7)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_reverse_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_reverse_bound_invalid.snap new file mode 100644 index 00000000..25fa792e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_reverse_bound_invalid.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let encoded#14 : Data = 0 in +let x#13 : list (pair Data Data) = unMapData encoded#14 in +trace "must not run" in mapData x#13 +--- unoptimized UPLC +(program 1.1.0 + [(lam encoded_14 + [(lam x_13 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin mapData) x_13])])) + [(builtin unMapData) encoded_14]]) + (con integer 0)]) +--- optimized Core +let x#2 : list (pair Data Data) = unMapData 0 in +trace "must not run" in mapData x#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam x_1 + (force + [[builtin_2 (con string "must not run")] (delay [(builtin mapData) x_1])])) + [(builtin unMapData) (con integer 0)]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let encoded#14 : Data = 0 in +let x#13 : list (pair Data Data) = unMapData encoded#14 in +trace "must not run" in mapData x#13 +--- uplc before +(program 1.1.0 + [(lam encoded_14 + [(lam x_13 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin mapData) x_13])])) + [(builtin unMapData) encoded_14]]) + (con integer 0)]) +--- core after +let encoded#14 : Data = 0 in +let x#13 : list (pair Data Data) = unMapData encoded#14 in +trace "must not run" in mapData x#13 +--- uplc after +(program 1.1.0 + [(lam encoded_14 + [(lam x_13 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin mapData) x_13])])) + [(builtin unMapData) encoded_14]]) + (con integer 0)]) +--- result +error: Runtime(NotData(Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_trace.snap new file mode 100644 index 00000000..69b23b26 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_trace.snap @@ -0,0 +1,43 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (trace "operand" in (con (list (pair data data)) [((I 7), (I 7))]))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]]) +--- optimized Core +trace "operand" in (con (list (pair data data)) [((I 7), (I 7))]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force + [[builtin_1 (con string "operand")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])) + (force (builtin trace))]) +--- isolated pass +--- core before +unMapData (mapData (trace "operand" in (con (list (pair data data)) [((I 7), (I 7))]))) +--- uplc before +(program 1.1.0 + [(builtin unMapData) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])]]) +--- core after +trace "operand" in (con (list (pair data data)) [((I 7), (I 7))]) +--- uplc after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list (pair data data)) [((I 7), (I 7))]))])) +--- result +(con (list (pair data data)) [((I 7), (I 7))]) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_unknown_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_unknown_invalid.snap new file mode 100644 index 00000000..91650406 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_unknown_invalid.snap @@ -0,0 +1,33 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\unknown#16 : list (pair Data Data) -> unMapData (mapData unknown#16)) false +--- unoptimized UPLC +(program 1.1.0 + [(lam unknown_16 [(builtin unMapData) [(builtin mapData) unknown_16]]) + (con bool False)]) +--- optimized Core +let anf#2 : Data = mapData false in +unMapData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unMapData) anf_1]) [(builtin mapData) (con bool False)]]) +--- isolated pass +--- core before +(\unknown#16 : list (pair Data Data) -> unMapData (mapData unknown#16)) false +--- uplc before +(program 1.1.0 + [(lam unknown_16 [(builtin unMapData) [(builtin mapData) unknown_16]]) + (con bool False)]) +--- core after +(\unknown#16 : list (pair Data Data) -> unMapData (mapData unknown#16)) false +--- uplc after +(program 1.1.0 + [(lam unknown_16 [(builtin unMapData) [(builtin mapData) unknown_16]]) + (con bool False)]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_wrong_kind.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_wrong_kind.snap new file mode 100644 index 00000000..eb528cc1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_wrong_kind.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData false) +--- unoptimized UPLC +(program 1.1.0 [(builtin unMapData) [(builtin mapData) (con bool False)]]) +--- optimized Core +let anf#1 : Data = mapData false in +unMapData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unMapData) anf_2]) [(builtin mapData) (con bool False)]]) +--- isolated pass +--- core before +unMapData (mapData false) +--- uplc before +(program 1.1.0 [(builtin unMapData) [(builtin mapData) (con bool False)]]) +--- core after +unMapData (mapData false) +--- uplc after +(program 1.1.0 [(builtin unMapData) [(builtin mapData) (con bool False)]]) +--- result +error: Runtime(ExpectedList(Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_wrong_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_wrong_tag.snap new file mode 100644 index 00000000..028746d7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_map_wrong_tag.snap @@ -0,0 +1,28 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unMapData (mapData (con (list data) [])) +--- unoptimized UPLC +(program 1.1.0 [(builtin unMapData) [(builtin mapData) (con (list data) [])]]) +--- optimized Core +let anf#1 : 'erased = mapData (con (list data) []) in +unMapData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unMapData) anf_2]) + [(builtin mapData) (con (list data) [])]]) +--- isolated pass +--- core before +unMapData (mapData (con (list data) [])) +--- uplc before +(program 1.1.0 [(builtin unMapData) [(builtin mapData) (con (list data) [])]]) +--- core after +unMapData (mapData (con (list data) [])) +--- uplc after +(program 1.1.0 [(builtin unMapData) [(builtin mapData) (con (list data) [])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_bound.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_bound.snap new file mode 100644 index 00000000..722e0953 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_bound.snap @@ -0,0 +1,70 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +trace "after encoding" in decodeUtf8 alias#19 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin decodeUtf8) alias_19])])) + encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- optimized Core +let x#1 : string = trace "once" in "héllo" in +let encoded#2 : bytes = encodeUtf8 x#1 in +trace "after encoding" in x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 (force [[builtin_5 (con string "after encoding")] (delay x_3)])) + [(builtin encodeUtf8) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con string "héllo"))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +trace "after encoding" in decodeUtf8 alias#19 +--- uplc before +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 + (force + [[(force (builtin trace)) (con string "after encoding")] + (delay [(builtin decodeUtf8) alias_19])])) + encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- core after +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +trace "after encoding" in x#17 +--- uplc after +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 + (force [[(force (builtin trace)) (con string "after encoding")] (delay x_17)])) + encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- result +(con string "héllo") +--- logs +["once", "after encoding"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_bound_invalid.snap new file mode 100644 index 00000000..9828b64a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_bound_invalid.snap @@ -0,0 +1,66 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#17 : string = trace "operand" in false in +let encoded#18 : bytes = encodeUtf8 x#17 in +trace "must not run" in decodeUtf8 encoded#18 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin decodeUtf8) encoded_18])])) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- optimized Core +let x#1 : string = trace "operand" in false in +let encoded#2 : bytes = encodeUtf8 x#1 in +trace "must not run" in decodeUtf8 encoded#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 + (force + [[builtin_5 (con string "must not run")] + (delay [(builtin decodeUtf8) encoded_4])])) + [(builtin encodeUtf8) x_3]]) + (force [[builtin_5 (con string "operand")] (delay (con bool False))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#17 : string = trace "operand" in false in +let encoded#18 : bytes = encodeUtf8 x#17 in +trace "must not run" in decodeUtf8 encoded#18 +--- uplc before +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin decodeUtf8) encoded_18])])) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- core after +let x#17 : string = trace "operand" in false in +let encoded#18 : bytes = encodeUtf8 x#17 in +trace "must not run" in decodeUtf8 encoded#18 +--- uplc after +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin decodeUtf8) encoded_18])])) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con bool False))])]) +--- result +error: Runtime(TypeMismatch(String, Boolean(false))) +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_captured.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_captured.snap new file mode 100644 index 00000000..a42819ee --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_captured.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +force (delay (decodeUtf8 alias#19)) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 (force (delay [(builtin decodeUtf8) alias_19]))) encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- optimized Core +let x#1 : string = trace "once" in "héllo" in +let encoded#2 : bytes = encodeUtf8 x#1 in +x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 [(lam encoded_4 x_3) [(builtin encodeUtf8) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con string "héllo"))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +force (delay (decodeUtf8 alias#19)) +--- uplc before +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 (force (delay [(builtin decodeUtf8) alias_19]))) encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- core after +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +force (delay x#17) +--- uplc after +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 [(lam alias_19 (force (delay x_17))) encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- result +(con string "héllo") +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_cold.snap new file mode 100644 index 00000000..9e94fd74 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_cold.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bool true of + True -> "héllo" + False -> decodeUtf8 (encodeUtf8 (trace "cold" in "héllo")) +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool True) + [(builtin decodeUtf8) + [(builtin encodeUtf8) + (force + [[(force (builtin trace)) (con string "cold")] (delay (con string "héllo"))])]] + (con string "héllo"))) +--- optimized Core +"héllo" +--- optimized UPLC +(program 1.1.0 (con string "héllo")) +--- isolated pass +--- core before +case@Bool true of + True -> "héllo" + False -> decodeUtf8 (encodeUtf8 (trace "cold" in "héllo")) +--- uplc before +(program 1.1.0 + (case + (con bool True) + [(builtin decodeUtf8) + [(builtin encodeUtf8) + (force + [[(force (builtin trace)) (con string "cold")] (delay (con string "héllo"))])]] + (con string "héllo"))) +--- core after +case@Bool true of + True -> "héllo" + False -> trace "cold" in "héllo" +--- uplc after +(program 1.1.0 + (case + (con bool True) + (force + [[(force (builtin trace)) (con string "cold")] (delay (con string "héllo"))]) + (con string "héllo"))) +--- result +(con string "héllo") +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_decode_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_decode_failure.snap new file mode 100644 index 00000000..00854b4a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_decode_failure.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 (decodeUtf8 0)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin decodeUtf8) + [(builtin encodeUtf8) [(builtin decodeUtf8) (con integer 0)]]]) +--- optimized Core +decodeUtf8 0 +--- optimized UPLC +(program 1.1.0 [(builtin decodeUtf8) (con integer 0)]) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 (decodeUtf8 0)) +--- uplc before +(program 1.1.0 + [(builtin decodeUtf8) + [(builtin encodeUtf8) [(builtin decodeUtf8) (con integer 0)]]]) +--- core after +decodeUtf8 0 +--- uplc after +(program 1.1.0 [(builtin decodeUtf8) (con integer 0)]) +--- result +error: Runtime(TypeMismatch(ByteString, Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_decoded.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_decoded.snap new file mode 100644 index 00000000..9e5536bf --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_decoded.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 (decodeUtf8 (con bytestring #68c3a96c6c6f))) +--- unoptimized UPLC +(program 1.1.0 + [(builtin decodeUtf8) + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #68c3a96c6c6f)]]]) +--- optimized Core +decodeUtf8 (con bytestring #68c3a96c6c6f) +--- optimized UPLC +(program 1.1.0 [(builtin decodeUtf8) (con bytestring #68c3a96c6c6f)]) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 (decodeUtf8 (con bytestring #68c3a96c6c6f))) +--- uplc before +(program 1.1.0 + [(builtin decodeUtf8) + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #68c3a96c6c6f)]]]) +--- core after +decodeUtf8 (con bytestring #68c3a96c6c6f) +--- uplc after +(program 1.1.0 [(builtin decodeUtf8) (con bytestring #68c3a96c6c6f)]) +--- result +(con string "héllo") +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_direct.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_direct.snap new file mode 100644 index 00000000..053b1f33 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_direct.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 "héllo") +--- unoptimized UPLC +(program 1.1.0 + [(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]]) +--- optimized Core +"héllo" +--- optimized UPLC +(program 1.1.0 (con string "héllo")) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 "héllo") +--- uplc before +(program 1.1.0 + [(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]]) +--- core after +"héllo" +--- uplc after +(program 1.1.0 (con string "héllo")) +--- result +(con string "héllo") +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_escaping.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_escaping.snap new file mode 100644 index 00000000..2dd0f4e9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_escaping.snap @@ -0,0 +1,71 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +constr 0 encoded#18 (decodeUtf8 alias#19) (decodeUtf8 alias#19) +--- unoptimized UPLC +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 + (constr 0 + encoded_18 + [(builtin decodeUtf8) alias_19] + [(builtin decodeUtf8) alias_19])) + encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- optimized Core +let x#1 : string = trace "once" in "héllo" in +let encoded#2 : bytes = encodeUtf8 x#1 in +constr 0 encoded#2 x#1 x#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam x_3 + [(lam encoded_4 (constr 0 encoded_4 x_3 x_3)) [(builtin encodeUtf8) x_3]]) + (force [[builtin_5 (con string "once")] (delay (con string "héllo"))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +constr 0 encoded#18 (decodeUtf8 alias#19) (decodeUtf8 alias#19) +--- uplc before +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 + [(lam alias_19 + (constr 0 + encoded_18 + [(builtin decodeUtf8) alias_19] + [(builtin decodeUtf8) alias_19])) + encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- core after +let x#17 : string = trace "once" in "héllo" in +let encoded#18 : bytes = encodeUtf8 x#17 in +let alias#19 : bytes = encoded#18 in +constr 0 encoded#18 x#17 x#17 +--- uplc after +(program 1.1.0 + [(lam x_17 + [(lam encoded_18 [(lam alias_19 (constr 0 encoded_18 x_17 x_17)) encoded_18]) + [(builtin encodeUtf8) x_17]]) + (force + [[(force (builtin trace)) (con string "once")] (delay (con string "héllo"))])]) +--- result +(constr 0 + (con bytestring #68c3a96c6c6f) + (con string "héllo") + (con string "héllo")) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_oversaturated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_oversaturated.snap new file mode 100644 index 00000000..32d61463 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_oversaturated.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 "héllo") 1 +--- unoptimized UPLC +(program 1.1.0 + [[(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]] + (con integer 1)]) +--- optimized Core +"héllo" 1 +--- optimized UPLC +(program 1.1.0 [(con string "héllo") (con integer 1)]) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 "héllo") 1 +--- uplc before +(program 1.1.0 + [[(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]] + (con integer 1)]) +--- core after +"héllo" 1 +--- uplc after +(program 1.1.0 [(con string "héllo") (con integer 1)]) +--- result +error: NonFunctionApplication(Con(Integer(1)), Con(String("héllo"))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_partial.snap new file mode 100644 index 00000000..93628b26 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_partial.snap @@ -0,0 +1,31 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 "héllo") +--- unoptimized UPLC +(program 1.1.0 + [(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]]) +--- optimized Core +let anf#1 : bytes = encodeUtf8 "héllo" in +decodeUtf8 anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin decodeUtf8) anf_2]) + [(builtin encodeUtf8) (con string "héllo")]]) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 "héllo") +--- uplc before +(program 1.1.0 + [(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]]) +--- core after +decodeUtf8 (encodeUtf8 "héllo") +--- uplc after +(program 1.1.0 + [(builtin decodeUtf8) [(builtin encodeUtf8) (con string "héllo")]]) +--- result +(con string "héllo") +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse.snap new file mode 100644 index 00000000..87c80f54 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +encodeUtf8 (decodeUtf8 (con bytestring #68c3a96c6c6f)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #68c3a96c6c6f)]]) +--- optimized Core +(con bytestring #68c3a96c6c6f) +--- optimized UPLC +(program 1.1.0 (con bytestring #68c3a96c6c6f)) +--- isolated pass +--- core before +encodeUtf8 (decodeUtf8 (con bytestring #68c3a96c6c6f)) +--- uplc before +(program 1.1.0 + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #68c3a96c6c6f)]]) +--- core after +(con bytestring #68c3a96c6c6f) +--- uplc after +(program 1.1.0 (con bytestring #68c3a96c6c6f)) +--- result +(con bytestring #68c3a96c6c6f) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse_bound_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse_bound_invalid.snap new file mode 100644 index 00000000..1a366681 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse_bound_invalid.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let encoded#18 : bytes = 0 in +let x#17 : string = decodeUtf8 encoded#18 in +trace "must not run" in encodeUtf8 x#17 +--- unoptimized UPLC +(program 1.1.0 + [(lam encoded_18 + [(lam x_17 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin encodeUtf8) x_17])])) + [(builtin decodeUtf8) encoded_18]]) + (con integer 0)]) +--- optimized Core +let x#2 : string = decodeUtf8 0 in +trace "must not run" in encodeUtf8 x#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam x_1 + (force + [[builtin_2 (con string "must not run")] (delay [(builtin encodeUtf8) x_1])])) + [(builtin decodeUtf8) (con integer 0)]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let encoded#18 : bytes = 0 in +let x#17 : string = decodeUtf8 encoded#18 in +trace "must not run" in encodeUtf8 x#17 +--- uplc before +(program 1.1.0 + [(lam encoded_18 + [(lam x_17 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin encodeUtf8) x_17])])) + [(builtin decodeUtf8) encoded_18]]) + (con integer 0)]) +--- core after +let encoded#18 : bytes = 0 in +let x#17 : string = decodeUtf8 encoded#18 in +trace "must not run" in encodeUtf8 x#17 +--- uplc after +(program 1.1.0 + [(lam encoded_18 + [(lam x_17 + (force + [[(force (builtin trace)) (con string "must not run")] + (delay [(builtin encodeUtf8) x_17])])) + [(builtin decodeUtf8) encoded_18]]) + (con integer 0)]) +--- result +error: Runtime(TypeMismatch(ByteString, Integer(0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse_invalid.snap new file mode 100644 index 00000000..3440c149 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_reverse_invalid.snap @@ -0,0 +1,31 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +encodeUtf8 (decodeUtf8 (con bytestring #ff)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #ff)]]) +--- optimized Core +let anf#1 : string = decodeUtf8 (con bytestring #ff) in +encodeUtf8 anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin encodeUtf8) anf_2]) + [(builtin decodeUtf8) (con bytestring #ff)]]) +--- isolated pass +--- core before +encodeUtf8 (decodeUtf8 (con bytestring #ff)) +--- uplc before +(program 1.1.0 + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #ff)]]) +--- core after +encodeUtf8 (decodeUtf8 (con bytestring #ff)) +--- uplc after +(program 1.1.0 + [(builtin encodeUtf8) [(builtin decodeUtf8) (con bytestring #ff)]]) +--- result +error: Runtime(DecodeUtf8(Utf8Error { valid_up_to: 0, error_len: Some(1) })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_trace.snap new file mode 100644 index 00000000..cb0d3f83 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_trace.snap @@ -0,0 +1,38 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 (trace "operand" in "héllo")) +--- unoptimized UPLC +(program 1.1.0 + [(builtin decodeUtf8) + [(builtin encodeUtf8) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con string "héllo"))])]]) +--- optimized Core +trace "operand" in "héllo" +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "operand")] (delay (con string "héllo"))])) + (force (builtin trace))]) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 (trace "operand" in "héllo")) +--- uplc before +(program 1.1.0 + [(builtin decodeUtf8) + [(builtin encodeUtf8) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con string "héllo"))])]]) +--- core after +trace "operand" in "héllo" +--- uplc after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "operand")] (delay (con string "héllo"))])) +--- result +(con string "héllo") +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_unknown_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_unknown_invalid.snap new file mode 100644 index 00000000..3ffabcf5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_unknown_invalid.snap @@ -0,0 +1,34 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\unknown#20 : string -> decodeUtf8 (encodeUtf8 unknown#20)) false +--- unoptimized UPLC +(program 1.1.0 + [(lam unknown_20 [(builtin decodeUtf8) [(builtin encodeUtf8) unknown_20]]) + (con bool False)]) +--- optimized Core +let anf#2 : bytes = encodeUtf8 false in +decodeUtf8 anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin decodeUtf8) anf_1]) + [(builtin encodeUtf8) (con bool False)]]) +--- isolated pass +--- core before +(\unknown#20 : string -> decodeUtf8 (encodeUtf8 unknown#20)) false +--- uplc before +(program 1.1.0 + [(lam unknown_20 [(builtin decodeUtf8) [(builtin encodeUtf8) unknown_20]]) + (con bool False)]) +--- core after +(\unknown#20 : string -> decodeUtf8 (encodeUtf8 unknown#20)) false +--- uplc after +(program 1.1.0 + [(lam unknown_20 [(builtin decodeUtf8) [(builtin encodeUtf8) unknown_20]]) + (con bool False)]) +--- result +error: Runtime(TypeMismatch(String, Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_wrong_kind.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_wrong_kind.snap new file mode 100644 index 00000000..d382d8b5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__representation_utf8_wrong_kind.snap @@ -0,0 +1,28 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +decodeUtf8 (encodeUtf8 false) +--- unoptimized UPLC +(program 1.1.0 [(builtin decodeUtf8) [(builtin encodeUtf8) (con bool False)]]) +--- optimized Core +let anf#1 : bytes = encodeUtf8 false in +decodeUtf8 anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin decodeUtf8) anf_2]) + [(builtin encodeUtf8) (con bool False)]]) +--- isolated pass +--- core before +decodeUtf8 (encodeUtf8 false) +--- uplc before +(program 1.1.0 [(builtin decodeUtf8) [(builtin encodeUtf8) (con bool False)]]) +--- core after +decodeUtf8 (encodeUtf8 false) +--- uplc after +(program 1.1.0 [(builtin decodeUtf8) [(builtin encodeUtf8) (con bool False)]]) +--- result +error: Runtime(TypeMismatch(String, Boolean(false))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__reverse_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__reverse_invalid.snap new file mode 100644 index 00000000..cb0c5c74 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__reverse_invalid.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +iData (unIData 1) +--- unoptimized UPLC +(program 1.1.0 [(builtin iData) [(builtin unIData) (con integer 1)]]) +--- optimized Core +let anf#1 : int = unIData 1 in +iData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin iData) anf_2]) [(builtin unIData) (con integer 1)]]) +--- isolated pass +--- core before +iData (unIData 1) +--- uplc before +(program 1.1.0 [(builtin iData) [(builtin unIData) (con integer 1)]]) +--- core after +iData (unIData 1) +--- uplc after +(program 1.1.0 [(builtin iData) [(builtin unIData) (con integer 1)]]) +--- result +error: Runtime(NotData(Integer(1))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__reverse_valid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__reverse_valid.snap new file mode 100644 index 00000000..f09355f0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__reverse_valid.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +iData (unIData (con data (I 42))) +--- unoptimized UPLC +(program 1.1.0 [(builtin iData) [(builtin unIData) (con data (I 42))]]) +--- optimized Core +(con data (I 42)) +--- optimized UPLC +(program 1.1.0 (con data (I 42))) +--- isolated pass +--- core before +iData (unIData (con data (I 42))) +--- uplc before +(program 1.1.0 [(builtin iData) [(builtin unIData) (con data (I 42))]]) +--- core after +(con data (I 42)) +--- uplc after +(program 1.1.0 (con data (I 42))) +--- result +(con data (I 42)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__trace.snap new file mode 100644 index 00000000..513f1af9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__trace.snap @@ -0,0 +1,38 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData (trace "before" in 42)) +--- unoptimized UPLC +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]]) +--- optimized Core +trace "before" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "before")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- core before +unIData (iData (trace "before" in 42)) +--- uplc before +(program 1.1.0 + [(builtin unIData) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]]) +--- core after +trace "before" in 42 +--- uplc after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__unknown_invalid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__unknown_invalid.snap new file mode 100644 index 00000000..a4c11ca3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__unknown_invalid.snap @@ -0,0 +1,30 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\x#1 : int -> unIData (iData x#1)) true +--- unoptimized UPLC +(program 1.1.0 + [(lam x_1 [(builtin unIData) [(builtin iData) x_1]]) (con bool True)]) +--- optimized Core +let anf#3 : Data = iData true in +unIData anf#3 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unIData) anf_1]) [(builtin iData) (con bool True)]]) +--- isolated pass +--- core before +(\x#1 : int -> unIData (iData x#1)) true +--- uplc before +(program 1.1.0 + [(lam x_1 [(builtin unIData) [(builtin iData) x_1]]) (con bool True)]) +--- core after +(\x#1 : int -> unIData (iData x#1)) true +--- uplc after +(program 1.1.0 + [(lam x_1 [(builtin unIData) [(builtin iData) x_1]]) (con bool True)]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__unknown_valid.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__unknown_valid.snap new file mode 100644 index 00000000..7377febb --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__unknown_valid.snap @@ -0,0 +1,30 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\x#1 : int -> unIData (iData x#1)) 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam x_1 [(builtin unIData) [(builtin iData) x_1]]) (con integer 42)]) +--- optimized Core +let anf#3 : Data = iData 42 in +unIData anf#3 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unIData) anf_1]) [(builtin iData) (con integer 42)]]) +--- isolated pass +--- core before +(\x#1 : int -> unIData (iData x#1)) 42 +--- uplc before +(program 1.1.0 + [(lam x_1 [(builtin unIData) [(builtin iData) x_1]]) (con integer 42)]) +--- core after +(\x#1 : int -> unIData (iData x#1)) 42 +--- uplc after +(program 1.1.0 + [(lam x_1 [(builtin unIData) [(builtin iData) x_1]]) (con integer 42)]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__wrong_kind.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__wrong_kind.snap new file mode 100644 index 00000000..e423198c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__inverse__wrong_kind.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/inverse.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +unIData (iData true) +--- unoptimized UPLC +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool True)]]) +--- optimized Core +let anf#1 : Data = iData true in +unIData anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 [(builtin unIData) anf_2]) [(builtin iData) (con bool True)]]) +--- isolated pass +--- core before +unIData (iData true) +--- uplc before +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool True)]]) +--- core after +unIData (iData true) +--- uplc after +(program 1.1.0 [(builtin unIData) [(builtin iData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__chosen_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__chosen_failure.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__chosen_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__chosen_failure.snap index 7f65e5a0..ffa46766 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__chosen_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__chosen_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__default.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__default.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__default.snap index 25b147d3..39af4ea2 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__default.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__default.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__duplicate.snap similarity index 84% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__duplicate.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__duplicate.snap index 51b516c4..2f8ba626 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__duplicate.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__duplicate.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(root), pretty(after))" --- --- before diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__effectful_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__effectful_subject.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__effectful_subject.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__effectful_subject.snap index 2f957e60..6dc087c6 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__effectful_subject.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__effectful_subject.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__false.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__false.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__false.snap index 8a9075ea..e5ff05f5 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__false.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__false.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__fields.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__fields.snap similarity index 84% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__fields.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__fields.snap index 834c1db1..a26e7840 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__fields.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__fields.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(root), pretty(after))" --- --- before diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__missing.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__missing.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__missing.snap index 76dcb467..28910e65 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__missing.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__missing.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__nested.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__nested.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__nested.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__nested.snap index 850c4f76..74c6205c 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__nested.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__nested.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__returned_delay.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__returned_delay.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__returned_delay.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__returned_delay.snap index f6655845..cb22b08d 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__returned_delay.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__returned_delay.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__returned_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__returned_function.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__returned_function.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__returned_function.snap index e739f4ad..ad160e87 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__returned_function.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__returned_function.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__reversed.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__reversed.snap similarity index 93% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__reversed.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__reversed.snap index ea4297a4..4dd11f82 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__reversed.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__reversed.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__strict_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__strict_failure.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__strict_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__strict_failure.snap index 3cd394c3..62add8ae 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__strict_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__strict_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__strict_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__strict_trace.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__strict_trace.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__strict_trace.snap index a6f1849b..4081617d 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__strict_trace.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__strict_trace.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__true.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__true.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__true.snap index ed91e490..f64650d5 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__true.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__true.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 22 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__wrong_test.snap similarity index 82% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__wrong_test.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__wrong_test.snap index 444fba05..e688d465 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_bool__wrong_test.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__boolean__wrong_test.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_bool.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(root), pretty(after))" --- --- before diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_alias_repeated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_alias_repeated.snap new file mode 100644 index 00000000..194d8105 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_alias_repeated.snap @@ -0,0 +1,84 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int) = constr 0 (trace "field" in 21) in +let subject#2 : @constr[0](int) = subject#1 in +let subject#3 : @constr[0](int) = subject#2 in +let first#6 : int = case@Tag subject#3 of + 0 x#4 -> x#4 in +let second#7 : int = case@Tag subject#1 of + 0 y#5 -> y#5 in +addInteger first#6 second#7 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam subject_3 + [(lam first_6 + [(lam second_7 [[(builtin addInteger) first_6] second_7]) + (case subject_1 (lam y_5 y_5))]) + (case subject_3 (lam x_4 x_4))]) + subject_2]) + subject_1]) + (constr 0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 21))]))]) +--- optimized Core +let anf#15 : int = trace "field" in 21 in +addInteger anf#15 anf#15 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam anf_1 [[(builtin addInteger) anf_1] anf_1]) + (force [[builtin_2 (con string "field")] (delay (con integer 21))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#8 : int = trace "field" in 21 in +let subject#1 : @constr[0](int) = constr 0 anf#8 in +let subject#2 : @constr[0](int) = subject#1 in +let subject#3 : @constr[0](int) = subject#2 in +let first#6 : int = case@Tag subject#3 of + 0 x#4 -> x#4 in +let second#7 : int = case@Tag subject#1 of + 0 y#5 -> y#5 in +addInteger first#6 second#7 +--- isolated folded Core +let anf#8 : int = trace "field" in 21 in +let subject#1 : @constr[0](int) = constr 0 anf#8 in +let subject#2 : @constr[0](int) = subject#1 in +let subject#3 : @constr[0](int) = subject#2 in +let first#6 : int = let x#4 : int = anf#8 in +x#4 in +let second#7 : int = let y#5 : int = anf#8 in +y#5 in +addInteger first#6 second#7 +--- isolated cleaned Core +let anf#8 : int = trace "field" in 21 in +addInteger anf#8 anf#8 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam subject_1 + [(lam subject_2 + [(lam subject_3 + [(lam first_6 + [(lam second_7 [[(builtin addInteger) first_6] second_7]) + (case subject_1 (lam y_5 y_5))]) + (case subject_3 (lam x_4 x_4))]) + subject_2]) + subject_1]) + (constr 0 anf_8)]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 21))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 [[(builtin addInteger) anf_8] anf_8]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 21))])]) +--- result +(con integer 42) +--- logs +["field"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_arity.snap new file mode 100644 index 00000000..bf665763 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_arity.snap @@ -0,0 +1,45 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#1 of + 0 x#2 -> x#2 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 (case subject_1 (lam x_2 x_2))) + (constr 0 (con integer 21) (con integer 22))]) +--- optimized Core +let subject#3 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#3 of + 0 x#4 -> x#4 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (case subject_1 (lam x_2 x_2))) + (constr 0 (con integer 21) (con integer 22))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#1 of + 0 x#2 -> x#2 +--- isolated folded Core +let subject#1 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#1 of + 0 x#2 -> x#2 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#1 of + 0 x#2 -> x#2 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 (case subject_1 (lam x_2 x_2))) + (constr 0 (con integer 21) (con integer 22))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (case subject_1 (lam x_2 x_2))) + (constr 0 (con integer 21) (con integer 22))]) +--- result +error: NonFunctionApplication(Con(Integer(22)), Con(Integer(21))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_cold_fields.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_cold_fields.snap new file mode 100644 index 00000000..01d79aa9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_cold_fields.snap @@ -0,0 +1,91 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int) = constr 0 (trace "first" in 7) (trace "second" in 8) in +case@Bool false of + True -> case@Tag subject#1 of + 0 ignored#2 ignored#3 -> trace "cold" in 0 + False -> trace "chosen" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + (case + (con bool False) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 42))]) + (case + subject_1 + (lam ignored_2 + (lam ignored_3 + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 0))])))))) + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 7))]) + (force + [[(force (builtin trace)) (con string "second")] (delay (con integer 8))]))]) +--- optimized Core +let anf#7 : int = trace "first" in 7 in +let anf#8 : int = trace "second" in 8 in +trace "chosen" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 + [(lam anf_2 (force [[builtin_3 (con string "chosen")] (delay (con integer 42))])) + (force [[builtin_3 (con string "second")] (delay (con integer 8))])]) + (force [[builtin_3 (con string "first")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "first" in 7 in +let anf#5 : int = trace "second" in 8 in +let subject#1 : @constr[0](int, int) = constr 0 anf#4 anf#5 in +case@Bool false of + True -> case@Tag subject#1 of + 0 ignored#2 ignored#3 -> trace "cold" in 0 + False -> trace "chosen" in 42 +--- isolated folded Core +let anf#4 : int = trace "first" in 7 in +let anf#5 : int = trace "second" in 8 in +let subject#1 : @constr[0](int, int) = constr 0 anf#4 anf#5 in +case@Bool false of + True -> let ignored#2 : int = anf#4 in + let ignored#3 : int = anf#5 in + trace "cold" in 0 + False -> trace "chosen" in 42 +--- isolated cleaned Core +let anf#4 : int = trace "first" in 7 in +let anf#5 : int = trace "second" in 8 in +trace "chosen" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam subject_1 + (case + (con bool False) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 42))]) + (case + subject_1 + (lam ignored_2 + (lam ignored_3 + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 0))])))))) + (constr 0 anf_4 anf_5)]) + (force + [[(force (builtin trace)) (con string "second")] (delay (con integer 8))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 7))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 42))])) + (force + [[(force (builtin trace)) (con string "second")] (delay (con integer 8))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 7))])]) +--- result +(con integer 42) +--- logs +["first", "second", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_default.snap new file mode 100644 index 00000000..32b8e71f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_default.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let subject#4 : @constr[0]() = constr 0 in +case@Tag subject#4 of + 0 -> 42 + _ -> 0 +--- after +let subject#4 : @constr[0]() = constr 0 in +case@Tag subject#4 of + 0 -> 42 + _ -> 0 +--- errors +InvalidCase("tag defaults must be expanded using constructor arities") +InvalidCase("tag defaults must be expanded using constructor arities") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_delay_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_delay_capture.snap new file mode 100644 index 00000000..dfd37a64 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_delay_capture.snap @@ -0,0 +1,49 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#5 : @constr[0](int) = constr 0 (trace "field" in 42) in +force (delay (case@Tag subject#5 of + 0 x#6 -> x#6)) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_5 (force (delay (case subject_5 (lam x_6 x_6))))) + (constr 0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))]))]) +--- optimized Core +trace "field" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "field")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#8 : int = trace "field" in 42 in +let subject#5 : @constr[0](int) = constr 0 anf#8 in +force (delay (case@Tag subject#5 of + 0 x#6 -> x#6)) +--- isolated folded Core +let anf#8 : int = trace "field" in 42 in +let subject#5 : @constr[0](int) = constr 0 anf#8 in +force (delay (let x#6 : int = anf#8 in +x#6)) +--- isolated cleaned Core +trace "field" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam subject_5 (force (delay (case subject_5 (lam x_6 x_6))))) + (constr 0 anf_8)]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["field"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_delay_field.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_delay_field.snap new file mode 100644 index 00000000..8f745e39 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_delay_field.snap @@ -0,0 +1,81 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#9 : @constr[0](@delay int) = constr 0 (delay (let parameter#8 : int = 21 in +trace "called" in parameter#8)) in +addInteger (case@Tag subject#9 of + 0 x#10 -> force x#10) (case@Tag subject#9 of + 0 y#11 -> force y#11) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_9 + [[(builtin addInteger) (case subject_9 (lam x_10 (force x_10)))] + (case subject_9 (lam y_11 (force y_11)))]) + (constr 0 + (delay + [(lam parameter_8 + (force [[(force (builtin trace)) (con string "called")] (delay parameter_8)])) + (con integer 21)]))]) +--- optimized Core +let field#7 : @delay int = delay (trace "called" in 21) in +let anf#5 : int = force field#7 in +let anf#6 : int = force field#7 in +addInteger anf#5 anf#6 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam field_1 + [(lam anf_2 [(lam anf_3 [[(builtin addInteger) anf_2] anf_3]) (force field_1)]) + (force field_1)]) + (delay (force [[builtin_4 (con string "called")] (delay (con integer 21))]))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let subject#9 : @constr[0](@delay int) = constr 0 (delay (let parameter#8 : int = 21 in +trace "called" in parameter#8)) in +let anf#12 : int = case@Tag subject#9 of + 0 x#10 -> force x#10 in +let anf#13 : int = case@Tag subject#9 of + 0 y#11 -> force y#11 in +addInteger anf#12 anf#13 +--- isolated folded Core +let field#14 : @delay int = delay (let parameter#8 : int = 21 in +trace "called" in parameter#8) in +let subject#9 : @constr[0](@delay int) = constr 0 field#14 in +let anf#12 : int = let x#10 : @delay int = field#14 in +force x#10 in +let anf#13 : int = let y#11 : @delay int = field#14 in +force y#11 in +addInteger anf#12 anf#13 +--- isolated cleaned Core +let field#14 : @delay int = delay (trace "called" in 21) in +let anf#12 : int = force field#14 in +let anf#13 : int = force field#14 in +addInteger anf#12 anf#13 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_9 + [(lam anf_12 + [(lam anf_13 [[(builtin addInteger) anf_12] anf_13]) + (case subject_9 (lam y_11 (force y_11)))]) + (case subject_9 (lam x_10 (force x_10)))]) + (constr 0 + (delay + [(lam parameter_8 + (force [[(force (builtin trace)) (con string "called")] (delay parameter_8)])) + (con integer 21)]))]) +--- isolated UPLC after +(program 1.1.0 + [(lam field_14 + [(lam anf_12 + [(lam anf_13 [[(builtin addInteger) anf_12] anf_13]) (force field_14)]) + (force field_14)]) + (delay + (force + [[(force (builtin trace)) (con string "called")] (delay (con integer 21))]))]) +--- result +(con integer 42) +--- logs +["called", "called"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_duplicate.snap new file mode 100644 index 00000000..f779f532 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_duplicate.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let subject#2 : @constr[0]() = constr 0 in +case@Tag subject#2 of + 0 -> 42 + 0 -> 42 +--- after +let subject#2 : @constr[0]() = constr 0 in +case@Tag subject#2 of + 0 -> 42 + 0 -> 42 +--- errors +InvalidCase("tag branches must cover consecutive unique tags") +InvalidCase("tag branches must cover consecutive unique tags") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_empty.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_empty.snap new file mode 100644 index 00000000..1533b6b0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_empty.snap @@ -0,0 +1,36 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#3 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#3 of +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_3 (case subject_3)) (constr 0 (con integer 21) (con integer 22))]) +--- optimized Core +let subject#1 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#1 of +--- optimized UPLC +(program 1.1.0 + [(lam subject_2 (case subject_2)) (constr 0 (con integer 21) (con integer 22))]) +--- isolated pass +--- isolated ANF input +let subject#3 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#3 of +--- isolated folded Core +let subject#3 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#3 of +--- isolated cleaned Core +let subject#3 : @constr[0](int, int) = constr 0 21 22 in +case@Tag subject#3 of +--- isolated UPLC before +(program 1.1.0 + [(lam subject_3 (case subject_3)) (constr 0 (con integer 21) (con integer 22))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_3 (case subject_3)) (constr 0 (con integer 21) (con integer 22))]) +--- result +error: MissingCaseBranch([], Constr(0, [Con(Integer(21)), Con(Integer(22))])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_escape.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_escape.snap new file mode 100644 index 00000000..61eb3cf0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_escape.snap @@ -0,0 +1,99 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#9 : @constr[0](int) = constr 0 (trace "field" in 21) in +let subject#10 : @constr[0](int) = subject#9 in +let subject#11 : @constr[0](int) = subject#10 in +let first#14 : int = case@Tag subject#11 of + 0 x#12 -> x#12 in +let second#15 : int = case@Tag subject#9 of + 0 y#13 -> y#13 in +constr 0 subject#9 (addInteger first#14 second#15) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_9 + [(lam subject_10 + [(lam subject_11 + [(lam first_14 + [(lam second_15 (constr 0 subject_9 [[(builtin addInteger) first_14] second_15])) + (case subject_9 (lam y_13 y_13))]) + (case subject_11 (lam x_12 x_12))]) + subject_10]) + subject_9]) + (constr 0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 21))]))]) +--- optimized Core +let anf#8 : int = trace "field" in 21 in +let subject#1 : @constr[0](int) = constr 0 anf#8 in +let anf#9 : int = addInteger anf#8 anf#8 in +constr 0 subject#1 anf#9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 + [(lam subject_3 + [(lam anf_4 (constr 0 subject_3 anf_4)) [[(builtin addInteger) anf_2] anf_2]]) + (constr 0 anf_2)]) + (force [[builtin_5 (con string "field")] (delay (con integer 21))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#16 : int = trace "field" in 21 in +let subject#9 : @constr[0](int) = constr 0 anf#16 in +let subject#10 : @constr[0](int) = subject#9 in +let subject#11 : @constr[0](int) = subject#10 in +let first#14 : int = case@Tag subject#11 of + 0 x#12 -> x#12 in +let second#15 : int = case@Tag subject#9 of + 0 y#13 -> y#13 in +let anf#17 : int = addInteger first#14 second#15 in +constr 0 subject#9 anf#17 +--- isolated folded Core +let anf#16 : int = trace "field" in 21 in +let subject#9 : @constr[0](int) = constr 0 anf#16 in +let subject#10 : @constr[0](int) = subject#9 in +let subject#11 : @constr[0](int) = subject#10 in +let first#14 : int = let x#12 : int = anf#16 in +x#12 in +let second#15 : int = let y#13 : int = anf#16 in +y#13 in +let anf#17 : int = addInteger first#14 second#15 in +constr 0 subject#9 anf#17 +--- isolated cleaned Core +let anf#16 : int = trace "field" in 21 in +let subject#9 : @constr[0](int) = constr 0 anf#16 in +let anf#17 : int = addInteger anf#16 anf#16 in +constr 0 subject#9 anf#17 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_16 + [(lam subject_9 + [(lam subject_10 + [(lam subject_11 + [(lam first_14 + [(lam second_15 + [(lam anf_17 (constr 0 subject_9 anf_17)) + [[(builtin addInteger) first_14] second_15]]) + (case subject_9 (lam y_13 y_13))]) + (case subject_11 (lam x_12 x_12))]) + subject_10]) + subject_9]) + (constr 0 anf_16)]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 21))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_16 + [(lam subject_9 + [(lam anf_17 (constr 0 subject_9 anf_17)) + [[(builtin addInteger) anf_16] anf_16]]) + (constr 0 anf_16)]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 21))])]) +--- result +(constr 0 (constr 0 (con integer 21)) (con integer 42)) +--- logs +["field"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_function_capture.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_function_capture.snap new file mode 100644 index 00000000..998457e5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_function_capture.snap @@ -0,0 +1,49 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int) = constr 0 (trace "field" in 42) in +(\ignored#3 : int -> case@Tag subject#1 of + 0 x#2 -> x#2) 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 [(lam ignored_3 (case subject_1 (lam x_2 x_2))) (con integer 0)]) + (constr 0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))]))]) +--- optimized Core +trace "field" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "field")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "field" in 42 in +let subject#1 : @constr[0](int) = constr 0 anf#4 in +(\ignored#3 : int -> case@Tag subject#1 of + 0 x#2 -> x#2) 0 +--- isolated folded Core +let anf#4 : int = trace "field" in 42 in +let subject#1 : @constr[0](int) = constr 0 anf#4 in +(\ignored#3 : int -> let x#2 : int = anf#4 in +x#2) 0 +--- isolated cleaned Core +trace "field" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam subject_1 [(lam ignored_3 (case subject_1 (lam x_2 x_2))) (con integer 0)]) + (constr 0 anf_4)]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["field"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_function_field.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_function_field.snap new file mode 100644 index 00000000..7626001d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_function_field.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#2 : @constr[0](int -> int) = constr 0 (\parameter#1 : int -> trace "called" in parameter#1) in +addInteger (case@Tag subject#2 of + 0 x#3 -> x#3 21) (case@Tag subject#2 of + 0 y#4 -> y#4 21) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_2 + [[(builtin addInteger) (case subject_2 (lam x_3 [x_3 (con integer 21)]))] + (case subject_2 (lam y_4 [y_4 (con integer 21)]))]) + (constr 0 + (lam parameter_1 + (force [[(force (builtin trace)) (con string "called")] (delay parameter_1)])))]) +--- optimized Core +let field#11 : int -> int = \parameter#5 : int -> trace "called" in parameter#5 in +let anf#9 : int = field#11 21 in +let anf#10 : int = field#11 21 in +addInteger anf#9 anf#10 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam field_2 + [(lam anf_3 + [(lam anf_4 [[(builtin addInteger) anf_3] anf_4]) [field_2 (con integer 21)]]) + [field_2 (con integer 21)]]) + (lam parameter_1 + (force [[builtin_5 (con string "called")] (delay parameter_1)]))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let subject#2 : @constr[0](int -> int) = constr 0 (\parameter#1 : int -> trace "called" in parameter#1) in +let anf#5 : int = case@Tag subject#2 of + 0 x#3 -> x#3 21 in +let anf#6 : int = case@Tag subject#2 of + 0 y#4 -> y#4 21 in +addInteger anf#5 anf#6 +--- isolated folded Core +let field#7 : int -> int = \parameter#1 : int -> trace "called" in parameter#1 in +let subject#2 : @constr[0](int -> int) = constr 0 field#7 in +let anf#5 : int = let x#3 : int -> int = field#7 in +x#3 21 in +let anf#6 : int = let y#4 : int -> int = field#7 in +y#4 21 in +addInteger anf#5 anf#6 +--- isolated cleaned Core +let field#7 : int -> int = \parameter#1 : int -> trace "called" in parameter#1 in +let anf#5 : int = field#7 21 in +let anf#6 : int = field#7 21 in +addInteger anf#5 anf#6 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_2 + [(lam anf_5 + [(lam anf_6 [[(builtin addInteger) anf_5] anf_6]) + (case subject_2 (lam y_4 [y_4 (con integer 21)]))]) + (case subject_2 (lam x_3 [x_3 (con integer 21)]))]) + (constr 0 + (lam parameter_1 + (force [[(force (builtin trace)) (con string "called")] (delay parameter_1)])))]) +--- isolated UPLC after +(program 1.1.0 + [(lam field_7 + [(lam anf_5 + [(lam anf_6 [[(builtin addInteger) anf_5] anf_6]) [field_7 (con integer 21)]]) + [field_7 (con integer 21)]]) + (lam parameter_1 + (force [[(force (builtin trace)) (con string "called")] (delay parameter_1)]))]) +--- result +(con integer 42) +--- logs +["called", "called"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_ignored_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_ignored_failure.snap new file mode 100644 index 00000000..e35d00b4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_ignored_failure.snap @@ -0,0 +1,91 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#6 : @constr[0](int, int) = constr 0 (trace "first" in error) (trace "second" in 8) in +case@Bool false of + True -> case@Tag subject#6 of + 0 ignored#7 ignored#8 -> trace "cold" in 0 + False -> trace "chosen" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_6 + (case + (con bool False) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 42))]) + (case + subject_6 + (lam ignored_7 + (lam ignored_8 + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 0))])))))) + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (error))]) + (force + [[(force (builtin trace)) (con string "second")] (delay (con integer 8))]))]) +--- optimized Core +let anf#4 : int = trace "first" in error in +let anf#5 : int = trace "second" in 8 in +trace "chosen" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 + [(lam anf_2 (force [[builtin_3 (con string "chosen")] (delay (con integer 42))])) + (force [[builtin_3 (con string "second")] (delay (con integer 8))])]) + (force [[builtin_3 (con string "first")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#9 : int = trace "first" in error in +let anf#10 : int = trace "second" in 8 in +let subject#6 : @constr[0](int, int) = constr 0 anf#9 anf#10 in +case@Bool false of + True -> case@Tag subject#6 of + 0 ignored#7 ignored#8 -> trace "cold" in 0 + False -> trace "chosen" in 42 +--- isolated folded Core +let anf#9 : int = trace "first" in error in +let anf#10 : int = trace "second" in 8 in +let subject#6 : @constr[0](int, int) = constr 0 anf#9 anf#10 in +case@Bool false of + True -> let ignored#7 : int = anf#9 in + let ignored#8 : int = anf#10 in + trace "cold" in 0 + False -> trace "chosen" in 42 +--- isolated cleaned Core +let anf#9 : int = trace "first" in error in +let anf#10 : int = trace "second" in 8 in +trace "chosen" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + [(lam subject_6 + (case + (con bool False) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 42))]) + (case + subject_6 + (lam ignored_7 + (lam ignored_8 + (force [[(force (builtin trace)) (con string "cold")] (delay (con integer 0))])))))) + (constr 0 anf_9 anf_10)]) + (force + [[(force (builtin trace)) (con string "second")] (delay (con integer 8))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 42))])) + (force + [[(force (builtin trace)) (con string "second")] (delay (con integer 8))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["first"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_missing_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_missing_tag.snap new file mode 100644 index 00000000..ad16bf9d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_missing_tag.snap @@ -0,0 +1,46 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#3 : @constr[2]() = constr 2 in +case@Tag subject#3 of + 1 -> 42 + 0 -> 21 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_3 (case subject_3 (con integer 21) (con integer 42))) (constr 2)]) +--- optimized Core +let subject#1 : @constr[2]() = constr 2 in +case@Tag subject#1 of + 1 -> 42 + 0 -> 21 +--- optimized UPLC +(program 1.1.0 + [(lam subject_2 (case subject_2 (con integer 21) (con integer 42))) (constr 2)]) +--- isolated pass +--- isolated ANF input +let subject#3 : @constr[2]() = constr 2 in +case@Tag subject#3 of + 1 -> 42 + 0 -> 21 +--- isolated folded Core +let subject#3 : @constr[2]() = constr 2 in +case@Tag subject#3 of + 1 -> 42 + 0 -> 21 +--- isolated cleaned Core +let subject#3 : @constr[2]() = constr 2 in +case@Tag subject#3 of + 1 -> 42 + 0 -> 21 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_3 (case subject_3 (con integer 21) (con integer 42))) (constr 2)]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_3 (case subject_3 (con integer 21) (con integer 42))) (constr 2)]) +--- result +error: MissingCaseBranch([Constant(Integer(21)), Constant(Integer(42))], Constr(2, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_nested.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_nested.snap new file mode 100644 index 00000000..90dcc765 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_nested.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int) = constr 0 (trace "field" in 42) in +let subject#2 : @constr[0](@constr[0](int)) = constr 0 subject#1 in +case@Tag subject#2 of + 0 subject#3 -> case@Tag subject#3 of + 0 x#4 -> x#4 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 (case subject_2 (lam subject_3 (case subject_3 (lam x_4 x_4))))) + (constr 0 subject_1)]) + (constr 0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))]))]) +--- optimized Core +trace "field" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "field")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#5 : int = trace "field" in 42 in +let subject#1 : @constr[0](int) = constr 0 anf#5 in +let subject#2 : @constr[0](@constr[0](int)) = constr 0 subject#1 in +case@Tag subject#2 of + 0 subject#3 -> case@Tag subject#3 of + 0 x#4 -> x#4 +--- isolated folded Core +let anf#5 : int = trace "field" in 42 in +let subject#1 : @constr[0](int) = constr 0 anf#5 in +let subject#2 : @constr[0](@constr[0](int)) = constr 0 subject#1 in +let subject#3 : @constr[0](int) = subject#1 in +case@Tag subject#3 of + 0 x#4 -> x#4 +--- isolated cleaned Core +trace "field" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_5 + [(lam subject_1 + [(lam subject_2 (case subject_2 (lam subject_3 (case subject_3 (lam x_4 x_4))))) + (constr 0 subject_1)]) + (constr 0 anf_5)]) + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "field")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["field"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_nullary.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_nullary.snap new file mode 100644 index 00000000..a6552773 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_nullary.snap @@ -0,0 +1,36 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0]() = constr 0 in +case@Tag subject#1 of + 1 -> 42 + 0 -> 21 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 (case subject_1 (con integer 21) (con integer 42))) (constr 0)]) +--- optimized Core +21 +--- optimized UPLC +(program 1.1.0 (con integer 21)) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0]() = constr 0 in +case@Tag subject#1 of + 1 -> 42 + 0 -> 21 +--- isolated folded Core +let subject#1 : @constr[0]() = constr 0 in +21 +--- isolated cleaned Core +21 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 (case subject_1 (con integer 21) (con integer 42))) (constr 0)]) +--- isolated UPLC after +(program 1.1.0 (con integer 21)) +--- result +(con integer 21) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_reordered.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_reordered.snap new file mode 100644 index 00000000..d78ba3f0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_reordered.snap @@ -0,0 +1,36 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#2 : @constr[1]() = constr 1 in +case@Tag subject#2 of + 1 -> 42 + 0 -> 21 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_2 (case subject_2 (con integer 21) (con integer 42))) (constr 1)]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +let subject#2 : @constr[1]() = constr 1 in +case@Tag subject#2 of + 1 -> 42 + 0 -> 21 +--- isolated folded Core +let subject#2 : @constr[1]() = constr 1 in +42 +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_2 (case subject_2 (con integer 21) (con integer 42))) (constr 1)]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_sparse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_sparse.snap new file mode 100644 index 00000000..d4e83b10 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_sparse.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let subject#1 : @constr[0]() = constr 0 in +case@Tag subject#1 of + 59 -> 42 +--- after +let subject#1 : @constr[0]() = constr 0 in +case@Tag subject#1 of + 59 -> 42 +--- errors +InvalidCase("tag branches must cover consecutive unique tags") +InvalidCase("tag branches must cover consecutive unique tags") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_wrong_test.snap new file mode 100644 index 00000000..ce3bd4e8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__bound_wrong_test.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let subject#3 : @constr[0]() = constr 0 in +case@Tag subject#3 of + True -> 42 +--- after +let subject#3 : @constr[0]() = constr 0 in +case@Tag subject#3 of + True -> 42 +--- errors +InvalidCase("tag branches must cover consecutive unique tags") +InvalidCase("tag branches must cover consecutive unique tags") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__cold.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__cold.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__cold.snap index 2a79e228..9de050ce 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__cold.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__cold.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 41 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__duplicate.snap similarity index 85% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__duplicate.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__duplicate.snap index 1abf79ed..3d6b3bb2 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__duplicate.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__duplicate.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 280 expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(c), pretty(after))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__effectful_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__effectful_subject.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__effectful_subject.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__effectful_subject.snap index 0e101058..b8b02f6d 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__effectful_subject.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__effectful_subject.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 41 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__empty_table.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__empty_table.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__empty_table.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__empty_table.snap index 19b95835..a8b01bc3 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__empty_table.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__empty_table.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 41 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__extra_field.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__extra_field.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__extra_field.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__extra_field.snap index dc25ce8d..4bb6ddf6 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__extra_field.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__extra_field.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 41 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_1_0_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_1_0_escape_false.snap new file mode 100644 index 00000000..0dad6b8e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_1_0_escape_false.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int) = constr 0 0 in +let subject#2 : @constr[0](int) = subject#1 in +constr 0 (field@0/1 subject#2) (field@0/1 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case subject_2 (lam generated_3 generated_3)) + (case subject_2 (lam generated_4 generated_4)))) + subject_1]) + (constr 0 (con integer 0))]) +--- optimized Core +constr 0 0 0 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 0) (con integer 0))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int) = constr 0 0 in +let subject#2 : @constr[0](int) = subject#1 in +let anf#3 : int = field@0/1 subject#2 in +let anf#4 : int = field@0/1 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let subject#1 : @constr[0](int) = constr 0 field#5 in +let subject#2 : @constr[0](int) = subject#1 in +let anf#3 : int = field#5 in +let anf#4 : int = field#5 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 0 0 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case subject_2 (lam generated_5 generated_5))]) + (case subject_2 (lam generated_6 generated_6))]) + subject_1]) + (constr 0 (con integer 0))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 0) (con integer 0))) +--- result +(constr 0 (con integer 0) (con integer 0)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_1_0_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_1_0_escape_true.snap new file mode 100644 index 00000000..83dccea8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_1_0_escape_true.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int) = constr 0 0 in +let subject#2 : @constr[0](int) = subject#1 in +constr 0 (field@0/1 subject#2) (field@0/1 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case subject_2 (lam generated_3 generated_3)) + (case subject_2 (lam generated_4 generated_4)) + subject_1)) + subject_1]) + (constr 0 (con integer 0))]) +--- optimized Core +let subject#3 : @constr[0](int) = constr 0 0 in +constr 0 0 0 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 0) (con integer 0) subject_1)) + (constr 0 (con integer 0))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int) = constr 0 0 in +let subject#2 : @constr[0](int) = subject#1 in +let anf#3 : int = field@0/1 subject#2 in +let anf#4 : int = field@0/1 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let subject#1 : @constr[0](int) = constr 0 field#5 in +let subject#2 : @constr[0](int) = subject#1 in +let anf#3 : int = field#5 in +let anf#4 : int = field#5 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int) = constr 0 0 in +constr 0 0 0 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case subject_2 (lam generated_5 generated_5))]) + (case subject_2 (lam generated_6 generated_6))]) + subject_1]) + (constr 0 (con integer 0))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 0) (con integer 0) subject_1)) + (constr 0 (con integer 0))]) +--- result +(constr 0 (con integer 0) (con integer 0) (constr 0 (con integer 0))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_0_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_0_escape_false.snap new file mode 100644 index 00000000..e3017f13 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_0_escape_false.snap @@ -0,0 +1,63 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +constr 0 (field@0/3 subject#2) (field@0/3 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 (lam generated_4 (lam generated_5 generated_3)))) + (case + subject_2 + (lam generated_6 (lam generated_7 (lam generated_8 generated_6)))))) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- optimized Core +constr 0 0 0 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 0) (con integer 0))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field@0/3 subject#2 in +let anf#4 : int = field@0/3 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let subject#1 : @constr[0](int, int, int) = constr 0 field#5 field#6 field#7 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field#5 in +let anf#4 : int = field#5 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 0 0 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 (lam generated_6 (lam generated_7 generated_5))))]) + (case + subject_2 + (lam generated_8 (lam generated_9 (lam generated_10 generated_8))))]) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 0) (con integer 0))) +--- result +(constr 0 (con integer 0) (con integer 0)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_0_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_0_escape_true.snap new file mode 100644 index 00000000..f6e83f35 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_0_escape_true.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +constr 0 (field@0/3 subject#2) (field@0/3 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 (lam generated_4 (lam generated_5 generated_3)))) + (case + subject_2 + (lam generated_6 (lam generated_7 (lam generated_8 generated_6)))) + subject_1)) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int) = constr 0 0 1 2 in +constr 0 0 0 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 0) (con integer 0) subject_1)) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field@0/3 subject#2 in +let anf#4 : int = field@0/3 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let subject#1 : @constr[0](int, int, int) = constr 0 field#5 field#6 field#7 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field#5 in +let anf#4 : int = field#5 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +constr 0 0 0 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 (lam generated_6 (lam generated_7 generated_5))))]) + (case + subject_2 + (lam generated_8 (lam generated_9 (lam generated_10 generated_8))))]) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 0) (con integer 0) subject_1)) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- result +(constr 0 + (con integer 0) + (con integer 0) + (constr 0 (con integer 0) (con integer 1) (con integer 2))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_1_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_1_escape_false.snap new file mode 100644 index 00000000..9980fae9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_1_escape_false.snap @@ -0,0 +1,63 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +constr 0 (field@1/3 subject#2) (field@1/3 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 (lam generated_4 (lam generated_5 generated_4)))) + (case + subject_2 + (lam generated_6 (lam generated_7 (lam generated_8 generated_7)))))) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- optimized Core +constr 0 1 1 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 1) (con integer 1))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field@1/3 subject#2 in +let anf#4 : int = field@1/3 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let subject#1 : @constr[0](int, int, int) = constr 0 field#5 field#6 field#7 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field#6 in +let anf#4 : int = field#6 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 1 1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 (lam generated_6 (lam generated_7 generated_6))))]) + (case + subject_2 + (lam generated_8 (lam generated_9 (lam generated_10 generated_9))))]) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 1) (con integer 1))) +--- result +(constr 0 (con integer 1) (con integer 1)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_1_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_1_escape_true.snap new file mode 100644 index 00000000..08a515b9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_1_escape_true.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +constr 0 (field@1/3 subject#2) (field@1/3 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 (lam generated_4 (lam generated_5 generated_4)))) + (case + subject_2 + (lam generated_6 (lam generated_7 (lam generated_8 generated_7)))) + subject_1)) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int) = constr 0 0 1 2 in +constr 0 1 1 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 1) (con integer 1) subject_1)) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field@1/3 subject#2 in +let anf#4 : int = field@1/3 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let subject#1 : @constr[0](int, int, int) = constr 0 field#5 field#6 field#7 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field#6 in +let anf#4 : int = field#6 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +constr 0 1 1 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 (lam generated_6 (lam generated_7 generated_6))))]) + (case + subject_2 + (lam generated_8 (lam generated_9 (lam generated_10 generated_9))))]) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 1) (con integer 1) subject_1)) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- result +(constr 0 + (con integer 1) + (con integer 1) + (constr 0 (con integer 0) (con integer 1) (con integer 2))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_2_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_2_escape_false.snap new file mode 100644 index 00000000..8c34a4e8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_2_escape_false.snap @@ -0,0 +1,63 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +constr 0 (field@2/3 subject#2) (field@2/3 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 (lam generated_4 (lam generated_5 generated_5)))) + (case + subject_2 + (lam generated_6 (lam generated_7 (lam generated_8 generated_8)))))) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- optimized Core +constr 0 2 2 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 2) (con integer 2))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field@2/3 subject#2 in +let anf#4 : int = field@2/3 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let subject#1 : @constr[0](int, int, int) = constr 0 field#5 field#6 field#7 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field#7 in +let anf#4 : int = field#7 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 2 2 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 (lam generated_6 (lam generated_7 generated_7))))]) + (case + subject_2 + (lam generated_8 (lam generated_9 (lam generated_10 generated_10))))]) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 2) (con integer 2))) +--- result +(constr 0 (con integer 2) (con integer 2)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_2_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_2_escape_true.snap new file mode 100644 index 00000000..9aa14984 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_3_2_escape_true.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +constr 0 (field@2/3 subject#2) (field@2/3 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 (lam generated_4 (lam generated_5 generated_5)))) + (case + subject_2 + (lam generated_6 (lam generated_7 (lam generated_8 generated_8)))) + subject_1)) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int) = constr 0 0 1 2 in +constr 0 2 2 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 2) (con integer 2) subject_1)) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field@2/3 subject#2 in +let anf#4 : int = field@2/3 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let subject#1 : @constr[0](int, int, int) = constr 0 field#5 field#6 field#7 in +let subject#2 : @constr[0](int, int, int) = subject#1 in +let anf#3 : int = field#7 in +let anf#4 : int = field#7 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int) = constr 0 0 1 2 in +constr 0 2 2 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 (lam generated_6 (lam generated_7 generated_7))))]) + (case + subject_2 + (lam generated_8 (lam generated_9 (lam generated_10 generated_10))))]) + subject_1]) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 2) (con integer 2) subject_1)) + (constr 0 (con integer 0) (con integer 1) (con integer 2))]) +--- result +(constr 0 + (con integer 2) + (con integer 2) + (constr 0 (con integer 0) (con integer 1) (con integer 2))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_0_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_0_escape_false.snap new file mode 100644 index 00000000..99200d7e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_0_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@0/8 subject#2) (field@0/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_3))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_11))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 0 0 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 0) (con integer 0))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@0/8 subject#2 in +let anf#4 : int = field@0/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#5 in +let anf#4 : int = field#5 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 0 0 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_5)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_13)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 0) (con integer 0))) +--- result +(constr 0 (con integer 0) (con integer 0)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_0_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_0_escape_true.snap new file mode 100644 index 00000000..dc144573 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_0_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@0/8 subject#2) (field@0/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_3))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_11))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 0 0 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 0) (con integer 0) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@0/8 subject#2 in +let anf#4 : int = field@0/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#5 in +let anf#4 : int = field#5 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 0 0 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_5)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_13)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 0) (con integer 0) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 0) + (con integer 0) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_1_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_1_escape_false.snap new file mode 100644 index 00000000..53a592df --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_1_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@1/8 subject#2) (field@1/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_4))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_12))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 1 1 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 1) (con integer 1))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@1/8 subject#2 in +let anf#4 : int = field@1/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#6 in +let anf#4 : int = field#6 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 1 1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_6)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_14)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 1) (con integer 1))) +--- result +(constr 0 (con integer 1) (con integer 1)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_1_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_1_escape_true.snap new file mode 100644 index 00000000..603e1ac0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_1_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@1/8 subject#2) (field@1/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_4))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_12))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 1 1 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 1) (con integer 1) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@1/8 subject#2 in +let anf#4 : int = field@1/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#6 in +let anf#4 : int = field#6 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 1 1 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_6)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_14)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 1) (con integer 1) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 1) + (con integer 1) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_2_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_2_escape_false.snap new file mode 100644 index 00000000..2498195d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_2_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@2/8 subject#2) (field@2/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_5))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_13))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 2 2 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 2) (con integer 2))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@2/8 subject#2 in +let anf#4 : int = field@2/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#7 in +let anf#4 : int = field#7 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 2 2 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_7)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_15)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 2) (con integer 2))) +--- result +(constr 0 (con integer 2) (con integer 2)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_2_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_2_escape_true.snap new file mode 100644 index 00000000..30f61669 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_2_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@2/8 subject#2) (field@2/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_5))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_13))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 2 2 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 2) (con integer 2) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@2/8 subject#2 in +let anf#4 : int = field@2/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#7 in +let anf#4 : int = field#7 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 2 2 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_7)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_15)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 2) (con integer 2) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 2) + (con integer 2) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_3_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_3_escape_false.snap new file mode 100644 index 00000000..e5e5a7d9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_3_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@3/8 subject#2) (field@3/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_6))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_14))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 3 3 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 3) (con integer 3))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@3/8 subject#2 in +let anf#4 : int = field@3/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#8 in +let anf#4 : int = field#8 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 3 3 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_8)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_16)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 3) (con integer 3))) +--- result +(constr 0 (con integer 3) (con integer 3)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_3_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_3_escape_true.snap new file mode 100644 index 00000000..a2dc813f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_3_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@3/8 subject#2) (field@3/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_6))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_14))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 3 3 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 3) (con integer 3) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@3/8 subject#2 in +let anf#4 : int = field@3/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#8 in +let anf#4 : int = field#8 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 3 3 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_8)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_16)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 3) (con integer 3) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 3) + (con integer 3) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_4_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_4_escape_false.snap new file mode 100644 index 00000000..f84b7443 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_4_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@4/8 subject#2) (field@4/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_7))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_15))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 4 4 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 4) (con integer 4))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@4/8 subject#2 in +let anf#4 : int = field@4/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#9 in +let anf#4 : int = field#9 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 4 4 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_9)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_17)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 4) (con integer 4))) +--- result +(constr 0 (con integer 4) (con integer 4)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_4_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_4_escape_true.snap new file mode 100644 index 00000000..6b220034 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_4_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@4/8 subject#2) (field@4/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_7))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_15))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 4 4 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 4) (con integer 4) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@4/8 subject#2 in +let anf#4 : int = field@4/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#9 in +let anf#4 : int = field#9 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 4 4 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_9)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_17)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 4) (con integer 4) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 4) + (con integer 4) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_5_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_5_escape_false.snap new file mode 100644 index 00000000..0276e8db --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_5_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@5/8 subject#2) (field@5/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_8))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_16))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 5 5 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 5) (con integer 5))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@5/8 subject#2 in +let anf#4 : int = field@5/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#10 in +let anf#4 : int = field#10 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 5 5 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_10)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_18)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 5) (con integer 5))) +--- result +(constr 0 (con integer 5) (con integer 5)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_5_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_5_escape_true.snap new file mode 100644 index 00000000..01cd2a62 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_5_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@5/8 subject#2) (field@5/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_8))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_16))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 5 5 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 5) (con integer 5) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@5/8 subject#2 in +let anf#4 : int = field@5/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#10 in +let anf#4 : int = field#10 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 5 5 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_10)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_18)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 5) (con integer 5) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 5) + (con integer 5) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_6_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_6_escape_false.snap new file mode 100644 index 00000000..fd731555 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_6_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@6/8 subject#2) (field@6/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_9))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_17))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 6 6 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 6) (con integer 6))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@6/8 subject#2 in +let anf#4 : int = field@6/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#11 in +let anf#4 : int = field#11 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 6 6 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_11)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_19)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 6) (con integer 6))) +--- result +(constr 0 (con integer 6) (con integer 6)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_6_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_6_escape_true.snap new file mode 100644 index 00000000..825bad2a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_6_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@6/8 subject#2) (field@6/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_9))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_17))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 6 6 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 6) (con integer 6) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@6/8 subject#2 in +let anf#4 : int = field@6/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#11 in +let anf#4 : int = field#11 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 6 6 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_11)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_19)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 6) (con integer 6) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 6) + (con integer 6) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_7_escape_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_7_escape_false.snap new file mode 100644 index 00000000..15f26216 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_7_escape_false.snap @@ -0,0 +1,104 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@7/8 subject#2) (field@7/8 subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_10))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_18))))))))))) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +constr 0 7 7 +--- optimized UPLC +(program 1.1.0 (constr 0 (con integer 7) (con integer 7))) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@7/8 subject#2 in +let anf#4 : int = field@7/8 subject#2 in +constr 0 anf#3 anf#4 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#12 in +let anf#4 : int = field#12 in +constr 0 anf#3 anf#4 +--- isolated cleaned Core +constr 0 7 7 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_12)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_20)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con integer 7) (con integer 7))) +--- result +(constr 0 (con integer 7) (con integer 7)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_7_escape_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_7_escape_true.snap new file mode 100644 index 00000000..77c33984 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_8_7_escape_true.snap @@ -0,0 +1,138 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +constr 0 (field@7/8 subject#2) (field@7/8 subject#2) subject#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + (constr 0 + (case + subject_2 + (lam generated_3 + (lam generated_4 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 (lam generated_9 (lam generated_10 generated_10))))))))) + (case + subject_2 + (lam generated_11 + (lam generated_12 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 (lam generated_17 (lam generated_18 generated_18))))))))) + subject_1)) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- optimized Core +let subject#3 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 7 7 subject#3 +--- optimized UPLC +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 7) (con integer 7) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated pass +--- isolated ANF input +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field@7/8 subject#2 in +let anf#4 : int = field@7/8 subject#2 in +constr 0 anf#3 anf#4 subject#1 +--- isolated folded Core +let field#5 : int = 0 in +let field#6 : int = 1 in +let field#7 : int = 2 in +let field#8 : int = 3 in +let field#9 : int = 4 in +let field#10 : int = 5 in +let field#11 : int = 6 in +let field#12 : int = 7 in +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 field#5 field#6 field#7 field#8 field#9 field#10 field#11 field#12 in +let subject#2 : @constr[0](int, int, int, int, int, int, int, int) = subject#1 in +let anf#3 : int = field#12 in +let anf#4 : int = field#12 in +constr 0 anf#3 anf#4 subject#1 +--- isolated cleaned Core +let subject#1 : @constr[0](int, int, int, int, int, int, int, int) = constr 0 0 1 2 3 4 5 6 7 in +constr 0 7 7 subject#1 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 + [(lam anf_3 + [(lam anf_4 (constr 0 anf_3 anf_4 subject_1)) + (case + subject_2 + (lam generated_5 + (lam generated_6 + (lam generated_7 + (lam generated_8 + (lam generated_9 + (lam generated_10 (lam generated_11 (lam generated_12 generated_12)))))))))]) + (case + subject_2 + (lam generated_13 + (lam generated_14 + (lam generated_15 + (lam generated_16 + (lam generated_17 + (lam generated_18 (lam generated_19 (lam generated_20 generated_20)))))))))]) + subject_1]) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_1 (constr 0 (con integer 7) (con integer 7) subject_1)) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))]) +--- result +(constr 0 + (con integer 7) + (con integer 7) + (constr 0 + (con integer 0) + (con integer 1) + (con integer 2) + (con integer 3) + (con integer 4) + (con integer 5) + (con integer 6) + (con integer 7))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_delay_captured_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_delay_captured_false.snap new file mode 100644 index 00000000..4c0401d8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_delay_captured_false.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#2 : @delay int = delay (let subject#1 : @constr[0](int) = constr 0 (trace "constructed" in 7) in +field@0/1 subject#1) in +constr 0 (force subject#2) (force subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_2 (constr 0 (force subject_2) (force subject_2))) + (delay + [(lam subject_1 (case subject_1 (lam generated_3 generated_3))) + (constr 0 + (force + [[(force (builtin trace)) (con string "constructed")] (delay (con integer 7))]))])]) +--- optimized Core +let subject#4 : @delay int = delay (trace "constructed" in 7) in +let anf#6 : int = force subject#4 in +let anf#7 : int = force subject#4 in +constr 0 anf#6 anf#7 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam subject_1 + [(lam anf_2 [(lam anf_3 (constr 0 anf_2 anf_3)) (force subject_1)]) + (force subject_1)]) + (delay (force [[builtin_4 (con string "constructed")] (delay (con integer 7))]))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let subject#2 : @delay int = delay (let anf#3 : int = trace "constructed" in 7 in +let subject#1 : @constr[0](int) = constr 0 anf#3 in +field@0/1 subject#1) in +let anf#4 : int = force subject#2 in +let anf#5 : int = force subject#2 in +constr 0 anf#4 anf#5 +--- isolated folded Core +let subject#2 : @delay int = delay (let anf#3 : int = trace "constructed" in 7 in +let subject#1 : @constr[0](int) = constr 0 anf#3 in +anf#3) in +let anf#4 : int = force subject#2 in +let anf#5 : int = force subject#2 in +constr 0 anf#4 anf#5 +--- isolated cleaned Core +let subject#2 : @delay int = delay (trace "constructed" in 7) in +let anf#4 : int = force subject#2 in +let anf#5 : int = force subject#2 in +constr 0 anf#4 anf#5 +--- isolated UPLC before +(program 1.1.0 + [(lam subject_2 + [(lam anf_4 [(lam anf_5 (constr 0 anf_4 anf_5)) (force subject_2)]) + (force subject_2)]) + (delay + [(lam anf_3 + [(lam subject_1 (case subject_1 (lam generated_6 generated_6))) + (constr 0 anf_3)]) + (force + [[(force (builtin trace)) (con string "constructed")] (delay (con integer 7))])])]) +--- isolated UPLC after +(program 1.1.0 + [(lam subject_2 + [(lam anf_4 [(lam anf_5 (constr 0 anf_4 anf_5)) (force subject_2)]) + (force subject_2)]) + (delay + (force + [[(force (builtin trace)) (con string "constructed")] (delay (con integer 7))]))]) +--- result +(constr 0 (con integer 7) (con integer 7)) +--- logs +["constructed", "constructed"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_delay_captured_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_delay_captured_true.snap new file mode 100644 index 00000000..ed48da77 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_delay_captured_true.snap @@ -0,0 +1,77 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#1 : @constr[0](int) = constr 0 (trace "constructed" in 7) in +let subject#2 : @delay int = delay (field@0/1 subject#1) in +constr 0 (force subject#2) (force subject#2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam subject_2 (constr 0 (force subject_2) (force subject_2))) + (delay (case subject_1 (lam generated_3 generated_3)))]) + (constr 0 + (force + [[(force (builtin trace)) (con string "constructed")] (delay (con integer 7))]))]) +--- optimized Core +let anf#5 : int = trace "constructed" in 7 in +let subject#4 : @delay int = delay anf#5 in +let anf#6 : int = force subject#4 in +let anf#7 : int = force subject#4 in +constr 0 anf#6 anf#7 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_9 + [(lam anf_1 + [(lam subject_2 + [(lam anf_3 [(lam anf_8 (constr 0 anf_3 anf_8)) (force subject_2)]) + (force subject_2)]) + (delay anf_1)]) + (force [[builtin_9 (con string "constructed")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#3 : int = trace "constructed" in 7 in +let subject#1 : @constr[0](int) = constr 0 anf#3 in +let subject#2 : @delay int = delay (field@0/1 subject#1) in +let anf#4 : int = force subject#2 in +let anf#5 : int = force subject#2 in +constr 0 anf#4 anf#5 +--- isolated folded Core +let anf#3 : int = trace "constructed" in 7 in +let subject#1 : @constr[0](int) = constr 0 anf#3 in +let subject#2 : @delay int = delay anf#3 in +let anf#4 : int = force subject#2 in +let anf#5 : int = force subject#2 in +constr 0 anf#4 anf#5 +--- isolated cleaned Core +let anf#3 : int = trace "constructed" in 7 in +let subject#2 : @delay int = delay anf#3 in +let anf#4 : int = force subject#2 in +let anf#5 : int = force subject#2 in +constr 0 anf#4 anf#5 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam subject_1 + [(lam subject_2 + [(lam anf_4 [(lam anf_5 (constr 0 anf_4 anf_5)) (force subject_2)]) + (force subject_2)]) + (delay (case subject_1 (lam generated_6 generated_6)))]) + (constr 0 anf_3)]) + (force + [[(force (builtin trace)) (con string "constructed")] (delay (con integer 7))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_3 + [(lam subject_2 + [(lam anf_4 [(lam anf_5 (constr 0 anf_4 anf_5)) (force subject_2)]) + (force subject_2)]) + (delay anf_3)]) + (force + [[(force (builtin trace)) (con string "constructed")] (delay (con integer 7))])]) +--- result +(constr 0 (con integer 7) (con integer 7)) +--- logs +["constructed"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_0_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_0_failure_false.snap new file mode 100644 index 00000000..e09f8280 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_0_failure_false.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@0/3 (constr 0 (trace "first" in 1) (trace "middle" in 2) (trace "last" in 3)) +--- unoptimized UPLC +(program 1.1.0 + (case + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (lam generated_1 (lam generated_2 (lam generated_3 generated_1))))) +--- optimized Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 anf_4) + (force [[builtin_7 (con string "last")] (delay (con integer 3))])]) + (force [[builtin_7 (con string "middle")] (delay (con integer 2))])]) + (force [[builtin_7 (con string "first")] (delay (con integer 1))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +field@0/3 anf#4 +--- isolated folded Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +anf#1 +--- isolated cleaned Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +anf#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_5 (lam generated_6 (lam generated_7 generated_5))))) + (constr 0 anf_1 anf_2 anf_3)]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 anf_1) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- result +(con integer 1) +--- logs +["first", "middle", "last"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_0_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_0_failure_true.snap new file mode 100644 index 00000000..c7a8514b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_0_failure_true.snap @@ -0,0 +1,70 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@0/3 (constr 0 (trace "first" in 1) (trace "middle" in error) (trace "last" in 3)) +--- unoptimized UPLC +(program 1.1.0 + (case + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (lam generated_1 (lam generated_2 (lam generated_3 generated_1))))) +--- optimized Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 anf_4) + (force [[builtin_7 (con string "last")] (delay (con integer 3))])]) + (force [[builtin_7 (con string "middle")] (delay (error))])]) + (force [[builtin_7 (con string "first")] (delay (con integer 1))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +field@0/3 anf#4 +--- isolated folded Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +anf#1 +--- isolated cleaned Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +anf#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_5 (lam generated_6 (lam generated_7 generated_5))))) + (constr 0 anf_1 anf_2 anf_3)]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 anf_1) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- result +error: ExplicitErrorTerm +--- logs +["first", "middle"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_1_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_1_failure_false.snap new file mode 100644 index 00000000..8645ca0c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_1_failure_false.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@1/3 (constr 0 (trace "first" in 1) (trace "middle" in 2) (trace "last" in 3)) +--- unoptimized UPLC +(program 1.1.0 + (case + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (lam generated_1 (lam generated_2 (lam generated_3 generated_2))))) +--- optimized Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 anf_5) + (force [[builtin_7 (con string "last")] (delay (con integer 3))])]) + (force [[builtin_7 (con string "middle")] (delay (con integer 2))])]) + (force [[builtin_7 (con string "first")] (delay (con integer 1))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +field@1/3 anf#4 +--- isolated folded Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +anf#2 +--- isolated cleaned Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +anf#2 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_5 (lam generated_6 (lam generated_7 generated_6))))) + (constr 0 anf_1 anf_2 anf_3)]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 anf_2) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- result +(con integer 2) +--- logs +["first", "middle", "last"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_1_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_1_failure_true.snap new file mode 100644 index 00000000..243a17e1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_1_failure_true.snap @@ -0,0 +1,70 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@1/3 (constr 0 (trace "first" in 1) (trace "middle" in error) (trace "last" in 3)) +--- unoptimized UPLC +(program 1.1.0 + (case + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (lam generated_1 (lam generated_2 (lam generated_3 generated_2))))) +--- optimized Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 anf_5) + (force [[builtin_7 (con string "last")] (delay (con integer 3))])]) + (force [[builtin_7 (con string "middle")] (delay (error))])]) + (force [[builtin_7 (con string "first")] (delay (con integer 1))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +field@1/3 anf#4 +--- isolated folded Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +anf#2 +--- isolated cleaned Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +anf#2 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_5 (lam generated_6 (lam generated_7 generated_6))))) + (constr 0 anf_1 anf_2 anf_3)]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 anf_2) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- result +error: ExplicitErrorTerm +--- logs +["first", "middle"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_2_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_2_failure_false.snap new file mode 100644 index 00000000..252689b2 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_2_failure_false.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@2/3 (constr 0 (trace "first" in 1) (trace "middle" in 2) (trace "last" in 3)) +--- unoptimized UPLC +(program 1.1.0 + (case + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (lam generated_1 (lam generated_2 (lam generated_3 generated_3))))) +--- optimized Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +trace "last" in 3 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_3 + [(lam anf_4 (force [[builtin_5 (con string "last")] (delay (con integer 3))])) + (force [[builtin_5 (con string "middle")] (delay (con integer 2))])]) + (force [[builtin_5 (con string "first")] (delay (con integer 1))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +field@2/3 anf#4 +--- isolated folded Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +anf#3 +--- isolated cleaned Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in 2 in +trace "last" in 3 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_5 (lam generated_6 (lam generated_7 generated_7))))) + (constr 0 anf_1 anf_2 anf_3)]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (force + [[(force (builtin trace)) (con string "middle")] (delay (con integer 2))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- result +(con integer 3) +--- logs +["first", "middle", "last"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_2_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_2_failure_true.snap new file mode 100644 index 00000000..796b1e0e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_effects_2_failure_true.snap @@ -0,0 +1,65 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@2/3 (constr 0 (trace "first" in 1) (trace "middle" in error) (trace "last" in 3)) +--- unoptimized UPLC +(program 1.1.0 + (case + (constr 0 + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (lam generated_1 (lam generated_2 (lam generated_3 generated_3))))) +--- optimized Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +trace "last" in 3 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_3 + [(lam anf_4 (force [[builtin_5 (con string "last")] (delay (con integer 3))])) + (force [[builtin_5 (con string "middle")] (delay (error))])]) + (force [[builtin_5 (con string "first")] (delay (con integer 1))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +field@2/3 anf#4 +--- isolated folded Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +let anf#3 : int = trace "last" in 3 in +let anf#4 : @constr[0](int, int, int) = constr 0 anf#1 anf#2 anf#3 in +anf#3 +--- isolated cleaned Core +let anf#1 : int = trace "first" in 1 in +let anf#2 : int = trace "middle" in error in +trace "last" in 3 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_5 (lam generated_6 (lam generated_7 generated_7))))) + (constr 0 anf_1 anf_2 anf_3)]) + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])]) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 + (force [[(force (builtin trace)) (con string "last")] (delay (con integer 3))])) + (force [[(force (builtin trace)) (con string "middle")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "first")] (delay (con integer 1))])]) +--- result +error: ExplicitErrorTerm +--- logs +["first", "middle"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_extra_fields.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_extra_fields.snap new file mode 100644 index 00000000..15c44110 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_extra_fields.snap @@ -0,0 +1,38 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@0/1 (constr 0 1 2) +--- unoptimized UPLC +(program 1.1.0 + (case (constr 0 (con integer 1) (con integer 2)) (lam generated_1 generated_1))) +--- optimized Core +let anf#1 : @constr[0](int, int) = constr 0 1 2 in +field@0/1 anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 (case anf_2 (lam generated_3 generated_3))) + (constr 0 (con integer 1) (con integer 2))]) +--- isolated pass +--- isolated ANF input +let anf#2 : @constr[0](int, int) = constr 0 1 2 in +field@0/1 anf#2 +--- isolated folded Core +let anf#2 : @constr[0](int, int) = constr 0 1 2 in +field@0/1 anf#2 +--- isolated cleaned Core +let anf#2 : @constr[0](int, int) = constr 0 1 2 in +field@0/1 anf#2 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 (case anf_2 (lam generated_3 generated_3))) + (constr 0 (con integer 1) (con integer 2))]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 (case anf_2 (lam generated_3 generated_3))) + (constr 0 (con integer 1) (con integer 2))]) +--- result +error: NonFunctionApplication(Con(Integer(2)), Con(Integer(1))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_missing_field_returns_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_missing_field_returns_function.snap new file mode 100644 index 00000000..b659ff51 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_missing_field_returns_function.snap @@ -0,0 +1,51 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@0/2 (constr 0 7) 9 +--- unoptimized UPLC +(program 1.1.0 + [(case + (constr 0 (con integer 7)) + (lam generated_1 (lam generated_2 generated_1))) + (con integer 9)]) +--- optimized Core +let anf#1 : @constr[0](int) = constr 0 7 in +let anf#2 : 'erased = field@0/2 anf#1 in +anf#2 9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_3 + [(lam anf_4 [anf_4 (con integer 9)]) + (case anf_3 (lam generated_5 (lam generated_6 generated_5)))]) + (constr 0 (con integer 7))]) +--- isolated pass +--- isolated ANF input +let anf#3 : @constr[0](int) = constr 0 7 in +let anf#4 : 'erased = field@0/2 anf#3 in +anf#4 9 +--- isolated folded Core +let anf#3 : @constr[0](int) = constr 0 7 in +let anf#4 : 'erased = field@0/2 anf#3 in +anf#4 9 +--- isolated cleaned Core +let anf#3 : @constr[0](int) = constr 0 7 in +let anf#4 : 'erased = field@0/2 anf#3 in +anf#4 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam anf_4 [anf_4 (con integer 9)]) + (case anf_3 (lam generated_5 (lam generated_6 generated_5)))]) + (constr 0 (con integer 7))]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_3 + [(lam anf_4 [anf_4 (con integer 9)]) + (case anf_3 (lam generated_5 (lam generated_6 generated_5)))]) + (constr 0 (con integer 7))]) +--- result +(con integer 7) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_nested_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_nested_function.snap new file mode 100644 index 00000000..b1cfc905 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_nested_function.snap @@ -0,0 +1,76 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let subject#2 : int -> int = field@0/1 (field@0/1 (constr 0 (constr 0 (\x#1 : int -> trace "called" in x#1)))) in +constr 0 (subject#2 1) (subject#2 2) +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_2 + (constr 0 [subject_2 (con integer 1)] [subject_2 (con integer 2)])) + (case + (case + (constr 0 + (constr 0 + (lam x_1 (force [[(force (builtin trace)) (con string "called")] (delay x_1)])))) + (lam generated_4 generated_4)) + (lam generated_3 generated_3))]) +--- optimized Core +let field#10 : int -> int = \x#3 : int -> trace "called" in x#3 in +let anf#8 : int = field#10 1 in +let anf#9 : int = field#10 2 in +constr 0 anf#8 anf#9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam field_2 + [(lam anf_4 [(lam anf_5 (constr 0 anf_4 anf_5)) [field_2 (con integer 2)]]) + [field_2 (con integer 1)]]) + (lam x_1 (force [[builtin_6 (con string "called")] (delay x_1)]))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#3 : @constr[0](int -> int) = constr 0 (\x#1 : int -> trace "called" in x#1) in +let anf#4 : @constr[0](@constr[0](int -> int)) = constr 0 anf#3 in +let anf#5 : @constr[0](int -> int) = field@0/1 anf#4 in +let subject#2 : int -> int = field@0/1 anf#5 in +let anf#6 : int = subject#2 1 in +let anf#7 : int = subject#2 2 in +constr 0 anf#6 anf#7 +--- isolated folded Core +let anf#3 : @constr[0](int -> int) = constr 0 (\x#1 : int -> trace "called" in x#1) in +let anf#4 : @constr[0](@constr[0](int -> int)) = constr 0 anf#3 in +let anf#5 : @constr[0](int -> int) = anf#3 in +let subject#2 : int -> int = field@0/1 anf#5 in +let anf#6 : int = subject#2 1 in +let anf#7 : int = subject#2 2 in +constr 0 anf#6 anf#7 +--- isolated cleaned Core +let field#8 : int -> int = \x#1 : int -> trace "called" in x#1 in +let anf#6 : int = field#8 1 in +let anf#7 : int = field#8 2 in +constr 0 anf#6 anf#7 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam anf_4 + [(lam anf_5 + [(lam subject_2 + [(lam anf_6 [(lam anf_7 (constr 0 anf_6 anf_7)) [subject_2 (con integer 2)]]) + [subject_2 (con integer 1)]]) + (case anf_5 (lam generated_8 generated_8))]) + (case anf_4 (lam generated_9 generated_9))]) + (constr 0 anf_3)]) + (constr 0 + (lam x_1 (force [[(force (builtin trace)) (con string "called")] (delay x_1)])))]) +--- isolated UPLC after +(program 1.1.0 + [(lam field_8 + [(lam anf_6 [(lam anf_7 (constr 0 anf_6 anf_7)) [field_8 (con integer 2)]]) + [field_8 (con integer 1)]]) + (lam x_1 (force [[(force (builtin trace)) (con string "called")] (delay x_1)]))]) +--- result +(constr 0 (con integer 1) (con integer 2)) +--- logs +["called", "called"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_nonzero_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_nonzero_tag.snap new file mode 100644 index 00000000..e6e5a916 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_nonzero_tag.snap @@ -0,0 +1,37 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +field@0/1 (constr 1 1) +--- unoptimized UPLC +(program 1.1.0 (case (constr 1 (con integer 1)) (lam generated_1 generated_1))) +--- optimized Core +let anf#1 : @constr[1](int) = constr 1 1 in +field@0/1 anf#1 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 (case anf_2 (lam generated_3 generated_3))) + (constr 1 (con integer 1))]) +--- isolated pass +--- isolated ANF input +let anf#1 : @constr[1](int) = constr 1 1 in +field@0/1 anf#1 +--- isolated folded Core +let anf#1 : @constr[1](int) = constr 1 1 in +field@0/1 anf#1 +--- isolated cleaned Core +let anf#1 : @constr[1](int) = constr 1 1 in +field@0/1 anf#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 (case anf_1 (lam generated_2 generated_2))) + (constr 1 (con integer 1))]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 (case anf_1 (lam generated_2 generated_2))) + (constr 1 (con integer 1))]) +--- result +error: MissingCaseBranch([Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }], Constr(1, [Con(Integer(1))])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__field_order.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_order.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__field_order.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_order.snap index 16aa83b6..2f32fe8b 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__field_order.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__field_order.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__ignored_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__ignored_failure.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__ignored_failure.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__ignored_failure.snap index d2f80813..69f9f969 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__ignored_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__ignored_failure.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__missing_field.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__missing_field.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__missing_field.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__missing_field.snap index c6f6271e..279b7733 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__missing_field.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__missing_field.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 41 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__nested.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__nested.snap similarity index 92% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__nested.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__nested.snap index f895edae..e10d3118 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__nested.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__nested.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__nullary.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__nullary.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__nullary.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__nullary.snap index bd53c6c1..22787138 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__nullary.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__nullary.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__returned_delay.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__returned_delay.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__returned_delay.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__returned_delay.snap index 17838978..e4bc6101 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__returned_delay.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__returned_delay.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__returned_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__returned_function.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__returned_function.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__returned_function.snap index 53731fce..11afe614 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__returned_function.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__returned_function.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__sparse.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__sparse.snap similarity index 85% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__sparse.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__sparse.snap index 9ea4374a..964b0a9e 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__sparse.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__sparse.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 280 expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(c), pretty(after))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__unexpanded_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__unexpanded_default.snap similarity index 86% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__unexpanded_default.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__unexpanded_default.snap index 7c0d1bd7..fc786a50 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__unexpanded_default.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__unexpanded_default.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 280 expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(c), pretty(after))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__unknown_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__unknown_tag.snap similarity index 95% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__unknown_tag.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__unknown_tag.snap index 96e1daa0..4b266693 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__unknown_tag.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__unknown_tag.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 41 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wildcard_one_field.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wildcard_one_field.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wildcard_one_field.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wildcard_one_field.snap index 6e35cf92..66ee8c07 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wildcard_one_field.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wildcard_one_field.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wildcard_two_fields.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wildcard_two_fields.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wildcard_two_fields.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wildcard_two_fields.snap index 1c4a04f9..5d4e5993 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wildcard_two_fields.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wildcard_two_fields.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" --- --- unoptimized Core diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wrong_test.snap similarity index 85% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wrong_test.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wrong_test.snap index 9b6afeb2..336e8717 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_constr__wrong_test.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__constructor__wrong_test.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/known_constr.rs +source: crates/nash-codegen/src/optimizer_tests/known_case.rs assertion_line: 280 expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(c), pretty(after))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes.snap new file mode 100644 index 00000000..aab72dc3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (B #6e617368)) of + DataB payload#2 -> payload#2 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_2 payload_2) [(builtin unBData) generated_3]])])) + (con data (B #6e617368))]) +--- optimized Core +(con bytestring #6e617368) +--- optimized UPLC +(program 1.1.0 (con bytestring #6e617368)) +--- isolated pass +--- isolated ANF input +case@Data (con data (B #6e617368)) of + DataB payload#2 -> payload#2 + _ -> trace "cold" in error +--- isolated folded Core +let payload#2 : bytes = (con bytestring #6e617368) in +payload#2 +--- isolated cleaned Core +(con bytestring #6e617368) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_2 payload_2) [(builtin unBData) generated_3]])])) + (con data (B #6e617368))]) +--- isolated UPLC after +(program 1.1.0 (con bytestring #6e617368)) +--- result +(con bytestring #6e617368) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes_default.snap new file mode 100644 index 00000000..30009600 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (B #6e617368)) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (B #6e617368))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (B #6e617368)) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (B #6e617368))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes_missing.snap new file mode 100644 index 00000000..32820c18 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__bytes_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (B #6e617368)) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (B #6e617368))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (B #6e617368)) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (B #6e617368))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__captured_original.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__captured_original.snap new file mode 100644 index 00000000..208c3e51 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__captured_original.snap @@ -0,0 +1,56 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = (con data (I 42)) in +force (delay (case@Data data#1 of + DataI payload#2 -> payload#2)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + (force + (delay + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (error))])) + data_1]))) + (con data (I 42))]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +let data#1 : Data = (con data (I 42)) in +force (delay (case@Data data#1 of + DataI payload#2 -> payload#2)) +--- isolated folded Core +let data_payload#3 : int = 42 in +let data#1 : Data = (con data (I 42)) in +force (delay (let payload#2 : int = data_payload#3 in +payload#2)) +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam data_1 + (force + (delay + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (error))])) + data_1]))) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_bytes.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_bytes.snap new file mode 100644 index 00000000..270e5386 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_bytes.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (B #6e617368)) of + DataI unused#6 -> trace "bytes" in 0 + DataB unused#7 -> trace "bytes" in 1 + DataList unused#8 -> trace "bytes" in 2 + DataMap unused#9 -> trace "bytes" in 4 + DataConstr unused#10 -> trace "bytes" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 6))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 4))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 2))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 0))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 1))]))])) + (con data (B #6e617368))]) +--- optimized Core +trace "bytes" in 1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "bytes")] (delay (con integer 1))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (B #6e617368)) of + DataI unused#6 -> trace "bytes" in 0 + DataB unused#7 -> trace "bytes" in 1 + DataList unused#8 -> trace "bytes" in 2 + DataMap unused#9 -> trace "bytes" in 4 + DataConstr unused#10 -> trace "bytes" in 6 + _ -> error +--- isolated folded Core +let unused#7 : bytes = (con bytestring #6e617368) in +trace "bytes" in 1 +--- isolated cleaned Core +trace "bytes" in 1 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 6))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 4))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 2))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 0))]))] + (delay + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 1))]))])) + (con data (B #6e617368))]) +--- isolated UPLC after +(program 1.1.0 + (force [[(force (builtin trace)) (con string "bytes")] (delay (con integer 1))])) +--- result +(con integer 1) +--- logs +["bytes"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_constr.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_constr.snap new file mode 100644 index 00000000..4b633fb0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_constr.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 122 [I 42])) of + DataI unused#36 -> trace "constr" in 0 + DataB unused#37 -> trace "constr" in 1 + DataList unused#38 -> trace "constr" in 2 + DataMap unused#39 -> trace "constr" in 4 + DataConstr unused#40 -> trace "constr" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 1))]))])) + (con data (Constr 122 [I 42]))]) +--- optimized Core +trace "constr" in 6 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "constr")] (delay (con integer 6))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 122 [I 42])) of + DataI unused#36 -> trace "constr" in 0 + DataB unused#37 -> trace "constr" in 1 + DataList unused#38 -> trace "constr" in 2 + DataMap unused#39 -> trace "constr" in 4 + DataConstr unused#40 -> trace "constr" in 6 + _ -> error +--- isolated folded Core +let unused#40 : pair int (list Data) = (con (pair integer (list data)) (122, [(I 42)])) in +trace "constr" in 6 +--- isolated cleaned Core +trace "constr" in 6 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 1))]))])) + (con data (Constr 122 [I 42]))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "constr")] (delay (con integer 6))])) +--- result +(con integer 6) +--- logs +["constr"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_empty_list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_empty_list.snap new file mode 100644 index 00000000..8c15c916 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_empty_list.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [])) of + DataI unused#11 -> trace "empty_list" in 0 + DataB unused#12 -> trace "empty_list" in 1 + DataList unused#13 -> trace "empty_list" in 2 + DataMap unused#14 -> trace "empty_list" in 4 + DataConstr unused#15 -> trace "empty_list" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 1))]))])) + (con data (List []))]) +--- optimized Core +trace "empty_list" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "empty_list")] (delay (con integer 2))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [])) of + DataI unused#11 -> trace "empty_list" in 0 + DataB unused#12 -> trace "empty_list" in 1 + DataList unused#13 -> trace "empty_list" in 2 + DataMap unused#14 -> trace "empty_list" in 4 + DataConstr unused#15 -> trace "empty_list" in 6 + _ -> error +--- isolated folded Core +let unused#13 : list Data = (con (list data) []) in +trace "empty_list" in 2 +--- isolated cleaned Core +trace "empty_list" in 2 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 1))]))])) + (con data (List []))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "empty_list")] (delay (con integer 2))])) +--- result +(con integer 2) +--- logs +["empty_list"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_empty_map.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_empty_map.snap new file mode 100644 index 00000000..3d9c3221 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_empty_map.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [])) of + DataI unused#21 -> trace "empty_map" in 0 + DataB unused#22 -> trace "empty_map" in 1 + DataList unused#23 -> trace "empty_map" in 2 + DataMap unused#24 -> trace "empty_map" in 4 + DataConstr unused#25 -> trace "empty_map" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 1))]))])) + (con data (Map []))]) +--- optimized Core +trace "empty_map" in 4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "empty_map")] (delay (con integer 4))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [])) of + DataI unused#21 -> trace "empty_map" in 0 + DataB unused#22 -> trace "empty_map" in 1 + DataList unused#23 -> trace "empty_map" in 2 + DataMap unused#24 -> trace "empty_map" in 4 + DataConstr unused#25 -> trace "empty_map" in 6 + _ -> error +--- isolated folded Core +let unused#24 : list (pair Data Data) = (con (list (pair data data)) []) in +trace "empty_map" in 4 +--- isolated cleaned Core +trace "empty_map" in 4 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 1))]))])) + (con data (Map []))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "empty_map")] (delay (con integer 4))])) +--- result +(con integer 4) +--- logs +["empty_map"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_integer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_integer.snap new file mode 100644 index 00000000..9e495cee --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_integer.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (I 42)) of + DataI unused#1 -> trace "integer" in 0 + DataB unused#2 -> trace "integer" in 1 + DataList unused#3 -> trace "integer" in 2 + DataMap unused#4 -> trace "integer" in 4 + DataConstr unused#5 -> trace "integer" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 1))]))])) + (con data (I 42))]) +--- optimized Core +trace "integer" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "integer")] (delay (con integer 0))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (I 42)) of + DataI unused#1 -> trace "integer" in 0 + DataB unused#2 -> trace "integer" in 1 + DataList unused#3 -> trace "integer" in 2 + DataMap unused#4 -> trace "integer" in 4 + DataConstr unused#5 -> trace "integer" in 6 + _ -> error +--- isolated folded Core +let unused#1 : int = 42 in +trace "integer" in 0 +--- isolated cleaned Core +trace "integer" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 1))]))])) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "integer")] (delay (con integer 0))])) +--- result +(con integer 0) +--- logs +["integer"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_list.snap new file mode 100644 index 00000000..67b28510 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_list.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [I 42])) of + DataI unused#16 -> trace "list" in 0 + DataB unused#17 -> trace "list" in 1 + DataList unused#18 -> trace "list" in 2 + DataMap unused#19 -> trace "list" in 4 + DataConstr unused#20 -> trace "list" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 6))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 4))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 2))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 0))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 1))]))])) + (con data (List [I 42]))]) +--- optimized Core +trace "list" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "list")] (delay (con integer 2))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [I 42])) of + DataI unused#16 -> trace "list" in 0 + DataB unused#17 -> trace "list" in 1 + DataList unused#18 -> trace "list" in 2 + DataMap unused#19 -> trace "list" in 4 + DataConstr unused#20 -> trace "list" in 6 + _ -> error +--- isolated folded Core +let unused#18 : list Data = (con (list data) [(I 42)]) in +trace "list" in 2 +--- isolated cleaned Core +trace "list" in 2 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 6))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 4))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 2))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 0))]))] + (delay + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 1))]))])) + (con data (List [I 42]))]) +--- isolated UPLC after +(program 1.1.0 + (force [[(force (builtin trace)) (con string "list")] (delay (con integer 2))])) +--- result +(con integer 2) +--- logs +["list"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_map.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_map.snap new file mode 100644 index 00000000..75b05bb7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_map.snap @@ -0,0 +1,71 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of + DataI unused#26 -> trace "map" in 0 + DataB unused#27 -> trace "map" in 1 + DataList unused#28 -> trace "map" in 2 + DataMap unused#29 -> trace "map" in 4 + DataConstr unused#30 -> trace "map" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_31 + (force + [[[[[[(force (builtin chooseData)) generated_31] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 6))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 4))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 2))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 0))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 1))]))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- optimized Core +trace "map" in 4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 (force [[builtin_1 (con string "map")] (delay (con integer 4))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of + DataI unused#26 -> trace "map" in 0 + DataB unused#27 -> trace "map" in 1 + DataList unused#28 -> trace "map" in 2 + DataMap unused#29 -> trace "map" in 4 + DataConstr unused#30 -> trace "map" in 6 + _ -> error +--- isolated folded Core +let unused#29 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) in +trace "map" in 4 +--- isolated cleaned Core +trace "map" in 4 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_31 + (force + [[[[[[(force (builtin chooseData)) generated_31] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 6))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 4))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 2))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 0))]))] + (delay + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 1))]))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- isolated UPLC after +(program 1.1.0 + (force [[(force (builtin trace)) (con string "map")] (delay (con integer 4))])) +--- result +(con integer 4) +--- logs +["map"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_nullary_constr.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_nullary_constr.snap new file mode 100644 index 00000000..4dd84780 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__complete_nullary_constr.snap @@ -0,0 +1,94 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 59 [])) of + DataI unused#31 -> trace "nullary_constr" in 0 + DataB unused#32 -> trace "nullary_constr" in 1 + DataList unused#33 -> trace "nullary_constr" in 2 + DataMap unused#34 -> trace "nullary_constr" in 4 + DataConstr unused#35 -> trace "nullary_constr" in 6 + _ -> error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_36 + (force + [[[[[[(force (builtin chooseData)) generated_36] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 1))]))])) + (con data (Constr 59 []))]) +--- optimized Core +trace "nullary_constr" in 6 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "nullary_constr")] (delay (con integer 6))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 59 [])) of + DataI unused#31 -> trace "nullary_constr" in 0 + DataB unused#32 -> trace "nullary_constr" in 1 + DataList unused#33 -> trace "nullary_constr" in 2 + DataMap unused#34 -> trace "nullary_constr" in 4 + DataConstr unused#35 -> trace "nullary_constr" in 6 + _ -> error +--- isolated folded Core +let unused#35 : pair int (list Data) = (con (pair integer (list data)) (59, [])) in +trace "nullary_constr" in 6 +--- isolated cleaned Core +trace "nullary_constr" in 6 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_36 + (force + [[[[[[(force (builtin chooseData)) generated_36] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 6))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 4))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 2))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 1))]))])) + (con data (Constr 59 []))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "nullary_constr")] + (delay (con integer 6))])) +--- result +(con integer 6) +--- logs +["nullary_constr"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr.snap new file mode 100644 index 00000000..7f2cce9c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 122 [I 42])) of + DataConstr payload#8 -> payload#8 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay [(lam payload_8 payload_8) [(builtin unConstrData) generated_9]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Constr 122 [I 42]))]) +--- optimized Core +(con (pair integer (list data)) (122, [(I 42)])) +--- optimized UPLC +(program 1.1.0 (con (pair integer (list data)) (122, [(I 42)]))) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 122 [I 42])) of + DataConstr payload#8 -> payload#8 + _ -> trace "cold" in error +--- isolated folded Core +let payload#8 : pair int (list Data) = (con (pair integer (list data)) (122, [(I 42)])) in +payload#8 +--- isolated cleaned Core +(con (pair integer (list data)) (122, [(I 42)])) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay [(lam payload_8 payload_8) [(builtin unConstrData) generated_9]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Constr 122 [I 42]))]) +--- isolated UPLC after +(program 1.1.0 (con (pair integer (list data)) (122, [(I 42)]))) +--- result +(con (pair integer (list data)) (122, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr_default.snap new file mode 100644 index 00000000..d7220288 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 122 [I 42])) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Constr 122 [I 42]))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 122 [I 42])) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Constr 122 [I 42]))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr_missing.snap new file mode 100644 index 00000000..0b3715b5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__constr_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 122 [I 42])) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Constr 122 [I 42]))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 122 [I 42])) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Constr 122 [I 42]))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__duplicate_shape.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__duplicate_shape.snap new file mode 100644 index 00000000..1c70fd0f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__duplicate_shape.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@Data (con data (I 42)) of + DataI p#1 -> 42 + DataI p#1 -> 42 +--- after +case@Data (con data (I 42)) of + DataI p#1 -> 42 + DataI p#1 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list.snap new file mode 100644 index 00000000..5843c08a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [])) of + DataList payload#3 -> payload#3 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_3 payload_3) [(builtin unListData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (List []))]) +--- optimized Core +(con (list data) []) +--- optimized UPLC +(program 1.1.0 (con (list data) [])) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [])) of + DataList payload#3 -> payload#3 + _ -> trace "cold" in error +--- isolated folded Core +let payload#3 : list Data = (con (list data) []) in +payload#3 +--- isolated cleaned Core +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_3 payload_3) [(builtin unListData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (List []))]) +--- isolated UPLC after +(program 1.1.0 (con (list data) [])) +--- result +(con (list data) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list_default.snap new file mode 100644 index 00000000..eb9816b0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [])) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (List []))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [])) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (List []))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list_missing.snap new file mode 100644 index 00000000..a89b2292 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_list_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [])) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (List []))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [])) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (List []))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map.snap new file mode 100644 index 00000000..a9ca03aa --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [])) of + DataMap payload#5 -> payload#5 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_5 payload_5) [(builtin unMapData) generated_6]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Map []))]) +--- optimized Core +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 (con (list (pair data data)) [])) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [])) of + DataMap payload#5 -> payload#5 + _ -> trace "cold" in error +--- isolated folded Core +let payload#5 : list (pair Data Data) = (con (list (pair data data)) []) in +payload#5 +--- isolated cleaned Core +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_5 payload_5) [(builtin unMapData) generated_6]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Map []))]) +--- isolated UPLC after +(program 1.1.0 (con (list (pair data data)) [])) +--- result +(con (list (pair data data)) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map_default.snap new file mode 100644 index 00000000..65880348 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [])) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Map []))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [])) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Map []))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map_missing.snap new file mode 100644 index 00000000..1b0478e0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__empty_map_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [])) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Map []))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [])) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Map []))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__extra_payload_binder.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__extra_payload_binder.snap new file mode 100644 index 00000000..37047125 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__extra_payload_binder.snap @@ -0,0 +1,13 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@Data (con data (I 42)) of + DataI p#1 p#1 -> 42 +--- after +case@Data (con data (I 42)) of + DataI p#1 p#1 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__idata_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__idata_subject.snap new file mode 100644 index 00000000..0e2a957c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__idata_subject.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData 42 of + DataI number#1 -> number#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + [(builtin iData) (con integer 42)]]) +--- optimized Core +let anf#3 : Data = iData 42 in +42 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 42)) [(builtin iData) (con integer 42)]]) +--- isolated pass +--- isolated ANF input +let anf#3 : Data = iData 42 in +case@Data anf#3 of + DataI number#1 -> number#1 +--- isolated folded Core +let anf#3 : Data = iData 42 in +case@Data anf#3 of + DataI number#1 -> number#1 +--- isolated cleaned Core +let anf#3 : Data = iData 42 in +case@Data anf#3 of + DataI number#1 -> number#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_4]])] + (delay (error))])) + anf_3]) + [(builtin iData) (con integer 42)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_4]])] + (delay (error))])) + anf_3]) + [(builtin iData) (con integer 42)]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer.snap new file mode 100644 index 00000000..40635b57 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (I 42)) of + DataI payload#1 -> payload#1 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (I 42))]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +case@Data (con data (I 42)) of + DataI payload#1 -> payload#1 + _ -> trace "cold" in error +--- isolated folded Core +let payload#1 : int = 42 in +payload#1 +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer_default.snap new file mode 100644 index 00000000..ef8502ae --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (I 42)) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (I 42))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (I 42)) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer_missing.snap new file mode 100644 index 00000000..a5ce286a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__integer_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (I 42)) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (I 42))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (I 42)) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__invalid_idata.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__invalid_idata.snap new file mode 100644 index 00000000..874ebcaa --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__invalid_idata.snap @@ -0,0 +1,64 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData true of + DataI number#1 -> number#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + [(builtin iData) (con bool True)]]) +--- optimized Core +let data_operand#4 : bool = true in +let anf#3 : Data = iData data_operand#4 in +data_operand#4 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_2 data_operand_1) [(builtin iData) data_operand_1]]) + (con bool True)]) +--- isolated pass +--- isolated ANF input +let anf#4 : Data = iData true in +case@Data anf#4 of + DataI number#1 -> number#1 +--- isolated folded Core +let anf#4 : Data = iData true in +case@Data anf#4 of + DataI number#1 -> number#1 +--- isolated cleaned Core +let anf#4 : Data = iData true in +case@Data anf#4 of + DataI number#1 -> number#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_5]])] + (delay (error))])) + anf_4]) + [(builtin iData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_5]])] + (delay (error))])) + anf_4]) + [(builtin iData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__large_signed_integer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__large_signed_integer.snap new file mode 100644 index 00000000..e4bd2f0b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__large_signed_integer.snap @@ -0,0 +1,44 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (I -340282366920938463463374607431768211457)) of + DataI integer#1 -> integer#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam integer_1 integer_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (con data (I -340282366920938463463374607431768211457))]) +--- optimized Core +-340282366920938463463374607431768211457 +--- optimized UPLC +(program 1.1.0 (con integer -340282366920938463463374607431768211457)) +--- isolated pass +--- isolated ANF input +case@Data (con data (I -340282366920938463463374607431768211457)) of + DataI integer#1 -> integer#1 +--- isolated folded Core +let integer#1 : int = -340282366920938463463374607431768211457 in +integer#1 +--- isolated cleaned Core +-340282366920938463463374607431768211457 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam integer_1 integer_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (con data (I -340282366920938463463374607431768211457))]) +--- isolated UPLC after +(program 1.1.0 (con integer -340282366920938463463374607431768211457)) +--- result +(con integer -340282366920938463463374607431768211457) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list.snap new file mode 100644 index 00000000..cf7435b2 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [I 42])) of + DataList payload#4 -> payload#4 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_4 payload_4) [(builtin unListData) generated_5]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (List [I 42]))]) +--- optimized Core +(con (list data) [(I 42)]) +--- optimized UPLC +(program 1.1.0 (con (list data) [(I 42)])) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [I 42])) of + DataList payload#4 -> payload#4 + _ -> trace "cold" in error +--- isolated folded Core +let payload#4 : list Data = (con (list data) [(I 42)]) in +payload#4 +--- isolated cleaned Core +(con (list data) [(I 42)]) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_4 payload_4) [(builtin unListData) generated_5]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (List [I 42]))]) +--- isolated UPLC after +(program 1.1.0 (con (list data) [(I 42)])) +--- result +(con (list data) [(I 42)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list_default.snap new file mode 100644 index 00000000..0defbccc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [I 42])) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (List [I 42]))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [I 42])) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (List [I 42]))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list_missing.snap new file mode 100644 index 00000000..162b90ba --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__list_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [I 42])) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (List [I 42]))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [I 42])) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (List [I 42]))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map.snap new file mode 100644 index 00000000..73f325ae --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map.snap @@ -0,0 +1,52 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of + DataMap payload#6 -> payload#6 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_6 payload_6) [(builtin unMapData) generated_7]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- optimized Core +(con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) +--- optimized UPLC +(program 1.1.0 + (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))])) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of + DataMap payload#6 -> payload#6 + _ -> trace "cold" in error +--- isolated folded Core +let payload#6 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) in +payload#6 +--- isolated cleaned Core +(con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_6 payload_6) [(builtin unMapData) generated_7]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- isolated UPLC after +(program 1.1.0 + (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))])) +--- result +(con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map_default.snap new file mode 100644 index 00000000..871345cc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map_missing.snap new file mode 100644 index 00000000..b2072164 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__map_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (Map [(I 42, I 42), (I 42, I 9)])) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__max_constructor_tag.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__max_constructor_tag.snap new file mode 100644 index 00000000..e831eacc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__max_constructor_tag.snap @@ -0,0 +1,48 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 18446744073709551615 [])) of + DataConstr constr#2 -> constr#2 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] + (delay [(lam constr_2 constr_2) [(builtin unConstrData) generated_3]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Constr 18446744073709551615 []))]) +--- optimized Core +(con (pair integer (list data)) (18446744073709551615, [])) +--- optimized UPLC +(program 1.1.0 (con (pair integer (list data)) (18446744073709551615, []))) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 18446744073709551615 [])) of + DataConstr constr#2 -> constr#2 +--- isolated folded Core +let constr#2 : pair int (list Data) = (con (pair integer (list data)) (18446744073709551615, [])) in +constr#2 +--- isolated cleaned Core +(con (pair integer (list data)) (18446744073709551615, [])) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] + (delay [(lam constr_2 constr_2) [(builtin unConstrData) generated_3]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Constr 18446744073709551615 []))]) +--- isolated UPLC after +(program 1.1.0 (con (pair integer (list data)) (18446744073709551615, []))) +--- result +(con (pair integer (list data)) (18446744073709551615, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nested_data_list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nested_data_list.snap new file mode 100644 index 00000000..c9196040 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nested_data_list.snap @@ -0,0 +1,78 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (List [I 42])) of + DataList xs#1 -> case@List xs#1 of + Cons head#2 tail#3 -> case@Data head#2 of + DataI number#4 -> number#4 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay + [(lam xs_1 + (case + xs_1 + (lam head_2 + (lam tail_3 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_4 number_4) [(builtin unIData) generated_6]])] + (delay (error))])) + head_2])) + (error))) + [(builtin unListData) generated_5]])] + (delay (error))] + (delay (error))])) + (con data (List [I 42]))]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +case@Data (con data (List [I 42])) of + DataList xs#1 -> case@List xs#1 of + Cons head#2 tail#3 -> case@Data head#2 of + DataI number#4 -> number#4 +--- isolated folded Core +let xs#1 : list Data = (con (list data) [(I 42)]) in +case@List xs#1 of + Cons head#2 tail#3 -> case@Data head#2 of + DataI number#4 -> number#4 +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay + [(lam xs_1 + (case + xs_1 + (lam head_2 + (lam tail_3 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_4 number_4) [(builtin unIData) generated_6]])] + (delay (error))])) + head_2])) + (error))) + [(builtin unListData) generated_5]])] + (delay (error))] + (delay (error))])) + (con data (List [I 42]))]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__no_payload_binder.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__no_payload_binder.snap new file mode 100644 index 00000000..b6e44f85 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__no_payload_binder.snap @@ -0,0 +1,13 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@Data (con data (I 42)) of + DataI -> 42 +--- after +case@Data (con data (I 42)) of + DataI -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr.snap new file mode 100644 index 00000000..99129bb9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 59 [])) of + DataConstr payload#7 -> payload#7 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay [(lam payload_7 payload_7) [(builtin unConstrData) generated_8]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Constr 59 []))]) +--- optimized Core +(con (pair integer (list data)) (59, [])) +--- optimized UPLC +(program 1.1.0 (con (pair integer (list data)) (59, []))) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 59 [])) of + DataConstr payload#7 -> payload#7 + _ -> trace "cold" in error +--- isolated folded Core +let payload#7 : pair int (list Data) = (con (pair integer (list data)) (59, [])) in +payload#7 +--- isolated cleaned Core +(con (pair integer (list data)) (59, [])) +--- isolated UPLC before +(program 1.1.0 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay [(lam payload_7 payload_7) [(builtin unConstrData) generated_8]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + (con data (Constr 59 []))]) +--- isolated UPLC after +(program 1.1.0 (con (pair integer (list data)) (59, []))) +--- result +(con (pair integer (list data)) (59, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr_default.snap new file mode 100644 index 00000000..f7164d2f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr_default.snap @@ -0,0 +1,72 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 59 [])) of + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Constr 59 []))]) +--- optimized Core +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 9))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 59 [])) of + _ -> trace "fallback" in 9 +--- isolated folded Core +trace "fallback" in 9 +--- isolated cleaned Core +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + (con data (Constr 59 []))]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) +--- result +(con integer 9) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr_missing.snap new file mode 100644 index 00000000..444f60ed --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__nullary_constr_missing.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (Constr 59 [])) of +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Constr 59 []))]) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@Data (con data (Constr 59 [])) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (con data (Constr 59 []))]) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__result_type_view.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__result_type_view.snap new file mode 100644 index 00000000..bb9ddc16 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__result_type_view.snap @@ -0,0 +1,44 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (con data (I 42)) of + DataI payload#2 -> 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay (con integer 9))] + (delay (error))])) + (con data (I 42))]) +--- optimized Core +9 +--- optimized UPLC +(program 1.1.0 (con integer 9)) +--- isolated pass +--- isolated ANF input +case@Data (con data (I 42)) of + DataI payload#2 -> 9 +--- isolated folded Core +let payload#2 : int = 42 in +9 +--- isolated cleaned Core +9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay (con integer 9))] + (delay (error))])) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (con integer 9)) +--- result +(con integer 9) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__returned_delay.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__returned_delay.snap new file mode 100644 index 00000000..b72374c9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__returned_delay.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +force (case@Data (con data (I 42)) of + DataI payload#1 -> delay (trace "forced" in payload#1)) +--- unoptimized UPLC +(program 1.1.0 + (force + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam payload_1 + (delay + (force [[(force (builtin trace)) (con string "forced")] (delay payload_1)]))) + [(builtin unIData) generated_2]])] + (delay (error))])) + (con data (I 42))])) +--- optimized Core +trace "forced" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "forced")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : @delay int = case@Data (con data (I 42)) of + DataI payload#1 -> delay (trace "forced" in payload#1) in +force anf#4 +--- isolated folded Core +let anf#4 : @delay int = let payload#1 : int = 42 in +delay (trace "forced" in payload#1) in +force anf#4 +--- isolated cleaned Core +trace "forced" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 (force anf_4)) + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam payload_1 + (delay + (force [[(force (builtin trace)) (con string "forced")] (delay payload_1)]))) + [(builtin unIData) generated_5]])] + (delay (error))])) + (con data (I 42))]]) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "forced")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["forced"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__returned_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__returned_function.snap new file mode 100644 index 00000000..56c42cc1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__returned_function.snap @@ -0,0 +1,52 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(case@Data (con data (I 40)) of + DataI payload#1 -> \x#2 : int -> addInteger payload#1 x#2) 2 +--- unoptimized UPLC +(program 1.1.0 + [[(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam payload_1 (lam x_2 [[(builtin addInteger) payload_1] x_2])) + [(builtin unIData) generated_3]])] + (delay (error))])) + (con data (I 40))] + (con integer 2)]) +--- optimized Core +addInteger 40 2 +--- optimized UPLC +(program 1.1.0 [[(builtin addInteger) (con integer 40)] (con integer 2)]) +--- isolated pass +--- isolated ANF input +let anf#3 : int -> int = case@Data (con data (I 40)) of + DataI payload#1 -> \x#2 : int -> addInteger payload#1 x#2 in +anf#3 2 +--- isolated folded Core +let anf#3 : int -> int = let payload#1 : int = 40 in +\x#2 : int -> addInteger payload#1 x#2 in +anf#3 2 +--- isolated cleaned Core +addInteger 40 2 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 [anf_3 (con integer 2)]) + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam payload_1 (lam x_2 [[(builtin addInteger) payload_1] x_2])) + [(builtin unIData) generated_4]])] + (delay (error))])) + (con data (I 40))]]) +--- isolated UPLC after +(program 1.1.0 [[(builtin addInteger) (con integer 40)] (con integer 2)]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_bytes.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_bytes.snap new file mode 100644 index 00000000..b0fd9b38 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_bytes.snap @@ -0,0 +1,95 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#8 : Data = (con data (B #6e617368)) in +let alias#9 : Data = data#8 in +constr 0 data#8 (case@Data alias#9 of + DataB payload#10 -> payload#10) (case@Data alias#9 of + DataB payload#11 -> payload#11) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_8 + [(lam alias_9 + (constr 0 + data_8 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unBData) generated_12]])])) + alias_9] + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_11 payload_11) [(builtin unBData) generated_13]])])) + alias_9])) + data_8]) + (con data (B #6e617368))]) +--- optimized Core +constr 0 (con data (B #6e617368)) (con bytestring #6e617368) (con bytestring #6e617368) +--- optimized UPLC +(program 1.1.0 + (constr 0 + (con data (B #6e617368)) + (con bytestring #6e617368) + (con bytestring #6e617368))) +--- isolated pass +--- isolated ANF input +let data#8 : Data = (con data (B #6e617368)) in +let alias#9 : Data = data#8 in +let anf#12 : bytes = case@Data alias#9 of + DataB payload#10 -> payload#10 in +let anf#13 : bytes = case@Data alias#9 of + DataB payload#11 -> payload#11 in +constr 0 data#8 anf#12 anf#13 +--- isolated folded Core +let data_payload#14 : bytes = (con bytestring #6e617368) in +let data#8 : Data = (con data (B #6e617368)) in +let alias#9 : Data = data#8 in +let anf#12 : bytes = let payload#10 : bytes = data_payload#14 in +payload#10 in +let anf#13 : bytes = let payload#11 : bytes = data_payload#14 in +payload#11 in +constr 0 data#8 anf#12 anf#13 +--- isolated cleaned Core +constr 0 (con data (B #6e617368)) (con bytestring #6e617368) (con bytestring #6e617368) +--- isolated UPLC before +(program 1.1.0 + [(lam data_8 + [(lam alias_9 + [(lam anf_12 + [(lam anf_13 (constr 0 data_8 anf_12 anf_13)) + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_11 payload_11) [(builtin unBData) generated_14]])])) + alias_9]]) + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unBData) generated_15]])])) + alias_9]]) + data_8]) + (con data (B #6e617368))]) +--- isolated UPLC after +(program 1.1.0 + (constr 0 + (con data (B #6e617368)) + (con bytestring #6e617368) + (con bytestring #6e617368))) +--- result +(constr 0 + (con data (B #6e617368)) + (con bytestring #6e617368) + (con bytestring #6e617368)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_constr.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_constr.snap new file mode 100644 index 00000000..016f1f58 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_constr.snap @@ -0,0 +1,103 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#50 : Data = (con data (Constr 122 [I 42])) in +let alias#51 : Data = data#50 in +constr 0 data#50 (case@Data alias#51 of + DataConstr payload#52 -> payload#52) (case@Data alias#51 of + DataConstr payload#53 -> payload#53) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_50 + [(lam alias_51 + (constr 0 + data_50 + [(lam generated_54 + (force + [[[[[[(force (builtin chooseData)) generated_54] + (delay [(lam payload_52 payload_52) [(builtin unConstrData) generated_54]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_51] + [(lam generated_55 + (force + [[[[[[(force (builtin chooseData)) generated_55] + (delay [(lam payload_53 payload_53) [(builtin unConstrData) generated_55]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_51])) + data_50]) + (con data (Constr 122 [I 42]))]) +--- optimized Core +let data_payload#7 : pair int (list Data) = (con (pair integer (list data)) (122, [(I 42)])) in +constr 0 (con data (Constr 122 [I 42])) data_payload#7 data_payload#7 +--- optimized UPLC +(program 1.1.0 + [(lam data_payload_1 + (constr 0 (con data (Constr 122 [I 42])) data_payload_1 data_payload_1)) + (con (pair integer (list data)) (122, [(I 42)]))]) +--- isolated pass +--- isolated ANF input +let data#50 : Data = (con data (Constr 122 [I 42])) in +let alias#51 : Data = data#50 in +let anf#54 : pair int (list Data) = case@Data alias#51 of + DataConstr payload#52 -> payload#52 in +let anf#55 : pair int (list Data) = case@Data alias#51 of + DataConstr payload#53 -> payload#53 in +constr 0 data#50 anf#54 anf#55 +--- isolated folded Core +let data_payload#56 : pair int (list Data) = (con (pair integer (list data)) (122, [(I 42)])) in +let data#50 : Data = (con data (Constr 122 [I 42])) in +let alias#51 : Data = data#50 in +let anf#54 : pair int (list Data) = let payload#52 : pair int (list Data) = data_payload#56 in +payload#52 in +let anf#55 : pair int (list Data) = let payload#53 : pair int (list Data) = data_payload#56 in +payload#53 in +constr 0 data#50 anf#54 anf#55 +--- isolated cleaned Core +let data_payload#56 : pair int (list Data) = (con (pair integer (list data)) (122, [(I 42)])) in +constr 0 (con data (Constr 122 [I 42])) data_payload#56 data_payload#56 +--- isolated UPLC before +(program 1.1.0 + [(lam data_50 + [(lam alias_51 + [(lam anf_54 + [(lam anf_55 (constr 0 data_50 anf_54 anf_55)) + [(lam generated_56 + (force + [[[[[[(force (builtin chooseData)) generated_56] + (delay [(lam payload_53 payload_53) [(builtin unConstrData) generated_56]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_51]]) + [(lam generated_57 + (force + [[[[[[(force (builtin chooseData)) generated_57] + (delay [(lam payload_52 payload_52) [(builtin unConstrData) generated_57]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_51]]) + data_50]) + (con data (Constr 122 [I 42]))]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_payload_56 + (constr 0 (con data (Constr 122 [I 42])) data_payload_56 data_payload_56)) + (con (pair integer (list data)) (122, [(I 42)]))]) +--- result +(constr 0 + (con data (Constr 122 [I 42])) + (con (pair integer (list data)) (122, [(I 42)])) + (con (pair integer (list data)) (122, [(I 42)]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_empty_list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_empty_list.snap new file mode 100644 index 00000000..8aa62c80 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_empty_list.snap @@ -0,0 +1,92 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#15 : Data = (con data (List [])) in +let alias#16 : Data = data#15 in +constr 0 data#15 (case@Data alias#16 of + DataList payload#17 -> payload#17) (case@Data alias#16 of + DataList payload#18 -> payload#18) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_15 + [(lam alias_16 + (constr 0 + data_15 + [(lam generated_19 + (force + [[[[[[(force (builtin chooseData)) generated_19] (delay (error))] (delay (error))] + (delay [(lam payload_17 payload_17) [(builtin unListData) generated_19]])] + (delay (error))] + (delay (error))])) + alias_16] + [(lam generated_20 + (force + [[[[[[(force (builtin chooseData)) generated_20] (delay (error))] (delay (error))] + (delay [(lam payload_18 payload_18) [(builtin unListData) generated_20]])] + (delay (error))] + (delay (error))])) + alias_16])) + data_15]) + (con data (List []))]) +--- optimized Core +let data_payload#7 : list Data = (con (list data) []) in +constr 0 (con data (List [])) data_payload#7 data_payload#7 +--- optimized UPLC +(program 1.1.0 + [(lam data_payload_1 + (constr 0 (con data (List [])) data_payload_1 data_payload_1)) + (con (list data) [])]) +--- isolated pass +--- isolated ANF input +let data#15 : Data = (con data (List [])) in +let alias#16 : Data = data#15 in +let anf#19 : list Data = case@Data alias#16 of + DataList payload#17 -> payload#17 in +let anf#20 : list Data = case@Data alias#16 of + DataList payload#18 -> payload#18 in +constr 0 data#15 anf#19 anf#20 +--- isolated folded Core +let data_payload#21 : list Data = (con (list data) []) in +let data#15 : Data = (con data (List [])) in +let alias#16 : Data = data#15 in +let anf#19 : list Data = let payload#17 : list Data = data_payload#21 in +payload#17 in +let anf#20 : list Data = let payload#18 : list Data = data_payload#21 in +payload#18 in +constr 0 data#15 anf#19 anf#20 +--- isolated cleaned Core +let data_payload#21 : list Data = (con (list data) []) in +constr 0 (con data (List [])) data_payload#21 data_payload#21 +--- isolated UPLC before +(program 1.1.0 + [(lam data_15 + [(lam alias_16 + [(lam anf_19 + [(lam anf_20 (constr 0 data_15 anf_19 anf_20)) + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] (delay (error))] (delay (error))] + (delay [(lam payload_18 payload_18) [(builtin unListData) generated_21]])] + (delay (error))] + (delay (error))])) + alias_16]]) + [(lam generated_22 + (force + [[[[[[(force (builtin chooseData)) generated_22] (delay (error))] (delay (error))] + (delay [(lam payload_17 payload_17) [(builtin unListData) generated_22]])] + (delay (error))] + (delay (error))])) + alias_16]]) + data_15]) + (con data (List []))]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_payload_21 + (constr 0 (con data (List [])) data_payload_21 data_payload_21)) + (con (list data) [])]) +--- result +(constr 0 (con data (List [])) (con (list data) []) (con (list data) [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_empty_map.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_empty_map.snap new file mode 100644 index 00000000..c4a4fe1a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_empty_map.snap @@ -0,0 +1,99 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#29 : Data = (con data (Map [])) in +let alias#30 : Data = data#29 in +constr 0 data#29 (case@Data alias#30 of + DataMap payload#31 -> payload#31) (case@Data alias#30 of + DataMap payload#32 -> payload#32) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_29 + [(lam alias_30 + (constr 0 + data_29 + [(lam generated_33 + (force + [[[[[[(force (builtin chooseData)) generated_33] (delay (error))] + (delay [(lam payload_31 payload_31) [(builtin unMapData) generated_33]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_30] + [(lam generated_34 + (force + [[[[[[(force (builtin chooseData)) generated_34] (delay (error))] + (delay [(lam payload_32 payload_32) [(builtin unMapData) generated_34]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_30])) + data_29]) + (con data (Map []))]) +--- optimized Core +let data_payload#7 : list (pair Data Data) = (con (list (pair data data)) []) in +constr 0 (con data (Map [])) data_payload#7 data_payload#7 +--- optimized UPLC +(program 1.1.0 + [(lam data_payload_1 + (constr 0 (con data (Map [])) data_payload_1 data_payload_1)) + (con (list (pair data data)) [])]) +--- isolated pass +--- isolated ANF input +let data#29 : Data = (con data (Map [])) in +let alias#30 : Data = data#29 in +let anf#33 : list (pair Data Data) = case@Data alias#30 of + DataMap payload#31 -> payload#31 in +let anf#34 : list (pair Data Data) = case@Data alias#30 of + DataMap payload#32 -> payload#32 in +constr 0 data#29 anf#33 anf#34 +--- isolated folded Core +let data_payload#35 : list (pair Data Data) = (con (list (pair data data)) []) in +let data#29 : Data = (con data (Map [])) in +let alias#30 : Data = data#29 in +let anf#33 : list (pair Data Data) = let payload#31 : list (pair Data Data) = data_payload#35 in +payload#31 in +let anf#34 : list (pair Data Data) = let payload#32 : list (pair Data Data) = data_payload#35 in +payload#32 in +constr 0 data#29 anf#33 anf#34 +--- isolated cleaned Core +let data_payload#35 : list (pair Data Data) = (con (list (pair data data)) []) in +constr 0 (con data (Map [])) data_payload#35 data_payload#35 +--- isolated UPLC before +(program 1.1.0 + [(lam data_29 + [(lam alias_30 + [(lam anf_33 + [(lam anf_34 (constr 0 data_29 anf_33 anf_34)) + [(lam generated_35 + (force + [[[[[[(force (builtin chooseData)) generated_35] (delay (error))] + (delay [(lam payload_32 payload_32) [(builtin unMapData) generated_35]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_30]]) + [(lam generated_36 + (force + [[[[[[(force (builtin chooseData)) generated_36] (delay (error))] + (delay [(lam payload_31 payload_31) [(builtin unMapData) generated_36]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_30]]) + data_29]) + (con data (Map []))]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_payload_35 + (constr 0 (con data (Map [])) data_payload_35 data_payload_35)) + (con (list (pair data data)) [])]) +--- result +(constr 0 + (con data (Map [])) + (con (list (pair data data)) []) + (con (list (pair data data)) [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_integer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_integer.snap new file mode 100644 index 00000000..45bd5b50 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_integer.snap @@ -0,0 +1,84 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = (con data (I 42)) in +let alias#2 : Data = data#1 in +constr 0 data#1 (case@Data alias#2 of + DataI payload#3 -> payload#3) (case@Data alias#2 of + DataI payload#4 -> payload#4) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + [(lam alias_2 + (constr 0 + data_1 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_3 payload_3) [(builtin unIData) generated_5]])] + (delay (error))])) + alias_2] + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unIData) generated_6]])] + (delay (error))])) + alias_2])) + data_1]) + (con data (I 42))]) +--- optimized Core +constr 0 (con data (I 42)) 42 42 +--- optimized UPLC +(program 1.1.0 (constr 0 (con data (I 42)) (con integer 42) (con integer 42))) +--- isolated pass +--- isolated ANF input +let data#1 : Data = (con data (I 42)) in +let alias#2 : Data = data#1 in +let anf#5 : int = case@Data alias#2 of + DataI payload#3 -> payload#3 in +let anf#6 : int = case@Data alias#2 of + DataI payload#4 -> payload#4 in +constr 0 data#1 anf#5 anf#6 +--- isolated folded Core +let data_payload#7 : int = 42 in +let data#1 : Data = (con data (I 42)) in +let alias#2 : Data = data#1 in +let anf#5 : int = let payload#3 : int = data_payload#7 in +payload#3 in +let anf#6 : int = let payload#4 : int = data_payload#7 in +payload#4 in +constr 0 data#1 anf#5 anf#6 +--- isolated cleaned Core +constr 0 (con data (I 42)) 42 42 +--- isolated UPLC before +(program 1.1.0 + [(lam data_1 + [(lam alias_2 + [(lam anf_5 + [(lam anf_6 (constr 0 data_1 anf_5 anf_6)) + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unIData) generated_7]])] + (delay (error))])) + alias_2]]) + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_3 payload_3) [(builtin unIData) generated_8]])] + (delay (error))])) + alias_2]]) + data_1]) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (constr 0 (con data (I 42)) (con integer 42) (con integer 42))) +--- result +(constr 0 (con data (I 42)) (con integer 42) (con integer 42)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_list.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_list.snap new file mode 100644 index 00000000..1657b78e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_list.snap @@ -0,0 +1,95 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#22 : Data = (con data (List [I 42])) in +let alias#23 : Data = data#22 in +constr 0 data#22 (case@Data alias#23 of + DataList payload#24 -> payload#24) (case@Data alias#23 of + DataList payload#25 -> payload#25) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_22 + [(lam alias_23 + (constr 0 + data_22 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] (delay (error))] (delay (error))] + (delay [(lam payload_24 payload_24) [(builtin unListData) generated_26]])] + (delay (error))] + (delay (error))])) + alias_23] + [(lam generated_27 + (force + [[[[[[(force (builtin chooseData)) generated_27] (delay (error))] (delay (error))] + (delay [(lam payload_25 payload_25) [(builtin unListData) generated_27]])] + (delay (error))] + (delay (error))])) + alias_23])) + data_22]) + (con data (List [I 42]))]) +--- optimized Core +let data_payload#7 : list Data = (con (list data) [(I 42)]) in +constr 0 (con data (List [I 42])) data_payload#7 data_payload#7 +--- optimized UPLC +(program 1.1.0 + [(lam data_payload_1 + (constr 0 (con data (List [I 42])) data_payload_1 data_payload_1)) + (con (list data) [(I 42)])]) +--- isolated pass +--- isolated ANF input +let data#22 : Data = (con data (List [I 42])) in +let alias#23 : Data = data#22 in +let anf#26 : list Data = case@Data alias#23 of + DataList payload#24 -> payload#24 in +let anf#27 : list Data = case@Data alias#23 of + DataList payload#25 -> payload#25 in +constr 0 data#22 anf#26 anf#27 +--- isolated folded Core +let data_payload#28 : list Data = (con (list data) [(I 42)]) in +let data#22 : Data = (con data (List [I 42])) in +let alias#23 : Data = data#22 in +let anf#26 : list Data = let payload#24 : list Data = data_payload#28 in +payload#24 in +let anf#27 : list Data = let payload#25 : list Data = data_payload#28 in +payload#25 in +constr 0 data#22 anf#26 anf#27 +--- isolated cleaned Core +let data_payload#28 : list Data = (con (list data) [(I 42)]) in +constr 0 (con data (List [I 42])) data_payload#28 data_payload#28 +--- isolated UPLC before +(program 1.1.0 + [(lam data_22 + [(lam alias_23 + [(lam anf_26 + [(lam anf_27 (constr 0 data_22 anf_26 anf_27)) + [(lam generated_28 + (force + [[[[[[(force (builtin chooseData)) generated_28] (delay (error))] (delay (error))] + (delay [(lam payload_25 payload_25) [(builtin unListData) generated_28]])] + (delay (error))] + (delay (error))])) + alias_23]]) + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] (delay (error))] (delay (error))] + (delay [(lam payload_24 payload_24) [(builtin unListData) generated_29]])] + (delay (error))] + (delay (error))])) + alias_23]]) + data_22]) + (con data (List [I 42]))]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_payload_28 + (constr 0 (con data (List [I 42])) data_payload_28 data_payload_28)) + (con (list data) [(I 42)])]) +--- result +(constr 0 + (con data (List [I 42])) + (con (list data) [(I 42)]) + (con (list data) [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_map.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_map.snap new file mode 100644 index 00000000..7f624857 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_map.snap @@ -0,0 +1,105 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#36 : Data = (con data (Map [(I 42, I 42), (I 42, I 9)])) in +let alias#37 : Data = data#36 in +constr 0 data#36 (case@Data alias#37 of + DataMap payload#38 -> payload#38) (case@Data alias#37 of + DataMap payload#39 -> payload#39) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_36 + [(lam alias_37 + (constr 0 + data_36 + [(lam generated_40 + (force + [[[[[[(force (builtin chooseData)) generated_40] (delay (error))] + (delay [(lam payload_38 payload_38) [(builtin unMapData) generated_40]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_37] + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] (delay (error))] + (delay [(lam payload_39 payload_39) [(builtin unMapData) generated_41]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_37])) + data_36]) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- optimized Core +let data_payload#7 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) in +constr 0 (con data (Map [(I 42, I 42), (I 42, I 9)])) data_payload#7 data_payload#7 +--- optimized UPLC +(program 1.1.0 + [(lam data_payload_1 + (constr 0 + (con data (Map [(I 42, I 42), (I 42, I 9)])) + data_payload_1 + data_payload_1)) + (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))])]) +--- isolated pass +--- isolated ANF input +let data#36 : Data = (con data (Map [(I 42, I 42), (I 42, I 9)])) in +let alias#37 : Data = data#36 in +let anf#40 : list (pair Data Data) = case@Data alias#37 of + DataMap payload#38 -> payload#38 in +let anf#41 : list (pair Data Data) = case@Data alias#37 of + DataMap payload#39 -> payload#39 in +constr 0 data#36 anf#40 anf#41 +--- isolated folded Core +let data_payload#42 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) in +let data#36 : Data = (con data (Map [(I 42, I 42), (I 42, I 9)])) in +let alias#37 : Data = data#36 in +let anf#40 : list (pair Data Data) = let payload#38 : list (pair Data Data) = data_payload#42 in +payload#38 in +let anf#41 : list (pair Data Data) = let payload#39 : list (pair Data Data) = data_payload#42 in +payload#39 in +constr 0 data#36 anf#40 anf#41 +--- isolated cleaned Core +let data_payload#42 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) in +constr 0 (con data (Map [(I 42, I 42), (I 42, I 9)])) data_payload#42 data_payload#42 +--- isolated UPLC before +(program 1.1.0 + [(lam data_36 + [(lam alias_37 + [(lam anf_40 + [(lam anf_41 (constr 0 data_36 anf_40 anf_41)) + [(lam generated_42 + (force + [[[[[[(force (builtin chooseData)) generated_42] (delay (error))] + (delay [(lam payload_39 payload_39) [(builtin unMapData) generated_42]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_37]]) + [(lam generated_43 + (force + [[[[[[(force (builtin chooseData)) generated_43] (delay (error))] + (delay [(lam payload_38 payload_38) [(builtin unMapData) generated_43]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_37]]) + data_36]) + (con data (Map [(I 42, I 42), (I 42, I 9)]))]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_payload_42 + (constr 0 + (con data (Map [(I 42, I 42), (I 42, I 9)])) + data_payload_42 + data_payload_42)) + (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))])]) +--- result +(constr 0 + (con data (Map [(I 42, I 42), (I 42, I 9)])) + (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))]) + (con (list (pair data data)) [((I 42), (I 42)), ((I 42), (I 9))])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_nullary_constr.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_nullary_constr.snap new file mode 100644 index 00000000..e655f8d1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__shared_nullary_constr.snap @@ -0,0 +1,103 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#43 : Data = (con data (Constr 59 [])) in +let alias#44 : Data = data#43 in +constr 0 data#43 (case@Data alias#44 of + DataConstr payload#45 -> payload#45) (case@Data alias#44 of + DataConstr payload#46 -> payload#46) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_43 + [(lam alias_44 + (constr 0 + data_43 + [(lam generated_47 + (force + [[[[[[(force (builtin chooseData)) generated_47] + (delay [(lam payload_45 payload_45) [(builtin unConstrData) generated_47]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_44] + [(lam generated_48 + (force + [[[[[[(force (builtin chooseData)) generated_48] + (delay [(lam payload_46 payload_46) [(builtin unConstrData) generated_48]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_44])) + data_43]) + (con data (Constr 59 []))]) +--- optimized Core +let data_payload#7 : pair int (list Data) = (con (pair integer (list data)) (59, [])) in +constr 0 (con data (Constr 59 [])) data_payload#7 data_payload#7 +--- optimized UPLC +(program 1.1.0 + [(lam data_payload_1 + (constr 0 (con data (Constr 59 [])) data_payload_1 data_payload_1)) + (con (pair integer (list data)) (59, []))]) +--- isolated pass +--- isolated ANF input +let data#43 : Data = (con data (Constr 59 [])) in +let alias#44 : Data = data#43 in +let anf#47 : pair int (list Data) = case@Data alias#44 of + DataConstr payload#45 -> payload#45 in +let anf#48 : pair int (list Data) = case@Data alias#44 of + DataConstr payload#46 -> payload#46 in +constr 0 data#43 anf#47 anf#48 +--- isolated folded Core +let data_payload#49 : pair int (list Data) = (con (pair integer (list data)) (59, [])) in +let data#43 : Data = (con data (Constr 59 [])) in +let alias#44 : Data = data#43 in +let anf#47 : pair int (list Data) = let payload#45 : pair int (list Data) = data_payload#49 in +payload#45 in +let anf#48 : pair int (list Data) = let payload#46 : pair int (list Data) = data_payload#49 in +payload#46 in +constr 0 data#43 anf#47 anf#48 +--- isolated cleaned Core +let data_payload#49 : pair int (list Data) = (con (pair integer (list data)) (59, [])) in +constr 0 (con data (Constr 59 [])) data_payload#49 data_payload#49 +--- isolated UPLC before +(program 1.1.0 + [(lam data_43 + [(lam alias_44 + [(lam anf_47 + [(lam anf_48 (constr 0 data_43 anf_47 anf_48)) + [(lam generated_49 + (force + [[[[[[(force (builtin chooseData)) generated_49] + (delay [(lam payload_46 payload_46) [(builtin unConstrData) generated_49]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_44]]) + [(lam generated_50 + (force + [[[[[[(force (builtin chooseData)) generated_50] + (delay [(lam payload_45 payload_45) [(builtin unConstrData) generated_50]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_44]]) + data_43]) + (con data (Constr 59 []))]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_payload_49 + (constr 0 (con data (Constr 59 [])) data_payload_49 data_payload_49)) + (con (pair integer (list data)) (59, []))]) +--- result +(constr 0 + (con data (Constr 59 [])) + (con (pair integer (list data)) (59, [])) + (con (pair integer (list data)) (59, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__strict_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__strict_failure.snap new file mode 100644 index 00000000..0139c35e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__strict_failure.snap @@ -0,0 +1,82 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let effect#1 : int = trace "before" in error in +let data#2 : Data = (con data (I 42)) in +case@Data data#2 of + DataI payload#3 -> trace "selected" in payload#3 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam effect_1 + [(lam data_2 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay + [(lam payload_3 + (force [[(force (builtin trace)) (con string "selected")] (delay payload_3)])) + [(builtin unIData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + data_2]) + (con data (I 42))]) + (force [[(force (builtin trace)) (con string "before")] (delay (error))])]) +--- optimized Core +let effect#4 : int = trace "before" in error in +trace "selected" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam effect_1 + (force [[builtin_2 (con string "selected")] (delay (con integer 42))])) + (force [[builtin_2 (con string "before")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let effect#1 : int = trace "before" in error in +let data#2 : Data = (con data (I 42)) in +case@Data data#2 of + DataI payload#3 -> trace "selected" in payload#3 + _ -> trace "cold" in error +--- isolated folded Core +let effect#1 : int = trace "before" in error in +let data_payload#5 : int = 42 in +let data#2 : Data = (con data (I 42)) in +let payload#3 : int = data_payload#5 in +trace "selected" in payload#3 +--- isolated cleaned Core +let effect#1 : int = trace "before" in error in +trace "selected" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam effect_1 + [(lam data_2 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay + [(lam payload_3 + (force [[(force (builtin trace)) (con string "selected")] (delay payload_3)])) + [(builtin unIData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + data_2]) + (con data (I 42))]) + (force [[(force (builtin trace)) (con string "before")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam effect_1 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 42))])) + (force [[(force (builtin trace)) (con string "before")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__strict_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__strict_trace.snap new file mode 100644 index 00000000..a066939e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__strict_trace.snap @@ -0,0 +1,85 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let effect#1 : int = trace "before" in 0 in +let data#2 : Data = (con data (I 42)) in +case@Data data#2 of + DataI payload#3 -> trace "selected" in payload#3 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam effect_1 + [(lam data_2 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay + [(lam payload_3 + (force [[(force (builtin trace)) (con string "selected")] (delay payload_3)])) + [(builtin unIData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + data_2]) + (con data (I 42))]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 0))])]) +--- optimized Core +let effect#4 : int = trace "before" in 0 in +trace "selected" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam effect_1 + (force [[builtin_2 (con string "selected")] (delay (con integer 42))])) + (force [[builtin_2 (con string "before")] (delay (con integer 0))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let effect#1 : int = trace "before" in 0 in +let data#2 : Data = (con data (I 42)) in +case@Data data#2 of + DataI payload#3 -> trace "selected" in payload#3 + _ -> trace "cold" in error +--- isolated folded Core +let effect#1 : int = trace "before" in 0 in +let data_payload#4 : int = 42 in +let data#2 : Data = (con data (I 42)) in +let payload#3 : int = data_payload#4 in +trace "selected" in payload#3 +--- isolated cleaned Core +let effect#1 : int = trace "before" in 0 in +trace "selected" in 42 +--- isolated UPLC before +(program 1.1.0 + [(lam effect_1 + [(lam data_2 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay + [(lam payload_3 + (force [[(force (builtin trace)) (con string "selected")] (delay payload_3)])) + [(builtin unIData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + data_2]) + (con data (I 42))]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 0))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam effect_1 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 42))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 0))])]) +--- result +(con integer 42) +--- logs +["before", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__traced_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__traced_subject.snap new file mode 100644 index 00000000..440c039f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__traced_subject.snap @@ -0,0 +1,76 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (trace "subject" in (con data (I 42))) of + DataI number#1 -> number#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (force + [[(force (builtin trace)) (con string "subject")] (delay (con data (I 42)))])]) +--- optimized Core +let anf#3 : Data = trace "subject" in (con data (I 42)) in +case@Data anf#3 of + DataI number#2 -> number#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam builtin_7 + [(lam anf_1 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] (delay (error))] (delay (error))] (delay (error))] + (delay [(lam number_4 number_4) [(builtin unIData) generated_5]])] + (delay (error))])) + anf_1]) + (force [[builtin_7 (con string "subject")] (delay (con data (I 42)))])]) + (force (builtin trace))]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#2 : Data = trace "subject" in (con data (I 42)) in +case@Data anf#2 of + DataI number#1 -> number#1 +--- isolated folded Core +let anf#2 : Data = trace "subject" in (con data (I 42)) in +case@Data anf#2 of + DataI number#1 -> number#1 +--- isolated cleaned Core +let anf#2 : Data = trace "subject" in (con data (I 42)) in +case@Data anf#2 of + DataI number#1 -> number#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_3]])] + (delay (error))])) + anf_2]) + (force + [[(force (builtin trace)) (con string "subject")] (delay (con data (I 42)))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_3]])] + (delay (error))])) + anf_2]) + (force + [[(force (builtin trace)) (con string "subject")] (delay (con data (I 42)))])]) +--- result +(con integer 42) +--- logs +["subject"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__unknown_parameter.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__unknown_parameter.snap new file mode 100644 index 00000000..7081a229 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__unknown_parameter.snap @@ -0,0 +1,48 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\data#1 : Data -> case@Data data#1 of + DataI payload#2 -> payload#2) (con data (I 42)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (error))])) + data_1]) + (con data (I 42))]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +(\data#1 : Data -> case@Data data#1 of + DataI payload#2 -> payload#2) (con data (I 42)) +--- isolated folded Core +(\data#1 : Data -> case@Data data#1 of + DataI payload#2 -> payload#2) (con data (I 42)) +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam data_1 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (error))])) + data_1]) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__unselected_bad_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__unselected_bad_arity.snap new file mode 100644 index 00000000..20d73613 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__unselected_bad_arity.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@Data (con data (I 42)) of + DataI p#1 -> 42 + DataB -> 9 +--- after +case@Data (con data (I 42)) of + DataI p#1 -> 42 + DataB -> 9 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_captured_cold_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_captured_cold_false.snap new file mode 100644 index 00000000..9b4ef66f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_captured_cold_false.snap @@ -0,0 +1,88 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#5 : Data = bData (trace "before" in (con bytestring #6e617368)) in +case@Bool false of + True -> (con bytestring #6e617368) + False -> force (delay (case@Data data#5 of + DataB payload#6 -> payload#6)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_5 + (case + (con bool False) + (force + (delay + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unBData) generated_7]])])) + data_5])) + (con bytestring #6e617368))) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con bytestring #6e617368))])]]) +--- optimized Core +let anf#3 : bytes = trace "before" in (con bytestring #6e617368) in +let data#1 : Data = bData anf#3 in +anf#3 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 [(lam data_4 anf_2) [(builtin bData) anf_2]]) + (force [[builtin_5 (con string "before")] (delay (con bytestring #6e617368))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#7 : bytes = trace "before" in (con bytestring #6e617368) in +let data#5 : Data = bData anf#7 in +case@Bool false of + True -> (con bytestring #6e617368) + False -> force (delay (case@Data data#5 of + DataB payload#6 -> payload#6)) +--- isolated folded Core +let anf#7 : bytes = trace "before" in (con bytestring #6e617368) in +let data#5 : Data = bData anf#7 in +case@Bool false of + True -> (con bytestring #6e617368) + False -> force (delay (let payload#6 : bytes = anf#7 in + payload#6)) +--- isolated cleaned Core +let anf#7 : bytes = trace "before" in (con bytestring #6e617368) in +let data#5 : Data = bData anf#7 in +anf#7 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_7 + [(lam data_5 + (case + (con bool False) + (force + (delay + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unBData) generated_8]])])) + data_5])) + (con bytestring #6e617368))) + [(builtin bData) anf_7]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con bytestring #6e617368))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_7 [(lam data_5 anf_7) [(builtin bData) anf_7]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con bytestring #6e617368))])]) +--- result +(con bytestring #6e617368) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_captured_cold_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_captured_cold_true.snap new file mode 100644 index 00000000..33424cda --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_captured_cold_true.snap @@ -0,0 +1,88 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#5 : Data = bData (trace "before" in (con bytestring #6e617368)) in +case@Bool true of + True -> (con bytestring #6e617368) + False -> force (delay (case@Data data#5 of + DataB payload#6 -> payload#6)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_5 + (case + (con bool True) + (force + (delay + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unBData) generated_7]])])) + data_5])) + (con bytestring #6e617368))) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con bytestring #6e617368))])]]) +--- optimized Core +let anf#3 : bytes = trace "before" in (con bytestring #6e617368) in +let data#1 : Data = bData anf#3 in +(con bytestring #6e617368) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 [(lam data_4 (con bytestring #6e617368)) [(builtin bData) anf_2]]) + (force [[builtin_5 (con string "before")] (delay (con bytestring #6e617368))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#8 : bytes = trace "before" in (con bytestring #6e617368) in +let data#5 : Data = bData anf#8 in +case@Bool true of + True -> (con bytestring #6e617368) + False -> force (delay (case@Data data#5 of + DataB payload#6 -> payload#6)) +--- isolated folded Core +let anf#8 : bytes = trace "before" in (con bytestring #6e617368) in +let data#5 : Data = bData anf#8 in +case@Bool true of + True -> (con bytestring #6e617368) + False -> force (delay (let payload#6 : bytes = anf#8 in + payload#6)) +--- isolated cleaned Core +let anf#8 : bytes = trace "before" in (con bytestring #6e617368) in +let data#5 : Data = bData anf#8 in +(con bytestring #6e617368) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam data_5 + (case + (con bool True) + (force + (delay + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unBData) generated_9]])])) + data_5])) + (con bytestring #6e617368))) + [(builtin bData) anf_8]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con bytestring #6e617368))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 [(lam data_5 (con bytestring #6e617368)) [(builtin bData) anf_8]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con bytestring #6e617368))])]) +--- result +(con bytestring #6e617368) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_default_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_default_false.snap new file mode 100644 index 00000000..d98e2644 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_default_false.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (trace "operand" in (con bytestring #6e617368)) of + DataList wrong#6 -> trace "wrong" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))] + (delay (error))])) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]]) +--- optimized Core +let anf#2 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#3 : Data = bData anf#2 in +error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 [(lam anf_4 (error)) [(builtin bData) anf_1]]) + (force [[builtin_5 (con string "operand")] (delay (con bytestring #6e617368))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#7 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#8 : Data = bData anf#7 in +case@Data anf#8 of + DataList wrong#6 -> trace "wrong" in error +--- isolated folded Core +let anf#7 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#8 : Data = bData anf#7 in +error +--- isolated cleaned Core +let anf#7 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#8 : Data = bData anf#7 in +error +--- isolated UPLC before +(program 1.1.0 + [(lam anf_7 + [(lam anf_8 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))] + (delay (error))])) + anf_8]) + [(builtin bData) anf_7]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_7 [(lam anf_8 (error)) [(builtin bData) anf_7]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_default_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_default_true.snap new file mode 100644 index 00000000..056e506f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_default_true.snap @@ -0,0 +1,97 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (trace "operand" in (con bytestring #6e617368)) of + DataList wrong#6 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]]) +--- optimized Core +let anf#2 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#3 : Data = bData anf#2 in +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_4 + (force [[builtin_5 (con string "fallback")] (delay (con integer 9))])) + [(builtin bData) anf_1]]) + (force [[builtin_5 (con string "operand")] (delay (con bytestring #6e617368))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#9 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#10 : Data = bData anf#9 in +case@Data anf#10 of + DataList wrong#6 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- isolated folded Core +let anf#9 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#10 : Data = bData anf#9 in +trace "fallback" in 9 +--- isolated cleaned Core +let anf#9 : bytes = trace "operand" in (con bytestring #6e617368) in +let anf#10 : Data = bData anf#9 in +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + anf_10]) + [(builtin bData) anf_9]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) + [(builtin bData) anf_9]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]) +--- result +(con integer 9) +--- logs +["operand", "fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_bool_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_bool_fallback_false.snap new file mode 100644 index 00000000..51ffc59a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_bool_fallback_false.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData true of + DataB unused#21 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_22 + (force + [[[[[[(force (builtin chooseData)) generated_22] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))])) + [(builtin bData) (con bool True)]]) +--- optimized Core +let anf#2 : Data = bData true in +9 +--- optimized UPLC +(program 1.1.0 [(lam anf_1 (con integer 9)) [(builtin bData) (con bool True)]]) +--- isolated pass +--- isolated ANF input +let anf#22 : Data = bData true in +case@Data anf#22 of + DataB unused#21 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#23 : bool = true in +let anf#22 : Data = bData data_operand#23 in +let unused#21 : bool = data_operand#23 in +9 +--- isolated cleaned Core +let anf#22 : Data = bData true in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_22 + [(lam generated_23 + (force + [[[[[[(force (builtin chooseData)) generated_23] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))])) + anf_22]) + [(builtin bData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 [(lam anf_22 (con integer 9)) [(builtin bData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(ByteString, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_bool_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_bool_fallback_true.snap new file mode 100644 index 00000000..f00838e7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_bool_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData true of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin bData) (con bool True)]]) +--- optimized Core +let anf#1 : Data = bData true in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_2 + (force [[builtin_3 (con string "unreachable")] (delay (con integer 0))])) + [(builtin bData) (con bool True)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#25 : Data = bData true in +case@Data anf#25 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#26 : bool = true in +let anf#25 : Data = bData data_operand#26 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#25 : Data = bData true in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_25 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_25]) + [(builtin bData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_25 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin bData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(ByteString, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_delay_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_delay_fallback_false.snap new file mode 100644 index 00000000..6302731a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_delay_fallback_false.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (delay (\x#20 : int -> x#20)) of + DataB unused#33 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_34 + (force + [[[[[[(force (builtin chooseData)) generated_34] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))])) + [(builtin bData) (delay (lam x_20 x_20))]]) +--- optimized Core +let anf#3 : Data = bData (delay (\x#1 : int -> x#1)) in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_4 (con integer 9)) [(builtin bData) (delay (lam x_2 x_2))]]) +--- isolated pass +--- isolated ANF input +let anf#34 : Data = bData (delay (\x#20 : int -> x#20)) in +case@Data anf#34 of + DataB unused#33 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#35 : @delay (int -> int) = delay (\x#20 : int -> x#20) in +let anf#34 : Data = bData data_operand#35 in +let unused#33 : @delay (int -> int) = data_operand#35 in +9 +--- isolated cleaned Core +let anf#34 : Data = bData (delay (\x#20 : int -> x#20)) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_34 + [(lam generated_35 + (force + [[[[[[(force (builtin chooseData)) generated_35] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))])) + anf_34]) + [(builtin bData) (delay (lam x_20 x_20))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_34 (con integer 9)) [(builtin bData) (delay (lam x_20 x_20))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_delay_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_delay_fallback_true.snap new file mode 100644 index 00000000..c6bb3e7b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_delay_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (delay (\x#20 : int -> x#20)) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin bData) (delay (lam x_20 x_20))]]) +--- optimized Core +let anf#2 : Data = bData (delay (\x#1 : int -> x#1)) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin bData) (delay (lam x_3 x_3))]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#37 : Data = bData (delay (\x#20 : int -> x#20)) in +case@Data anf#37 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#38 : @delay (int -> int) = delay (\x#20 : int -> x#20) in +let anf#37 : Data = bData data_operand#38 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#37 : Data = bData (delay (\x#20 : int -> x#20)) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_37 + [(lam generated_38 + (force + [[[[[[(force (builtin chooseData)) generated_38] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_37]) + [(builtin bData) (delay (lam x_20 x_20))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_37 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin bData) (delay (lam x_20 x_20))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_duplicate.snap new file mode 100644 index 00000000..ff7fdf98 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_duplicate.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 -> 42 + DataB payload#3 -> 42 +--- after +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 -> 42 + DataB payload#3 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_function_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_function_fallback_false.snap new file mode 100644 index 00000000..94a42775 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_function_fallback_false.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (\x#20 : int -> x#20) of + DataB unused#27 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_28 + (force + [[[[[[(force (builtin chooseData)) generated_28] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))])) + [(builtin bData) (lam x_20 x_20)]]) +--- optimized Core +let anf#3 : Data = bData (\x#1 : int -> x#1) in +9 +--- optimized UPLC +(program 1.1.0 [(lam anf_4 (con integer 9)) [(builtin bData) (lam x_2 x_2)]]) +--- isolated pass +--- isolated ANF input +let anf#28 : Data = bData (\x#20 : int -> x#20) in +case@Data anf#28 of + DataB unused#27 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#29 : int -> int = \x#20 : int -> x#20 in +let anf#28 : Data = bData data_operand#29 in +let unused#27 : int -> int = data_operand#29 in +9 +--- isolated cleaned Core +let anf#28 : Data = bData (\x#20 : int -> x#20) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_28 + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))])) + anf_28]) + [(builtin bData) (lam x_20 x_20)]]) +--- isolated UPLC after +(program 1.1.0 [(lam anf_28 (con integer 9)) [(builtin bData) (lam x_20 x_20)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_function_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_function_fallback_true.snap new file mode 100644 index 00000000..d89ddc94 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_function_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (\x#20 : int -> x#20) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin bData) (lam x_20 x_20)]]) +--- optimized Core +let anf#2 : Data = bData (\x#1 : int -> x#1) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin bData) (lam x_3 x_3)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#31 : Data = bData (\x#20 : int -> x#20) in +case@Data anf#31 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#32 : int -> int = \x#20 : int -> x#20 in +let anf#31 : Data = bData data_operand#32 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#31 : Data = bData (\x#20 : int -> x#20) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_31 + [(lam generated_32 + (force + [[[[[[(force (builtin chooseData)) generated_32] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_31]) + [(builtin bData) (lam x_20 x_20)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_31 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin bData) (lam x_20 x_20)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_selected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_selected_arity.snap new file mode 100644 index 00000000..1772b49f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_selected_arity.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 payload#3 -> 0 +--- after +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 payload#3 -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_unselected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_unselected_arity.snap new file mode 100644 index 00000000..6893d03c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_unselected_arity.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 -> 42 + DataList -> 0 +--- after +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 -> 42 + DataList -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_wrong_test.snap new file mode 100644 index 00000000..6dca1adb --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_invalid_wrong_test.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 -> 42 + True -> 0 +--- after +let data#4 : Data = bData (con bytestring #6e617368) in +case@Data data#4 of + DataB payload#3 -> 42 + True -> 0 +--- errors +InvalidCase("non-Data test") +InvalidCase("non-Data test") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_overapplied.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_overapplied.snap new file mode 100644 index 00000000..bcace917 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_overapplied.snap @@ -0,0 +1,81 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (con bytestring #6e617368) 0 of + DataB payload#5 -> payload#5 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_6]])])) + [[(builtin bData) (con bytestring #6e617368)] (con integer 0)]]) +--- optimized Core +let anf#2 : Data = bData (con bytestring #6e617368) in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataB payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_8 + [(lam anf_4 + [(lam anf_5 + [(lam generated_7 + (force + [[[[[[builtin_8 generated_7] (delay (error))] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unBData) generated_7]])])) + anf_5]) + [anf_4 (con integer 0)]]) + [(builtin bData) (con bytestring #6e617368)]]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#6 : Data = bData (con bytestring #6e617368) in +let anf#7 : Data = anf#6 0 in +case@Data anf#7 of + DataB payload#5 -> payload#5 +--- isolated folded Core +let anf#6 : Data = bData (con bytestring #6e617368) in +let anf#7 : Data = anf#6 0 in +case@Data anf#7 of + DataB payload#5 -> payload#5 +--- isolated cleaned Core +let anf#6 : Data = bData (con bytestring #6e617368) in +let anf#7 : Data = anf#6 0 in +case@Data anf#7 of + DataB payload#5 -> payload#5 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_6 + [(lam anf_7 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_8]])])) + anf_7]) + [anf_6 (con integer 0)]]) + [(builtin bData) (con bytestring #6e617368)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_6 + [(lam anf_7 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_8]])])) + anf_7]) + [anf_6 (con integer 0)]]) + [(builtin bData) (con bytestring #6e617368)]]) +--- result +error: NonFunctionApplication(Con(Integer(0)), Con(Data(ByteString([110, 97, 115, 104])))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_parameter_false.snap new file mode 100644 index 00000000..26ab15b7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_parameter_false.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData (con bytestring #6e617368) of + DataB payload#9 -> payload#9 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_9 payload_9) [(builtin unBData) generated_10]])])) + [(builtin bData) (con bytestring #6e617368)]]) +--- optimized Core +let anf#2 : Data = bData (con bytestring #6e617368) in +(con bytestring #6e617368) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con bytestring #6e617368)) + [(builtin bData) (con bytestring #6e617368)]]) +--- isolated pass +--- isolated ANF input +let anf#10 : Data = bData (con bytestring #6e617368) in +case@Data anf#10 of + DataB payload#9 -> payload#9 + _ -> trace "cold" in error +--- isolated folded Core +let data_operand#11 : bytes = (con bytestring #6e617368) in +let anf#10 : Data = bData data_operand#11 in +let payload#9 : bytes = data_operand#11 in +payload#9 +--- isolated cleaned Core +let anf#10 : Data = bData (con bytestring #6e617368) in +(con bytestring #6e617368) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_10 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_9 payload_9) [(builtin unBData) generated_11]])])) + anf_10]) + [(builtin bData) (con bytestring #6e617368)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_10 (con bytestring #6e617368)) + [(builtin bData) (con bytestring #6e617368)]]) +--- result +(con bytestring #6e617368) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_parameter_true.snap new file mode 100644 index 00000000..3a146243 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_parameter_true.snap @@ -0,0 +1,64 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\input#12 : bytes -> case@Data bData input#12 of + DataB payload#13 -> payload#13 + _ -> trace "cold" in error) (con bytestring #6e617368) +--- unoptimized UPLC +(program 1.1.0 + [(lam input_12 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_13 payload_13) [(builtin unBData) generated_14]])])) + [(builtin bData) input_12]]) + (con bytestring #6e617368)]) +--- optimized Core +let anf#3 : Data = bData (con bytestring #6e617368) in +(con bytestring #6e617368) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con bytestring #6e617368)) + [(builtin bData) (con bytestring #6e617368)]]) +--- isolated pass +--- isolated ANF input +(\input#12 : bytes -> let anf#14 : Data = bData input#12 in +case@Data anf#14 of + DataB payload#13 -> payload#13 + _ -> trace "cold" in error) (con bytestring #6e617368) +--- isolated folded Core +(\input#12 : bytes -> let anf#14 : Data = bData input#12 in +let payload#13 : bytes = input#12 in +payload#13) (con bytestring #6e617368) +--- isolated cleaned Core +let anf#14 : Data = bData (con bytestring #6e617368) in +(con bytestring #6e617368) +--- isolated UPLC before +(program 1.1.0 + [(lam input_12 + [(lam anf_14 + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_13 payload_13) [(builtin unBData) generated_15]])])) + anf_14]) + [(builtin bData) input_12]]) + (con bytestring #6e617368)]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_14 (con bytestring #6e617368)) + [(builtin bData) (con bytestring #6e617368)]]) +--- result +(con bytestring #6e617368) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_partial.snap new file mode 100644 index 00000000..34cbb6e8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_partial.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data bData of + DataB payload#5 -> payload#5 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_6]])])) + (builtin bData)]) +--- optimized Core +case@Data bData of + DataB payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam generated_3 + (force + [[[[[[builtin_4 generated_3] (delay (error))] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unBData) generated_3]])])) + (builtin bData)]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +case@Data bData of + DataB payload#5 -> payload#5 +--- isolated folded Core +case@Data bData of + DataB payload#5 -> payload#5 +--- isolated cleaned Core +case@Data bData of + DataB payload#5 -> payload#5 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_6]])])) + (builtin bData)]) +--- isolated UPLC after +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_6]])])) + (builtin bData)]) +--- result +error: NotAConstant(Builtin(Runtime { args: [], fun: BData, forces: 0 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_shared_escape.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_shared_escape.snap new file mode 100644 index 00000000..c98cf9ea --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_shared_escape.snap @@ -0,0 +1,108 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#8 : Data = bData (trace "once" in (con bytestring #6e617368)) in +let alias#9 : Data = data#8 in +constr 0 data#8 (case@Data alias#9 of + DataB payload#10 -> payload#10) (case@Data alias#9 of + DataB payload#11 -> payload#11) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_8 + [(lam alias_9 + (constr 0 + data_8 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unBData) generated_12]])])) + alias_9] + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_11 payload_11) [(builtin unBData) generated_13]])])) + alias_9])) + data_8]) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #6e617368))])]]) +--- optimized Core +let anf#5 : bytes = trace "once" in (con bytestring #6e617368) in +let data#1 : Data = bData anf#5 in +constr 0 data#1 anf#5 anf#5 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam anf_2 [(lam data_3 (constr 0 data_3 anf_2 anf_2)) [(builtin bData) anf_2]]) + (force [[builtin_4 (con string "once")] (delay (con bytestring #6e617368))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#12 : bytes = trace "once" in (con bytestring #6e617368) in +let data#8 : Data = bData anf#12 in +let alias#9 : Data = data#8 in +let anf#13 : bytes = case@Data alias#9 of + DataB payload#10 -> payload#10 in +let anf#14 : bytes = case@Data alias#9 of + DataB payload#11 -> payload#11 in +constr 0 data#8 anf#13 anf#14 +--- isolated folded Core +let anf#12 : bytes = trace "once" in (con bytestring #6e617368) in +let data#8 : Data = bData anf#12 in +let alias#9 : Data = data#8 in +let anf#13 : bytes = let payload#10 : bytes = anf#12 in +payload#10 in +let anf#14 : bytes = let payload#11 : bytes = anf#12 in +payload#11 in +constr 0 data#8 anf#13 anf#14 +--- isolated cleaned Core +let anf#12 : bytes = trace "once" in (con bytestring #6e617368) in +let data#8 : Data = bData anf#12 in +constr 0 data#8 anf#12 anf#12 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam data_8 + [(lam alias_9 + [(lam anf_13 + [(lam anf_14 (constr 0 data_8 anf_13 anf_14)) + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_11 payload_11) [(builtin unBData) generated_15]])])) + alias_9]]) + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unBData) generated_16]])])) + alias_9]]) + data_8]) + [(builtin bData) anf_12]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #6e617368))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 + [(lam data_8 (constr 0 data_8 anf_12 anf_12)) [(builtin bData) anf_12]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con bytestring #6e617368))])]) +--- result +(constr 0 + (con data (B #6e617368)) + (con bytestring #6e617368) + (con bytestring #6e617368)) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_strict_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_strict_failure_false.snap new file mode 100644 index 00000000..35edc2b4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_strict_failure_false.snap @@ -0,0 +1,99 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#9 : Data = bData (trace "operand" in (con bytestring #6e617368)) in +let effect#11 : int = trace "between" in 0 in +case@Data data#9 of + DataB payload#10 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_9 + [(lam effect_11 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))])) + data_9]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin bData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]]) +--- optimized Core +let anf#4 : bytes = trace "operand" in (con bytestring #6e617368) in +let data#1 : Data = bData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin bData) anf_3]]) + (force [[builtin_7 (con string "operand")] (delay (con bytestring #6e617368))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#12 : bytes = trace "operand" in (con bytestring #6e617368) in +let data#9 : Data = bData anf#12 in +let effect#11 : int = trace "between" in 0 in +case@Data data#9 of + DataB payload#10 -> trace "selected" in 9 +--- isolated folded Core +let anf#12 : bytes = trace "operand" in (con bytestring #6e617368) in +let data#9 : Data = bData anf#12 in +let effect#11 : int = trace "between" in 0 in +let payload#10 : bytes = anf#12 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#12 : bytes = trace "operand" in (con bytestring #6e617368) in +let data#9 : Data = bData anf#12 in +let effect#11 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam data_9 + [(lam effect_11 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))])) + data_9]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin bData) anf_12]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 + [(lam data_9 + [(lam effect_11 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin bData) anf_12]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con bytestring #6e617368))])]) +--- result +(con integer 9) +--- logs +["operand", "between", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_strict_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_strict_failure_true.snap new file mode 100644 index 00000000..1596b683 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_strict_failure_true.snap @@ -0,0 +1,93 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#13 : Data = bData (trace "operand" in error) in +let effect#15 : int = trace "between" in 0 in +case@Data data#13 of + DataB payload#14 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_13 + [(lam effect_15 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))])) + data_13]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin bData) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]]) +--- optimized Core +let anf#4 : bytes = trace "operand" in error in +let data#1 : Data = bData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin bData) anf_3]]) + (force [[builtin_7 (con string "operand")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#16 : bytes = trace "operand" in error in +let data#13 : Data = bData anf#16 in +let effect#15 : int = trace "between" in 0 in +case@Data data#13 of + DataB payload#14 -> trace "selected" in 9 +--- isolated folded Core +let anf#16 : bytes = trace "operand" in error in +let data#13 : Data = bData anf#16 in +let effect#15 : int = trace "between" in 0 in +let payload#14 : bytes = anf#16 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#16 : bytes = trace "operand" in error in +let data#13 : Data = bData anf#16 in +let effect#15 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_16 + [(lam data_13 + [(lam effect_15 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))])) + data_13]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin bData) anf_16]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_16 + [(lam data_13 + [(lam effect_15 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin bData) anf_16]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_traced.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_traced.snap new file mode 100644 index 00000000..f69665b1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__bytes_traced.snap @@ -0,0 +1,81 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (trace "producer" in bData (con bytestring #6e617368)) of + DataB payload#5 -> payload#5 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_6]])])) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin bData) (con bytestring #6e617368)])])]) +--- optimized Core +let anf#2 : Data = trace "producer" in bData (con bytestring #6e617368) in +case@Data anf#2 of + DataB payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam builtin_7 + [(lam anf_3 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] (delay (error))] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unBData) generated_5]])])) + anf_3]) + (force + [[builtin_7 (con string "producer")] + (delay [(builtin bData) (con bytestring #6e617368)])])]) + (force (builtin trace))]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#8 : Data = trace "producer" in bData (con bytestring #6e617368) in +case@Data anf#8 of + DataB payload#5 -> payload#5 +--- isolated folded Core +let anf#8 : Data = trace "producer" in bData (con bytestring #6e617368) in +case@Data anf#8 of + DataB payload#5 -> payload#5 +--- isolated cleaned Core +let anf#8 : Data = trace "producer" in bData (con bytestring #6e617368) in +case@Data anf#8 of + DataB payload#5 -> payload#5 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_9]])])) + anf_8]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin bData) (con bytestring #6e617368)])])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_5 payload_5) [(builtin unBData) generated_9]])])) + anf_8]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin bData) (con bytestring #6e617368)])])]) +--- result +(con bytestring #6e617368) +--- logs +["producer"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_aliases_cold_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_aliases_cold_false.snap new file mode 100644 index 00000000..8e48e453 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_aliases_cold_false.snap @@ -0,0 +1,197 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = constrData (trace "tag" in 59) (trace "fields" in (con (list data) [(I 42)])) in +let alias#2 : Data = data#1 in +case@Bool false of + True -> constr 1 + False -> force (delay (constr 0 data#1 ((case@Data alias#2 of + DataConstr pair#3 -> \x#4 : int -> constr 0 pair#3 (case@Pair pair#3 of + Pair tag#5 fields#6 -> constr 0 tag#5 fields#6) x#4) 7) (case@Data alias#2 of + DataConstr second#7 -> second#7))) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + [(lam alias_2 + (case + (con bool False) + (force + (delay + (constr 0 + data_1 + [[(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay + [(lam pair_3 + (lam x_4 + (constr 0 + pair_3 + (case pair_3 (lam tag_5 (lam fields_6 (constr 0 tag_5 fields_6)))) + x_4))) + [(builtin unConstrData) generated_8]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_2] + (con integer 7)] + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay [(lam second_7 second_7) [(builtin unConstrData) generated_9]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_2]))) + (constr 1))) + data_1]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#15 : int = trace "tag" in 59 in +let anf#16 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#8 : Data = constrData anf#15 anf#16 in +let pair#10 : pair int (list Data) = unConstrData data#8 in +let anf#17 : 'erased = case@Pair pair#10 of + Pair tag#12 fields#13 -> constr 0 tag#12 fields#13 in +let anf#19 : 'erased = constr 0 pair#10 anf#17 7 in +let second#14 : pair int (list Data) = unConstrData data#8 in +constr 0 data#8 anf#19 second#14 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_12 + [(lam anf_1 + [(lam anf_2 + [(lam data_3 + [(lam pair_4 + [(lam anf_7 + [(lam anf_9 + [(lam second_11 (constr 0 data_3 anf_9 second_11)) + [(builtin unConstrData) data_3]]) + (constr 0 pair_4 anf_7 (con integer 7))]) + (case pair_4 (lam tag_5 (lam fields_6 (constr 0 tag_5 fields_6))))]) + [(builtin unConstrData) data_3]]) + [[(builtin constrData) anf_1] anf_2]]) + (force [[builtin_12 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_12 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#8 : int = trace "tag" in 59 in +let anf#9 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#8 anf#9 in +let alias#2 : Data = data#1 in +case@Bool false of + True -> constr 1 + False -> force (delay (let anf#11 : int -> 'erased = case@Data alias#2 of + DataConstr pair#3 -> \x#4 : int -> let anf#10 : 'erased = case@Pair pair#3 of + Pair tag#5 fields#6 -> constr 0 tag#5 fields#6 in + constr 0 pair#3 anf#10 x#4 in + let anf#12 : 'erased = anf#11 7 in + let anf#13 : pair int (list Data) = case@Data alias#2 of + DataConstr second#7 -> second#7 in + constr 0 data#1 anf#12 anf#13)) +--- isolated folded Core +let anf#8 : int = trace "tag" in 59 in +let anf#9 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#8 anf#9 in +let alias#2 : Data = data#1 in +case@Bool false of + True -> constr 1 + False -> force (delay (let anf#11 : int -> 'erased = let pair#3 : pair int (list Data) = unConstrData alias#2 in + \x#4 : int -> let anf#10 : 'erased = case@Pair pair#3 of + Pair tag#5 fields#6 -> constr 0 tag#5 fields#6 in + constr 0 pair#3 anf#10 x#4 in + let anf#12 : 'erased = anf#11 7 in + let anf#13 : pair int (list Data) = let second#7 : pair int (list Data) = unConstrData alias#2 in + second#7 in + constr 0 data#1 anf#12 anf#13)) +--- isolated cleaned Core +let anf#8 : int = trace "tag" in 59 in +let anf#9 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#8 anf#9 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +let anf#10 : 'erased = case@Pair pair#3 of + Pair tag#5 fields#6 -> constr 0 tag#5 fields#6 in +let anf#12 : 'erased = constr 0 pair#3 anf#10 7 in +let second#7 : pair int (list Data) = unConstrData data#1 in +constr 0 data#1 anf#12 second#7 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam anf_9 + [(lam data_1 + [(lam alias_2 + (case + (con bool False) + (force + (delay + [(lam anf_11 + [(lam anf_12 + [(lam anf_13 (constr 0 data_1 anf_12 anf_13)) + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] + (delay [(lam second_7 second_7) [(builtin unConstrData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_2]]) + [anf_11 (con integer 7)]]) + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] + (delay + [(lam pair_3 + (lam x_4 + [(lam anf_10 (constr 0 pair_3 anf_10 x_4)) + (case pair_3 (lam tag_5 (lam fields_6 (constr 0 tag_5 fields_6))))])) + [(builtin unConstrData) generated_15]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_2]])) + (constr 1))) + data_1]) + [[(builtin constrData) anf_8] anf_9]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 + [(lam anf_9 + [(lam data_1 + [(lam pair_3 + [(lam anf_10 + [(lam anf_12 + [(lam second_7 (constr 0 data_1 anf_12 second_7)) + [(builtin unConstrData) data_1]]) + (constr 0 pair_3 anf_10 (con integer 7))]) + (case pair_3 (lam tag_5 (lam fields_6 (constr 0 tag_5 fields_6))))]) + [(builtin unConstrData) data_1]]) + [[(builtin constrData) anf_8] anf_9]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +(constr 0 + (con data (Constr 59 [I 42])) + (constr 0 + (con (pair integer (list data)) (59, [(I 42)])) + (constr 0 (con integer 59) (con (list data) [(I 42)])) + (con integer 7)) + (con (pair integer (list data)) (59, [(I 42)]))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_aliases_cold_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_aliases_cold_true.snap new file mode 100644 index 00000000..0399c0b9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_aliases_cold_true.snap @@ -0,0 +1,161 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#14 : Data = constrData (trace "tag" in 59) (trace "fields" in (con (list data) [(I 42)])) in +let alias#15 : Data = data#14 in +case@Bool true of + True -> constr 1 + False -> force (delay (constr 0 data#14 ((case@Data alias#15 of + DataConstr pair#16 -> \x#17 : int -> constr 0 pair#16 (case@Pair pair#16 of + Pair tag#18 fields#19 -> constr 0 tag#18 fields#19) x#17) 7) (case@Data alias#15 of + DataConstr second#20 -> second#20))) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_14 + [(lam alias_15 + (case + (con bool True) + (force + (delay + (constr 0 + data_14 + [[(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + [(lam pair_16 + (lam x_17 + (constr 0 + pair_16 + (case pair_16 (lam tag_18 (lam fields_19 (constr 0 tag_18 fields_19)))) + x_17))) + [(builtin unConstrData) generated_21]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_15] + (con integer 7)] + [(lam generated_22 + (force + [[[[[[(force (builtin chooseData)) generated_22] + (delay [(lam second_20 second_20) [(builtin unConstrData) generated_22]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_15]))) + (constr 1))) + data_14]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#8 : int = trace "tag" in 59 in +let anf#9 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#8 anf#9 in +constr 1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 + [(lam anf_3 [(lam data_4 (constr 1)) [[(builtin constrData) anf_2] anf_3]]) + (force [[builtin_5 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_5 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#21 : int = trace "tag" in 59 in +let anf#22 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#14 : Data = constrData anf#21 anf#22 in +let alias#15 : Data = data#14 in +case@Bool true of + True -> constr 1 + False -> force (delay (let anf#24 : int -> 'erased = case@Data alias#15 of + DataConstr pair#16 -> \x#17 : int -> let anf#23 : 'erased = case@Pair pair#16 of + Pair tag#18 fields#19 -> constr 0 tag#18 fields#19 in + constr 0 pair#16 anf#23 x#17 in + let anf#25 : 'erased = anf#24 7 in + let anf#26 : pair int (list Data) = case@Data alias#15 of + DataConstr second#20 -> second#20 in + constr 0 data#14 anf#25 anf#26)) +--- isolated folded Core +let anf#21 : int = trace "tag" in 59 in +let anf#22 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#14 : Data = constrData anf#21 anf#22 in +let alias#15 : Data = data#14 in +case@Bool true of + True -> constr 1 + False -> force (delay (let anf#24 : int -> 'erased = let pair#16 : pair int (list Data) = unConstrData alias#15 in + \x#17 : int -> let anf#23 : 'erased = case@Pair pair#16 of + Pair tag#18 fields#19 -> constr 0 tag#18 fields#19 in + constr 0 pair#16 anf#23 x#17 in + let anf#25 : 'erased = anf#24 7 in + let anf#26 : pair int (list Data) = let second#20 : pair int (list Data) = unConstrData alias#15 in + second#20 in + constr 0 data#14 anf#25 anf#26)) +--- isolated cleaned Core +let anf#21 : int = trace "tag" in 59 in +let anf#22 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#14 : Data = constrData anf#21 anf#22 in +constr 1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_21 + [(lam anf_22 + [(lam data_14 + [(lam alias_15 + (case + (con bool True) + (force + (delay + [(lam anf_24 + [(lam anf_25 + [(lam anf_26 (constr 0 data_14 anf_25 anf_26)) + [(lam generated_27 + (force + [[[[[[(force (builtin chooseData)) generated_27] + (delay [(lam second_20 second_20) [(builtin unConstrData) generated_27]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_15]]) + [anf_24 (con integer 7)]]) + [(lam generated_28 + (force + [[[[[[(force (builtin chooseData)) generated_28] + (delay + [(lam pair_16 + (lam x_17 + [(lam anf_23 (constr 0 pair_16 anf_23 x_17)) + (case pair_16 (lam tag_18 (lam fields_19 (constr 0 tag_18 fields_19))))])) + [(builtin unConstrData) generated_28]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_15]])) + (constr 1))) + data_14]) + [[(builtin constrData) anf_21] anf_22]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_21 + [(lam anf_22 [(lam data_14 (constr 1)) [[(builtin constrData) anf_21] anf_22]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +(constr 1) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_bare.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_bare.snap new file mode 100644 index 00000000..b2b2614f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_bare.snap @@ -0,0 +1,70 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData of + DataConstr pair#5 -> pair#5 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay [(lam pair_5 pair_5) [(builtin unConstrData) generated_6]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin constrData)]) +--- optimized Core +case@Data constrData of + DataConstr pair#1 -> pair#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam generated_3 + (force + [[[[[[builtin_4 generated_3] + (delay [(lam pair_2 pair_2) [(builtin unConstrData) generated_3]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin constrData)]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +case@Data constrData of + DataConstr pair#5 -> pair#5 +--- isolated folded Core +case@Data constrData of + DataConstr pair#5 -> pair#5 +--- isolated cleaned Core +case@Data constrData of + DataConstr pair#5 -> pair#5 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay [(lam pair_5 pair_5) [(builtin unConstrData) generated_6]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin constrData)]) +--- isolated UPLC after +(program 1.1.0 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay [(lam pair_5 pair_5) [(builtin unConstrData) generated_6]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin constrData)]) +--- result +error: NotAConstant(Builtin(Runtime { args: [], fun: ConstrData, forces: 0 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_cold_producer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_cold_producer.snap new file mode 100644 index 00000000..b64898af --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_cold_producer.snap @@ -0,0 +1,71 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Bool false of + True -> force (delay (case@Data constrData (trace "cold" in error) (con (list data) [(I 42)]) of + DataConstr pair#1 -> 0)) + False -> 9 +--- unoptimized UPLC +(program 1.1.0 + (case + (con bool False) + (con integer 9) + (force + (delay + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (con integer 0))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))])] + (con (list data) [(I 42)])]])))) +--- optimized Core +9 +--- optimized UPLC +(program 1.1.0 (con integer 9)) +--- isolated pass +--- isolated ANF input +case@Bool false of + True -> force (delay (let anf#2 : int = trace "cold" in error in + let anf#3 : Data = constrData anf#2 (con (list data) [(I 42)]) in + case@Data anf#3 of + DataConstr pair#1 -> 0)) + False -> 9 +--- isolated folded Core +case@Bool false of + True -> force (delay (let anf#2 : int = trace "cold" in error in + let anf#3 : Data = constrData anf#2 (con (list data) [(I 42)]) in + 0)) + False -> 9 +--- isolated cleaned Core +9 +--- isolated UPLC before +(program 1.1.0 + (case + (con bool False) + (con integer 9) + (force + (delay + [(lam anf_2 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (con integer 0))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_3]) + [[(builtin constrData) anf_2] (con (list data) [(I 42)])]]) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))])])))) +--- isolated UPLC after +(program 1.1.0 (con integer 9)) +--- result +(con integer 9) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_default_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_default_false.snap new file mode 100644 index 00000000..5e6c99d1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_default_false.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 59 (con (list data) [(I 42)]) of + DataI wrong#1 -> trace "wrong" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))])) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- optimized Core +let anf#3 : Data = constrData 59 (con (list data) [(I 42)]) in +error +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (error)) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +let anf#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data anf#2 of + DataI wrong#1 -> trace "wrong" in error +--- isolated folded Core +let anf#2 : Data = constrData 59 (con (list data) [(I 42)]) in +error +--- isolated cleaned Core +let anf#2 : Data = constrData 59 (con (list data) [(I 42)]) in +error +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))])) + anf_2]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 (error)) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_default_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_default_true.snap new file mode 100644 index 00000000..1f6844ba --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_default_true.snap @@ -0,0 +1,79 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 59 (con (list data) [(I 42)]) of + DataI wrong#3 -> trace "wrong" in error + _ -> trace "default" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))])) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- optimized Core +let anf#2 : Data = constrData 59 (con (list data) [(I 42)]) in +trace "default" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam anf_1 (force [[builtin_2 (con string "default")] (delay (con integer 9))])) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data anf#4 of + DataI wrong#3 -> trace "wrong" in error + _ -> trace "default" in 9 +--- isolated folded Core +let anf#4 : Data = constrData 59 (con (list data) [(I 42)]) in +trace "default" in 9 +--- isolated cleaned Core +let anf#4 : Data = constrData 59 (con (list data) [(I 42)]) in +trace "default" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))]))])) + anf_4]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + (force + [[(force (builtin trace)) (con string "default")] (delay (con integer 9))])) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- result +(con integer 9) +--- logs +["default"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_fields_failure_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_fields_failure_used_false.snap new file mode 100644 index 00000000..14afa1cd --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_fields_failure_used_false.snap @@ -0,0 +1,107 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#21 : Data = constrData (trace "tag" in 59) (trace "fields" in error) in +let effect#22 : int = trace "between" in 0 in +case@Data data#21 of + DataConstr pair#23 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_21 + [(lam effect_22 + [(lam generated_24 + (force + [[[[[[(force (builtin chooseData)) generated_24] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_21]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force [[(force (builtin trace)) (con string "fields")] (delay (error))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list Data = trace "fields" in error in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_9 + [(lam anf_3 + [(lam anf_6 + [(lam data_7 + [(lam effect_8 + (force [[builtin_9 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_9 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_3] anf_6]]) + (force [[builtin_9 (con string "fields")] (delay (error))])]) + (force [[builtin_9 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#24 : int = trace "tag" in 59 in +let anf#25 : list Data = trace "fields" in error in +let data#21 : Data = constrData anf#24 anf#25 in +let effect#22 : int = trace "between" in 0 in +case@Data data#21 of + DataConstr pair#23 -> trace "selected" in 9 +--- isolated folded Core +let anf#24 : int = trace "tag" in 59 in +let anf#25 : list Data = trace "fields" in error in +let data#21 : Data = constrData anf#24 anf#25 in +let effect#22 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#24 : int = trace "tag" in 59 in +let anf#25 : list Data = trace "fields" in error in +let data#21 : Data = constrData anf#24 anf#25 in +let effect#22 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_24 + [(lam anf_25 + [(lam data_21 + [(lam effect_22 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_21]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_24] anf_25]]) + (force [[(force (builtin trace)) (con string "fields")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_24 + [(lam anf_25 + [(lam data_21 + [(lam effect_22 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_24] anf_25]]) + (force [[(force (builtin trace)) (con string "fields")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +error: ExplicitErrorTerm +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_fields_failure_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_fields_failure_used_true.snap new file mode 100644 index 00000000..5077cb6f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_fields_failure_used_true.snap @@ -0,0 +1,118 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#26 : Data = constrData (trace "tag" in 59) (trace "fields" in error) in +let effect#27 : int = trace "between" in 0 in +case@Data data#26 of + DataConstr pair#28 -> trace "selected" in fstPair pair#28 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_26 + [(lam effect_27 + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] + (delay + [(lam pair_28 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_28])])) + [(builtin unConstrData) generated_29]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_26]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force [[(force (builtin trace)) (con string "fields")] (delay (error))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list Data = trace "fields" in error in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +trace "selected" in anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_11 + [(lam anf_6 + [(lam anf_7 + [(lam data_8 + [(lam effect_9 + [(lam pair_10 (force [[builtin_11 (con string "selected")] (delay anf_6)])) + [(builtin unConstrData) data_8]]) + (force [[builtin_11 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_6] anf_7]]) + (force [[builtin_11 (con string "fields")] (delay (error))])]) + (force [[builtin_11 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#29 : int = trace "tag" in 59 in +let anf#30 : list Data = trace "fields" in error in +let data#26 : Data = constrData anf#29 anf#30 in +let effect#27 : int = trace "between" in 0 in +case@Data data#26 of + DataConstr pair#28 -> trace "selected" in fstPair pair#28 +--- isolated folded Core +let anf#29 : int = trace "tag" in 59 in +let anf#30 : list Data = trace "fields" in error in +let data#26 : Data = constrData anf#29 anf#30 in +let effect#27 : int = trace "between" in 0 in +let pair#28 : pair int (list Data) = unConstrData data#26 in +trace "selected" in fstPair pair#28 +--- isolated cleaned Core +let anf#29 : int = trace "tag" in 59 in +let anf#30 : list Data = trace "fields" in error in +let data#26 : Data = constrData anf#29 anf#30 in +let effect#27 : int = trace "between" in 0 in +let pair#28 : pair int (list Data) = unConstrData data#26 in +trace "selected" in anf#29 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_29 + [(lam anf_30 + [(lam data_26 + [(lam effect_27 + [(lam generated_31 + (force + [[[[[[(force (builtin chooseData)) generated_31] + (delay + [(lam pair_28 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_28])])) + [(builtin unConstrData) generated_31]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_26]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_29] anf_30]]) + (force [[(force (builtin trace)) (con string "fields")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_29 + [(lam anf_30 + [(lam data_26 + [(lam effect_27 + [(lam pair_28 + (force [[(force (builtin trace)) (con string "selected")] (delay anf_29)])) + [(builtin unConstrData) data_26]]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_29] anf_30]]) + (force [[(force (builtin trace)) (con string "fields")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +error: ExplicitErrorTerm +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_duplicate.snap new file mode 100644 index 00000000..bd0c3919 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_duplicate.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr pair#1 -> 42 + DataConstr pair#1 -> 42 +--- after +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr pair#1 -> 42 + DataConstr pair#1 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_selected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_selected_arity.snap new file mode 100644 index 00000000..2fa5ace9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_selected_arity.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr -> 0 +--- after +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_unselected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_unselected_arity.snap new file mode 100644 index 00000000..5f7e9f6b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_unselected_arity.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr pair#1 -> 42 + DataList -> 0 +--- after +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr pair#1 -> 42 + DataList -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_wrong_test.snap new file mode 100644 index 00000000..e1bb7380 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_invalid_wrong_test.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr pair#1 -> 42 + True -> 0 +--- after +let data#2 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data data#2 of + DataConstr pair#1 -> 42 + True -> 0 +--- errors +InvalidCase("non-Data test") +InvalidCase("non-Data test") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_negative_retained.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_negative_retained.snap new file mode 100644 index 00000000..d75af8ce --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_negative_retained.snap @@ -0,0 +1,46 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(&a, core,\nformat!(\"--- isolated Core before\\n{}\\n--- isolated Core after\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\",\npretty(before), pretty(after), nash_plutus::pretty::term(left),\nnash_plutus::pretty::term(right)))" +--- +--- unoptimized Core +case@Data constrData -1 (con (list data) []) of + DataConstr unused#1 -> 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (con integer 9))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + [[(builtin constrData) (con integer -1)] (con (list data) [])]]) +--- optimized Core +let anf#3 : Data = constrData -1 (con (list data) []) in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 9)) + [[(builtin constrData) (con integer -1)] (con (list data) [])]]) +--- isolated pass +--- isolated Core before +let anf#2 : Data = constrData -1 (con (list data) []) in +case@Data anf#2 of + DataConstr unused#1 -> 9 +--- isolated Core after +let anf#2 : Data = constrData -1 (con (list data) []) in +9 +--- isolated UPLC before +[(lam anf_2 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (con integer 9))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_2]) + [[(builtin constrData) (con integer -1)] (con (list data) [])]] +--- isolated UPLC after +[(lam anf_2 (con integer 9)) + [[(builtin constrData) (con integer -1)] (con (list data) [])]] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_overapplied.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_overapplied.snap new file mode 100644 index 00000000..4c1264dc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_overapplied.snap @@ -0,0 +1,91 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 59 (con (list data) [(I 42)]) 0 of + DataConstr pair#8 -> pair#8 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay [(lam pair_8 pair_8) [(builtin unConstrData) generated_9]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + [[[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])] + (con integer 0)]]) +--- optimized Core +let anf#2 : Data = constrData 59 (con (list data) [(I 42)]) in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataConstr pair#1 -> pair#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_8 + [(lam anf_4 + [(lam anf_5 + [(lam generated_7 + (force + [[[[[[builtin_8 generated_7] + (delay [(lam pair_6 pair_6) [(builtin unConstrData) generated_7]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_5]) + [anf_4 (con integer 0)]]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#9 : Data = constrData 59 (con (list data) [(I 42)]) in +let anf#10 : Data = anf#9 0 in +case@Data anf#10 of + DataConstr pair#8 -> pair#8 +--- isolated folded Core +let anf#9 : Data = constrData 59 (con (list data) [(I 42)]) in +let anf#10 : Data = anf#9 0 in +case@Data anf#10 of + DataConstr pair#8 -> pair#8 +--- isolated cleaned Core +let anf#9 : Data = constrData 59 (con (list data) [(I 42)]) in +let anf#10 : Data = anf#9 0 in +case@Data anf#10 of + DataConstr pair#8 -> pair#8 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay [(lam pair_8 pair_8) [(builtin unConstrData) generated_11]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_10]) + [anf_9 (con integer 0)]]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay [(lam pair_8 pair_8) [(builtin unConstrData) generated_11]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_10]) + [anf_9 (con integer 0)]]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- result +error: NonFunctionApplication(Con(Integer(0)), Con(Data(Constr { tag: 59, fields: [Integer(42)] }))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_partial.snap new file mode 100644 index 00000000..e6229c7b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_partial.snap @@ -0,0 +1,80 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 59 of + DataConstr pair#6 -> pair#6 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] + (delay [(lam pair_6 pair_6) [(builtin unConstrData) generated_7]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin constrData) (con integer 59)]]) +--- optimized Core +let anf#2 : Data = constrData 59 in +case@Data anf#2 of + DataConstr pair#1 -> pair#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam anf_3 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] + (delay [(lam pair_4 pair_4) [(builtin unConstrData) generated_5]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_3]) + [(builtin constrData) (con integer 59)]]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#7 : Data = constrData 59 in +case@Data anf#7 of + DataConstr pair#6 -> pair#6 +--- isolated folded Core +let anf#7 : Data = constrData 59 in +case@Data anf#7 of + DataConstr pair#6 -> pair#6 +--- isolated cleaned Core +let anf#7 : Data = constrData 59 in +case@Data anf#7 of + DataConstr pair#6 -> pair#6 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_7 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay [(lam pair_6 pair_6) [(builtin unConstrData) generated_8]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_7]) + [(builtin constrData) (con integer 59)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_7 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay [(lam pair_6 pair_6) [(builtin unConstrData) generated_8]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_7]) + [(builtin constrData) (con integer 59)]]) +--- result +error: NotAConstant(Builtin(Runtime { args: [Con(Integer(59))], fun: ConstrData, forces: 0 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_producer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_producer.snap new file mode 100644 index 00000000..ad0e2674 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_producer.snap @@ -0,0 +1,55 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 0 (con (list data) []) of + _ -> 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))])) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- optimized Core +let anf#1 : Data = constrData 0 (con (list data) []) in +42 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 (con integer 42)) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#5 : Data = constrData 0 (con (list data) []) in +case@Data anf#5 of + _ -> 42 +--- isolated folded Core +let anf#5 : Data = constrData 0 (con (list data) []) in +42 +--- isolated cleaned Core +let anf#5 : Data = constrData 0 (con (list data) []) in +42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_5 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))])) + anf_5]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_5 (con integer 42)) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_false_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_false_parameter_false.snap new file mode 100644 index 00000000..db1088f3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_false_parameter_false.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 0 (con (list data) [(I 42)]) of + DataConstr pair#3 -> pair#3 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay [(lam pair_3 pair_3) [(builtin unConstrData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 42)])]]) +--- optimized Core +let anf#2 : Data = constrData 0 (con (list data) [(I 42)]) in +unConstrData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +let anf#4 : Data = constrData 0 (con (list data) [(I 42)]) in +case@Data anf#4 of + DataConstr pair#3 -> pair#3 + _ -> trace "cold" in error +--- isolated folded Core +let anf#4 : Data = constrData 0 (con (list data) [(I 42)]) in +let pair#3 : pair int (list Data) = unConstrData anf#4 in +pair#3 +--- isolated cleaned Core +let anf#4 : Data = constrData 0 (con (list data) [(I 42)]) in +unConstrData anf#4 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] + (delay [(lam pair_3 pair_3) [(builtin unConstrData) generated_5]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_4]) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 [(builtin unConstrData) anf_4]) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 42)])]]) +--- result +(con (pair integer (list data)) (0, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_false_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_false_parameter_true.snap new file mode 100644 index 00000000..0f3d792c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_false_parameter_true.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\tag#5 : int fields#6 : list Data -> case@Data constrData tag#5 fields#6 of + DataConstr pair#7 -> pair#7 + _ -> trace "cold" in error) 0 (con (list data) [(I 42)]) +--- unoptimized UPLC +(program 1.1.0 + [[(lam tag_5 + (lam fields_6 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay [(lam pair_7 pair_7) [(builtin unConstrData) generated_8]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) tag_5] fields_6]])) + (con integer 0)] + (con (list data) [(I 42)])]) +--- optimized Core +let anf#4 : Data = constrData 0 (con (list data) [(I 42)]) in +unConstrData anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +(\tag#5 : int fields#6 : list Data -> let anf#8 : Data = constrData tag#5 fields#6 in +case@Data anf#8 of + DataConstr pair#7 -> pair#7 + _ -> trace "cold" in error) 0 (con (list data) [(I 42)]) +--- isolated folded Core +(\tag#5 : int fields#6 : list Data -> let anf#8 : Data = constrData tag#5 fields#6 in +let pair#7 : pair int (list Data) = unConstrData anf#8 in +pair#7) 0 (con (list data) [(I 42)]) +--- isolated cleaned Core +let anf#8 : Data = constrData 0 (con (list data) [(I 42)]) in +unConstrData anf#8 +--- isolated UPLC before +(program 1.1.0 + [[(lam tag_5 + (lam fields_6 + [(lam anf_8 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay [(lam pair_7 pair_7) [(builtin unConstrData) generated_9]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_8]) + [[(builtin constrData) tag_5] fields_6]])) + (con integer 0)] + (con (list data) [(I 42)])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 [(builtin unConstrData) anf_8]) + [[(builtin constrData) (con integer 0)] (con (list data) [(I 42)])]]) +--- result +(con (pair integer (list data)) (0, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_true_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_true_parameter_false.snap new file mode 100644 index 00000000..4db42cd8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_true_parameter_false.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 0 (con (list data) []) of + DataConstr pair#11 -> pair#11 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] + (delay [(lam pair_11 pair_11) [(builtin unConstrData) generated_12]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- optimized Core +let anf#2 : Data = constrData 0 (con (list data) []) in +unConstrData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#12 : Data = constrData 0 (con (list data) []) in +case@Data anf#12 of + DataConstr pair#11 -> pair#11 + _ -> trace "cold" in error +--- isolated folded Core +let anf#12 : Data = constrData 0 (con (list data) []) in +let pair#11 : pair int (list Data) = unConstrData anf#12 in +pair#11 +--- isolated cleaned Core +let anf#12 : Data = constrData 0 (con (list data) []) in +unConstrData anf#12 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] + (delay [(lam pair_11 pair_11) [(builtin unConstrData) generated_13]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_12]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 [(builtin unConstrData) anf_12]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- result +(con (pair integer (list data)) (0, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_true_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_true_parameter_true.snap new file mode 100644 index 00000000..a049afbf --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_0_empty_true_parameter_true.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\tag#13 : int fields#14 : list Data -> case@Data constrData tag#13 fields#14 of + DataConstr pair#15 -> pair#15 + _ -> trace "cold" in error) 0 (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [[(lam tag_13 + (lam fields_14 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] + (delay [(lam pair_15 pair_15) [(builtin unConstrData) generated_16]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) tag_13] fields_14]])) + (con integer 0)] + (con (list data) [])]) +--- optimized Core +let anf#4 : Data = constrData 0 (con (list data) []) in +unConstrData anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +(\tag#13 : int fields#14 : list Data -> let anf#16 : Data = constrData tag#13 fields#14 in +case@Data anf#16 of + DataConstr pair#15 -> pair#15 + _ -> trace "cold" in error) 0 (con (list data) []) +--- isolated folded Core +(\tag#13 : int fields#14 : list Data -> let anf#16 : Data = constrData tag#13 fields#14 in +let pair#15 : pair int (list Data) = unConstrData anf#16 in +pair#15) 0 (con (list data) []) +--- isolated cleaned Core +let anf#16 : Data = constrData 0 (con (list data) []) in +unConstrData anf#16 +--- isolated UPLC before +(program 1.1.0 + [[(lam tag_13 + (lam fields_14 + [(lam anf_16 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] + (delay [(lam pair_15 pair_15) [(builtin unConstrData) generated_17]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_16]) + [[(builtin constrData) tag_13] fields_14]])) + (con integer 0)] + (con (list data) [])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_16 [(builtin unConstrData) anf_16]) + [[(builtin constrData) (con integer 0)] (con (list data) [])]]) +--- result +(con (pair integer (list data)) (0, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_false_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_false_parameter_false.snap new file mode 100644 index 00000000..5e51a6cf --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_false_parameter_false.snap @@ -0,0 +1,64 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 18446744073709551615 (con (list data) [(I 42)]) of + DataConstr pair#35 -> pair#35 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_36 + (force + [[[[[[(force (builtin chooseData)) generated_36] + (delay [(lam pair_35 pair_35) [(builtin unConstrData) generated_36]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) (con integer 18446744073709551615)] + (con (list data) [(I 42)])]]) +--- optimized Core +let anf#2 : Data = constrData 18446744073709551615 (con (list data) [(I 42)]) in +unConstrData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 18446744073709551615)] + (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +let anf#36 : Data = constrData 18446744073709551615 (con (list data) [(I 42)]) in +case@Data anf#36 of + DataConstr pair#35 -> pair#35 + _ -> trace "cold" in error +--- isolated folded Core +let anf#36 : Data = constrData 18446744073709551615 (con (list data) [(I 42)]) in +let pair#35 : pair int (list Data) = unConstrData anf#36 in +pair#35 +--- isolated cleaned Core +let anf#36 : Data = constrData 18446744073709551615 (con (list data) [(I 42)]) in +unConstrData anf#36 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_36 + [(lam generated_37 + (force + [[[[[[(force (builtin chooseData)) generated_37] + (delay [(lam pair_35 pair_35) [(builtin unConstrData) generated_37]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_36]) + [[(builtin constrData) (con integer 18446744073709551615)] + (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_36 [(builtin unConstrData) anf_36]) + [[(builtin constrData) (con integer 18446744073709551615)] + (con (list data) [(I 42)])]]) +--- result +(con (pair integer (list data)) (18446744073709551615, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_false_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_false_parameter_true.snap new file mode 100644 index 00000000..c3376a71 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_false_parameter_true.snap @@ -0,0 +1,70 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\tag#37 : int fields#38 : list Data -> case@Data constrData tag#37 fields#38 of + DataConstr pair#39 -> pair#39 + _ -> trace "cold" in error) 18446744073709551615 (con (list data) [(I 42)]) +--- unoptimized UPLC +(program 1.1.0 + [[(lam tag_37 + (lam fields_38 + [(lam generated_40 + (force + [[[[[[(force (builtin chooseData)) generated_40] + (delay [(lam pair_39 pair_39) [(builtin unConstrData) generated_40]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) tag_37] fields_38]])) + (con integer 18446744073709551615)] + (con (list data) [(I 42)])]) +--- optimized Core +let anf#4 : Data = constrData 18446744073709551615 (con (list data) [(I 42)]) in +unConstrData anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 18446744073709551615)] + (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +(\tag#37 : int fields#38 : list Data -> let anf#40 : Data = constrData tag#37 fields#38 in +case@Data anf#40 of + DataConstr pair#39 -> pair#39 + _ -> trace "cold" in error) 18446744073709551615 (con (list data) [(I 42)]) +--- isolated folded Core +(\tag#37 : int fields#38 : list Data -> let anf#40 : Data = constrData tag#37 fields#38 in +let pair#39 : pair int (list Data) = unConstrData anf#40 in +pair#39) 18446744073709551615 (con (list data) [(I 42)]) +--- isolated cleaned Core +let anf#40 : Data = constrData 18446744073709551615 (con (list data) [(I 42)]) in +unConstrData anf#40 +--- isolated UPLC before +(program 1.1.0 + [[(lam tag_37 + (lam fields_38 + [(lam anf_40 + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] + (delay [(lam pair_39 pair_39) [(builtin unConstrData) generated_41]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_40]) + [[(builtin constrData) tag_37] fields_38]])) + (con integer 18446744073709551615)] + (con (list data) [(I 42)])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_40 [(builtin unConstrData) anf_40]) + [[(builtin constrData) (con integer 18446744073709551615)] + (con (list data) [(I 42)])]]) +--- result +(con (pair integer (list data)) (18446744073709551615, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_true_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_true_parameter_false.snap new file mode 100644 index 00000000..ceed61e7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_true_parameter_false.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 18446744073709551615 (con (list data) []) of + DataConstr pair#43 -> pair#43 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_44 + (force + [[[[[[(force (builtin chooseData)) generated_44] + (delay [(lam pair_43 pair_43) [(builtin unConstrData) generated_44]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) (con integer 18446744073709551615)] (con (list data) [])]]) +--- optimized Core +let anf#2 : Data = constrData 18446744073709551615 (con (list data) []) in +unConstrData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 18446744073709551615)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#44 : Data = constrData 18446744073709551615 (con (list data) []) in +case@Data anf#44 of + DataConstr pair#43 -> pair#43 + _ -> trace "cold" in error +--- isolated folded Core +let anf#44 : Data = constrData 18446744073709551615 (con (list data) []) in +let pair#43 : pair int (list Data) = unConstrData anf#44 in +pair#43 +--- isolated cleaned Core +let anf#44 : Data = constrData 18446744073709551615 (con (list data) []) in +unConstrData anf#44 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_44 + [(lam generated_45 + (force + [[[[[[(force (builtin chooseData)) generated_45] + (delay [(lam pair_43 pair_43) [(builtin unConstrData) generated_45]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_44]) + [[(builtin constrData) (con integer 18446744073709551615)] (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_44 [(builtin unConstrData) anf_44]) + [[(builtin constrData) (con integer 18446744073709551615)] (con (list data) [])]]) +--- result +(con (pair integer (list data)) (18446744073709551615, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_true_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_true_parameter_true.snap new file mode 100644 index 00000000..21364a5e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_18446744073709551615_empty_true_parameter_true.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\tag#45 : int fields#46 : list Data -> case@Data constrData tag#45 fields#46 of + DataConstr pair#47 -> pair#47 + _ -> trace "cold" in error) 18446744073709551615 (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [[(lam tag_45 + (lam fields_46 + [(lam generated_48 + (force + [[[[[[(force (builtin chooseData)) generated_48] + (delay [(lam pair_47 pair_47) [(builtin unConstrData) generated_48]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) tag_45] fields_46]])) + (con integer 18446744073709551615)] + (con (list data) [])]) +--- optimized Core +let anf#4 : Data = constrData 18446744073709551615 (con (list data) []) in +unConstrData anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 18446744073709551615)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +(\tag#45 : int fields#46 : list Data -> let anf#48 : Data = constrData tag#45 fields#46 in +case@Data anf#48 of + DataConstr pair#47 -> pair#47 + _ -> trace "cold" in error) 18446744073709551615 (con (list data) []) +--- isolated folded Core +(\tag#45 : int fields#46 : list Data -> let anf#48 : Data = constrData tag#45 fields#46 in +let pair#47 : pair int (list Data) = unConstrData anf#48 in +pair#47) 18446744073709551615 (con (list data) []) +--- isolated cleaned Core +let anf#48 : Data = constrData 18446744073709551615 (con (list data) []) in +unConstrData anf#48 +--- isolated UPLC before +(program 1.1.0 + [[(lam tag_45 + (lam fields_46 + [(lam anf_48 + [(lam generated_49 + (force + [[[[[[(force (builtin chooseData)) generated_49] + (delay [(lam pair_47 pair_47) [(builtin unConstrData) generated_49]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_48]) + [[(builtin constrData) tag_45] fields_46]])) + (con integer 18446744073709551615)] + (con (list data) [])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_48 [(builtin unConstrData) anf_48]) + [[(builtin constrData) (con integer 18446744073709551615)] (con (list data) [])]]) +--- result +(con (pair integer (list data)) (18446744073709551615, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_false_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_false_parameter_false.snap new file mode 100644 index 00000000..5b3019db --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_false_parameter_false.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 59 (con (list data) [(I 42)]) of + DataConstr pair#19 -> pair#19 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_20 + (force + [[[[[[(force (builtin chooseData)) generated_20] + (delay [(lam pair_19 pair_19) [(builtin unConstrData) generated_20]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- optimized Core +let anf#2 : Data = constrData 59 (con (list data) [(I 42)]) in +unConstrData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +let anf#20 : Data = constrData 59 (con (list data) [(I 42)]) in +case@Data anf#20 of + DataConstr pair#19 -> pair#19 + _ -> trace "cold" in error +--- isolated folded Core +let anf#20 : Data = constrData 59 (con (list data) [(I 42)]) in +let pair#19 : pair int (list Data) = unConstrData anf#20 in +pair#19 +--- isolated cleaned Core +let anf#20 : Data = constrData 59 (con (list data) [(I 42)]) in +unConstrData anf#20 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_20 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay [(lam pair_19 pair_19) [(builtin unConstrData) generated_21]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_20]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_20 [(builtin unConstrData) anf_20]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- result +(con (pair integer (list data)) (59, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_false_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_false_parameter_true.snap new file mode 100644 index 00000000..8b9f3b53 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_false_parameter_true.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\tag#21 : int fields#22 : list Data -> case@Data constrData tag#21 fields#22 of + DataConstr pair#23 -> pair#23 + _ -> trace "cold" in error) 59 (con (list data) [(I 42)]) +--- unoptimized UPLC +(program 1.1.0 + [[(lam tag_21 + (lam fields_22 + [(lam generated_24 + (force + [[[[[[(force (builtin chooseData)) generated_24] + (delay [(lam pair_23 pair_23) [(builtin unConstrData) generated_24]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) tag_21] fields_22]])) + (con integer 59)] + (con (list data) [(I 42)])]) +--- optimized Core +let anf#4 : Data = constrData 59 (con (list data) [(I 42)]) in +unConstrData anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +(\tag#21 : int fields#22 : list Data -> let anf#24 : Data = constrData tag#21 fields#22 in +case@Data anf#24 of + DataConstr pair#23 -> pair#23 + _ -> trace "cold" in error) 59 (con (list data) [(I 42)]) +--- isolated folded Core +(\tag#21 : int fields#22 : list Data -> let anf#24 : Data = constrData tag#21 fields#22 in +let pair#23 : pair int (list Data) = unConstrData anf#24 in +pair#23) 59 (con (list data) [(I 42)]) +--- isolated cleaned Core +let anf#24 : Data = constrData 59 (con (list data) [(I 42)]) in +unConstrData anf#24 +--- isolated UPLC before +(program 1.1.0 + [[(lam tag_21 + (lam fields_22 + [(lam anf_24 + [(lam generated_25 + (force + [[[[[[(force (builtin chooseData)) generated_25] + (delay [(lam pair_23 pair_23) [(builtin unConstrData) generated_25]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_24]) + [[(builtin constrData) tag_21] fields_22]])) + (con integer 59)] + (con (list data) [(I 42)])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_24 [(builtin unConstrData) anf_24]) + [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])]]) +--- result +(con (pair integer (list data)) (59, [(I 42)])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_true_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_true_parameter_false.snap new file mode 100644 index 00000000..70eb5b61 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_true_parameter_false.snap @@ -0,0 +1,60 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data constrData 59 (con (list data) []) of + DataConstr pair#27 -> pair#27 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_28 + (force + [[[[[[(force (builtin chooseData)) generated_28] + (delay [(lam pair_27 pair_27) [(builtin unConstrData) generated_28]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) (con integer 59)] (con (list data) [])]]) +--- optimized Core +let anf#2 : Data = constrData 59 (con (list data) []) in +unConstrData anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 59)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#28 : Data = constrData 59 (con (list data) []) in +case@Data anf#28 of + DataConstr pair#27 -> pair#27 + _ -> trace "cold" in error +--- isolated folded Core +let anf#28 : Data = constrData 59 (con (list data) []) in +let pair#27 : pair int (list Data) = unConstrData anf#28 in +pair#27 +--- isolated cleaned Core +let anf#28 : Data = constrData 59 (con (list data) []) in +unConstrData anf#28 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_28 + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] + (delay [(lam pair_27 pair_27) [(builtin unConstrData) generated_29]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_28]) + [[(builtin constrData) (con integer 59)] (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_28 [(builtin unConstrData) anf_28]) + [[(builtin constrData) (con integer 59)] (con (list data) [])]]) +--- result +(con (pair integer (list data)) (59, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_true_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_true_parameter_true.snap new file mode 100644 index 00000000..3d74f610 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_59_empty_true_parameter_true.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\tag#29 : int fields#30 : list Data -> case@Data constrData tag#29 fields#30 of + DataConstr pair#31 -> pair#31 + _ -> trace "cold" in error) 59 (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [[(lam tag_29 + (lam fields_30 + [(lam generated_32 + (force + [[[[[[(force (builtin chooseData)) generated_32] + (delay [(lam pair_31 pair_31) [(builtin unConstrData) generated_32]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [[(builtin constrData) tag_29] fields_30]])) + (con integer 59)] + (con (list data) [])]) +--- optimized Core +let anf#4 : Data = constrData 59 (con (list data) []) in +unConstrData anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 [(builtin unConstrData) anf_1]) + [[(builtin constrData) (con integer 59)] (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +(\tag#29 : int fields#30 : list Data -> let anf#32 : Data = constrData tag#29 fields#30 in +case@Data anf#32 of + DataConstr pair#31 -> pair#31 + _ -> trace "cold" in error) 59 (con (list data) []) +--- isolated folded Core +(\tag#29 : int fields#30 : list Data -> let anf#32 : Data = constrData tag#29 fields#30 in +let pair#31 : pair int (list Data) = unConstrData anf#32 in +pair#31) 59 (con (list data) []) +--- isolated cleaned Core +let anf#32 : Data = constrData 59 (con (list data) []) in +unConstrData anf#32 +--- isolated UPLC before +(program 1.1.0 + [[(lam tag_29 + (lam fields_30 + [(lam anf_32 + [(lam generated_33 + (force + [[[[[[(force (builtin chooseData)) generated_33] + (delay [(lam pair_31 pair_31) [(builtin unConstrData) generated_33]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_32]) + [[(builtin constrData) tag_29] fields_30]])) + (con integer 59)] + (con (list data) [])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_32 [(builtin unConstrData) anf_32]) + [[(builtin constrData) (con integer 59)] (con (list data) [])]]) +--- result +(con (pair integer (list data)) (59, [])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_failure_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_failure_used_false.snap new file mode 100644 index 00000000..036be1ac --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_failure_used_false.snap @@ -0,0 +1,113 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#11 : Data = constrData (trace "tag" in error) (trace "fields" in (con (list data) [(I 42)])) in +let effect#12 : int = trace "between" in 0 in +case@Data data#11 of + DataConstr pair#13 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_11 + [(lam effect_12 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_11]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (error))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in error in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_9 + [(lam anf_3 + [(lam anf_6 + [(lam data_7 + [(lam effect_8 + (force [[builtin_9 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_9 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_3] anf_6]]) + (force [[builtin_9 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_9 (con string "tag")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#14 : int = trace "tag" in error in +let anf#15 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#11 : Data = constrData anf#14 anf#15 in +let effect#12 : int = trace "between" in 0 in +case@Data data#11 of + DataConstr pair#13 -> trace "selected" in 9 +--- isolated folded Core +let anf#14 : int = trace "tag" in error in +let anf#15 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#11 : Data = constrData anf#14 anf#15 in +let effect#12 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#14 : int = trace "tag" in error in +let anf#15 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#11 : Data = constrData anf#14 anf#15 in +let effect#12 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_14 + [(lam anf_15 + [(lam data_11 + [(lam effect_12 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_11]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_14] anf_15]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_14 + [(lam anf_15 + [(lam data_11 + [(lam effect_12 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_14] anf_15]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["tag"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_failure_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_failure_used_true.snap new file mode 100644 index 00000000..67d570dc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_tag_failure_used_true.snap @@ -0,0 +1,124 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#16 : Data = constrData (trace "tag" in error) (trace "fields" in (con (list data) [(I 42)])) in +let effect#17 : int = trace "between" in 0 in +case@Data data#16 of + DataConstr pair#18 -> trace "selected" in fstPair pair#18 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_16 + [(lam effect_17 + [(lam generated_19 + (force + [[[[[[(force (builtin chooseData)) generated_19] + (delay + [(lam pair_18 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_18])])) + [(builtin unConstrData) generated_19]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_16]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (error))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in error in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +trace "selected" in anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_11 + [(lam anf_6 + [(lam anf_7 + [(lam data_8 + [(lam effect_9 + [(lam pair_10 (force [[builtin_11 (con string "selected")] (delay anf_6)])) + [(builtin unConstrData) data_8]]) + (force [[builtin_11 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_6] anf_7]]) + (force [[builtin_11 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_11 (con string "tag")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#19 : int = trace "tag" in error in +let anf#20 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#16 : Data = constrData anf#19 anf#20 in +let effect#17 : int = trace "between" in 0 in +case@Data data#16 of + DataConstr pair#18 -> trace "selected" in fstPair pair#18 +--- isolated folded Core +let anf#19 : int = trace "tag" in error in +let anf#20 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#16 : Data = constrData anf#19 anf#20 in +let effect#17 : int = trace "between" in 0 in +let pair#18 : pair int (list Data) = unConstrData data#16 in +trace "selected" in fstPair pair#18 +--- isolated cleaned Core +let anf#19 : int = trace "tag" in error in +let anf#20 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#16 : Data = constrData anf#19 anf#20 in +let effect#17 : int = trace "between" in 0 in +let pair#18 : pair int (list Data) = unConstrData data#16 in +trace "selected" in anf#19 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_19 + [(lam anf_20 + [(lam data_16 + [(lam effect_17 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + [(lam pair_18 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_18])])) + [(builtin unConstrData) generated_21]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_16]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_19] anf_20]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_19 + [(lam anf_20 + [(lam data_16 + [(lam effect_17 + [(lam pair_18 + (force [[(force (builtin trace)) (con string "selected")] (delay anf_19)])) + [(builtin unConstrData) data_16]]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_19] anf_20]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["tag"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_too_large_retained.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_too_large_retained.snap new file mode 100644 index 00000000..acb9653f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_too_large_retained.snap @@ -0,0 +1,46 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(&a, core,\nformat!(\"--- isolated Core before\\n{}\\n--- isolated Core after\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\",\npretty(before), pretty(after), nash_plutus::pretty::term(left),\nnash_plutus::pretty::term(right)))" +--- +--- unoptimized Core +case@Data constrData 18446744073709551616 (con (list data) []) of + DataConstr unused#3 -> 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (con integer 9))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + [[(builtin constrData) (con integer 18446744073709551616)] (con (list data) [])]]) +--- optimized Core +let anf#2 : Data = constrData 18446744073709551616 (con (list data) []) in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 9)) + [[(builtin constrData) (con integer 18446744073709551616)] (con (list data) [])]]) +--- isolated pass +--- isolated Core before +let anf#4 : Data = constrData 18446744073709551616 (con (list data) []) in +case@Data anf#4 of + DataConstr unused#3 -> 9 +--- isolated Core after +let anf#4 : Data = constrData 18446744073709551616 (con (list data) []) in +9 +--- isolated UPLC before +[(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (con integer 9))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_4]) + [[(builtin constrData) (con integer 18446744073709551616)] (con (list data) [])]] +--- isolated UPLC after +[(lam anf_4 (con integer 9)) + [[(builtin constrData) (con integer 18446744073709551616)] (con (list data) [])]] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_traced.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_traced.snap new file mode 100644 index 00000000..a09ef4f1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_traced.snap @@ -0,0 +1,90 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (trace "producer" in constrData 59 (con (list data) [(I 42)])) of + DataConstr pair#11 -> pair#11 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] + (delay [(lam pair_11 pair_11) [(builtin unConstrData) generated_12]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])])])]) +--- optimized Core +let anf#2 : Data = trace "producer" in constrData 59 (con (list data) [(I 42)]) in +case@Data anf#2 of + DataConstr pair#1 -> pair#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam builtin_7 + [(lam anf_3 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] + (delay [(lam pair_4 pair_4) [(builtin unConstrData) generated_5]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_3]) + (force + [[builtin_7 (con string "producer")] + (delay [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])])])]) + (force (builtin trace))]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#12 : Data = trace "producer" in constrData 59 (con (list data) [(I 42)]) in +case@Data anf#12 of + DataConstr pair#11 -> pair#11 +--- isolated folded Core +let anf#12 : Data = trace "producer" in constrData 59 (con (list data) [(I 42)]) in +case@Data anf#12 of + DataConstr pair#11 -> pair#11 +--- isolated cleaned Core +let anf#12 : Data = trace "producer" in constrData 59 (con (list data) [(I 42)]) in +case@Data anf#12 of + DataConstr pair#11 -> pair#11 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] + (delay [(lam pair_11 pair_11) [(builtin unConstrData) generated_13]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_12]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])])])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] + (delay [(lam pair_11 pair_11) [(builtin unConstrData) generated_13]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_12]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [[(builtin constrData) (con integer 59)] (con (list data) [(I 42)])])])]) +--- result +(con (pair integer (list data)) (59, [(I 42)])) +--- logs +["producer"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_valid_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_valid_used_false.snap new file mode 100644 index 00000000..46343101 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_valid_used_false.snap @@ -0,0 +1,113 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = constrData (trace "tag" in 59) (trace "fields" in (con (list data) [(I 42)])) in +let effect#2 : int = trace "between" in 0 in +case@Data data#1 of + DataConstr pair#3 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + [(lam effect_2 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_1]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#7 : int = trace "tag" in 59 in +let anf#8 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#4 : Data = constrData anf#7 anf#8 in +let effect#5 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_1 + [(lam anf_2 + [(lam data_3 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_1] anf_2]]) + (force [[builtin_7 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_7 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +case@Data data#1 of + DataConstr pair#3 -> trace "selected" in 9 +--- isolated folded Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam data_1 + [(lam effect_2 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_1]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_4] anf_5]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam data_1 + [(lam effect_2 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_4] anf_5]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +(con integer 9) +--- logs +["tag", "fields", "between", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_valid_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_valid_used_true.snap new file mode 100644 index 00000000..b14266d2 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_valid_used_true.snap @@ -0,0 +1,124 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#6 : Data = constrData (trace "tag" in 59) (trace "fields" in (con (list data) [(I 42)])) in +let effect#7 : int = trace "between" in 0 in +case@Data data#6 of + DataConstr pair#8 -> trace "selected" in fstPair pair#8 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_6 + [(lam effect_7 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay + [(lam pair_8 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_8])])) + [(builtin unConstrData) generated_9]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_6]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +trace "selected" in anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_11 + [(lam anf_6 + [(lam anf_7 + [(lam data_8 + [(lam effect_9 + [(lam pair_10 (force [[builtin_11 (con string "selected")] (delay anf_6)])) + [(builtin unConstrData) data_8]]) + (force [[builtin_11 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_6] anf_7]]) + (force [[builtin_11 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_11 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#9 : int = trace "tag" in 59 in +let anf#10 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#6 : Data = constrData anf#9 anf#10 in +let effect#7 : int = trace "between" in 0 in +case@Data data#6 of + DataConstr pair#8 -> trace "selected" in fstPair pair#8 +--- isolated folded Core +let anf#9 : int = trace "tag" in 59 in +let anf#10 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#6 : Data = constrData anf#9 anf#10 in +let effect#7 : int = trace "between" in 0 in +let pair#8 : pair int (list Data) = unConstrData data#6 in +trace "selected" in fstPair pair#8 +--- isolated cleaned Core +let anf#9 : int = trace "tag" in 59 in +let anf#10 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#6 : Data = constrData anf#9 anf#10 in +let effect#7 : int = trace "between" in 0 in +let pair#8 : pair int (list Data) = unConstrData data#6 in +trace "selected" in anf#9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + [(lam data_6 + [(lam effect_7 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] + (delay + [(lam pair_8 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_8])])) + [(builtin unConstrData) generated_11]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_6]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_9] anf_10]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_9 + [(lam anf_10 + [(lam data_6 + [(lam effect_7 + [(lam pair_8 + (force [[(force (builtin trace)) (con string "selected")] (delay anf_9)])) + [(builtin unConstrData) data_6]]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_9] anf_10]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +(con integer 59) +--- logs +["tag", "fields", "between", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_empty_metadata_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_empty_metadata_used_false.snap new file mode 100644 index 00000000..6c81e2b3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_empty_metadata_used_false.snap @@ -0,0 +1,113 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#51 : Data = constrData (trace "tag" in 59) (trace "fields" in (con (list integer) [])) in +let effect#52 : int = trace "between" in 0 in +case@Data data#51 of + DataConstr pair#53 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_51 + [(lam effect_52 + [(lam generated_54 + (force + [[[[[[(force (builtin chooseData)) generated_54] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_51]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list integer) []))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list int = trace "fields" in (con (list integer) []) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_9 + [(lam anf_3 + [(lam anf_6 + [(lam data_7 + [(lam effect_8 + (force [[builtin_9 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_9 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_3] anf_6]]) + (force [[builtin_9 (con string "fields")] (delay (con (list integer) []))])]) + (force [[builtin_9 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#54 : int = trace "tag" in 59 in +let anf#55 : list int = trace "fields" in (con (list integer) []) in +let data#51 : Data = constrData anf#54 anf#55 in +let effect#52 : int = trace "between" in 0 in +case@Data data#51 of + DataConstr pair#53 -> trace "selected" in 9 +--- isolated folded Core +let anf#54 : int = trace "tag" in 59 in +let anf#55 : list int = trace "fields" in (con (list integer) []) in +let data#51 : Data = constrData anf#54 anf#55 in +let effect#52 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#54 : int = trace "tag" in 59 in +let anf#55 : list int = trace "fields" in (con (list integer) []) in +let data#51 : Data = constrData anf#54 anf#55 in +let effect#52 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_54 + [(lam anf_55 + [(lam data_51 + [(lam effect_52 + [(lam generated_56 + (force + [[[[[[(force (builtin chooseData)) generated_56] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_51]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_54] anf_55]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list integer) []))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_54 + [(lam anf_55 + [(lam data_51 + [(lam effect_52 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_54] anf_55]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list integer) []))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, []))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_empty_metadata_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_empty_metadata_used_true.snap new file mode 100644 index 00000000..8038d8a2 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_empty_metadata_used_true.snap @@ -0,0 +1,124 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#56 : Data = constrData (trace "tag" in 59) (trace "fields" in (con (list integer) [])) in +let effect#57 : int = trace "between" in 0 in +case@Data data#56 of + DataConstr pair#58 -> trace "selected" in fstPair pair#58 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_56 + [(lam effect_57 + [(lam generated_59 + (force + [[[[[[(force (builtin chooseData)) generated_59] + (delay + [(lam pair_58 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_58])])) + [(builtin unConstrData) generated_59]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_56]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list integer) []))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : list int = trace "fields" in (con (list integer) []) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +trace "selected" in anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_11 + [(lam anf_6 + [(lam anf_7 + [(lam data_8 + [(lam effect_9 + [(lam pair_10 (force [[builtin_11 (con string "selected")] (delay anf_6)])) + [(builtin unConstrData) data_8]]) + (force [[builtin_11 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_6] anf_7]]) + (force [[builtin_11 (con string "fields")] (delay (con (list integer) []))])]) + (force [[builtin_11 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#59 : int = trace "tag" in 59 in +let anf#60 : list int = trace "fields" in (con (list integer) []) in +let data#56 : Data = constrData anf#59 anf#60 in +let effect#57 : int = trace "between" in 0 in +case@Data data#56 of + DataConstr pair#58 -> trace "selected" in fstPair pair#58 +--- isolated folded Core +let anf#59 : int = trace "tag" in 59 in +let anf#60 : list int = trace "fields" in (con (list integer) []) in +let data#56 : Data = constrData anf#59 anf#60 in +let effect#57 : int = trace "between" in 0 in +let pair#58 : pair int (list Data) = unConstrData data#56 in +trace "selected" in fstPair pair#58 +--- isolated cleaned Core +let anf#59 : int = trace "tag" in 59 in +let anf#60 : list int = trace "fields" in (con (list integer) []) in +let data#56 : Data = constrData anf#59 anf#60 in +let effect#57 : int = trace "between" in 0 in +let pair#58 : pair int (list Data) = unConstrData data#56 in +trace "selected" in anf#59 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_59 + [(lam anf_60 + [(lam data_56 + [(lam effect_57 + [(lam generated_61 + (force + [[[[[[(force (builtin chooseData)) generated_61] + (delay + [(lam pair_58 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_58])])) + [(builtin unConstrData) generated_61]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_56]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_59] anf_60]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list integer) []))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_59 + [(lam anf_60 + [(lam data_56 + [(lam effect_57 + [(lam pair_58 + (force [[(force (builtin trace)) (con string "selected")] (delay anf_59)])) + [(builtin unConstrData) data_56]]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_59] anf_60]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list integer) []))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, []))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_fields_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_fields_used_false.snap new file mode 100644 index 00000000..59a6fa57 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_fields_used_false.snap @@ -0,0 +1,110 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#41 : Data = constrData (trace "tag" in 59) (trace "fields" in true) in +let effect#42 : int = trace "between" in 0 in +case@Data data#41 of + DataConstr pair#43 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_41 + [(lam effect_42 + [(lam generated_44 + (force + [[[[[[(force (builtin chooseData)) generated_44] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_41]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] (delay (con bool True))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : bool = trace "fields" in true in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_9 + [(lam anf_3 + [(lam anf_6 + [(lam data_7 + [(lam effect_8 + (force [[builtin_9 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_9 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_3] anf_6]]) + (force [[builtin_9 (con string "fields")] (delay (con bool True))])]) + (force [[builtin_9 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#44 : int = trace "tag" in 59 in +let anf#45 : bool = trace "fields" in true in +let data#41 : Data = constrData anf#44 anf#45 in +let effect#42 : int = trace "between" in 0 in +case@Data data#41 of + DataConstr pair#43 -> trace "selected" in 9 +--- isolated folded Core +let anf#44 : int = trace "tag" in 59 in +let anf#45 : bool = trace "fields" in true in +let data#41 : Data = constrData anf#44 anf#45 in +let effect#42 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#44 : int = trace "tag" in 59 in +let anf#45 : bool = trace "fields" in true in +let data#41 : Data = constrData anf#44 anf#45 in +let effect#42 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_44 + [(lam anf_45 + [(lam data_41 + [(lam effect_42 + [(lam generated_46 + (force + [[[[[[(force (builtin chooseData)) generated_46] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_41]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_44] anf_45]]) + (force + [[(force (builtin trace)) (con string "fields")] (delay (con bool True))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_44 + [(lam anf_45 + [(lam data_41 + [(lam effect_42 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_44] anf_45]]) + (force + [[(force (builtin trace)) (con string "fields")] (delay (con bool True))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +error: Runtime(ExpectedList(Boolean(true))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_fields_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_fields_used_true.snap new file mode 100644 index 00000000..49cdc6c4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_fields_used_true.snap @@ -0,0 +1,121 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#46 : Data = constrData (trace "tag" in 59) (trace "fields" in true) in +let effect#47 : int = trace "between" in 0 in +case@Data data#46 of + DataConstr pair#48 -> trace "selected" in fstPair pair#48 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_46 + [(lam effect_47 + [(lam generated_49 + (force + [[[[[[(force (builtin chooseData)) generated_49] + (delay + [(lam pair_48 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_48])])) + [(builtin unConstrData) generated_49]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_46]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])] + (force + [[(force (builtin trace)) (con string "fields")] (delay (con bool True))])]]) +--- optimized Core +let anf#4 : int = trace "tag" in 59 in +let anf#5 : bool = trace "fields" in true in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +trace "selected" in anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_11 + [(lam anf_6 + [(lam anf_7 + [(lam data_8 + [(lam effect_9 + [(lam pair_10 (force [[builtin_11 (con string "selected")] (delay anf_6)])) + [(builtin unConstrData) data_8]]) + (force [[builtin_11 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_6] anf_7]]) + (force [[builtin_11 (con string "fields")] (delay (con bool True))])]) + (force [[builtin_11 (con string "tag")] (delay (con integer 59))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#49 : int = trace "tag" in 59 in +let anf#50 : bool = trace "fields" in true in +let data#46 : Data = constrData anf#49 anf#50 in +let effect#47 : int = trace "between" in 0 in +case@Data data#46 of + DataConstr pair#48 -> trace "selected" in fstPair pair#48 +--- isolated folded Core +let anf#49 : int = trace "tag" in 59 in +let anf#50 : bool = trace "fields" in true in +let data#46 : Data = constrData anf#49 anf#50 in +let effect#47 : int = trace "between" in 0 in +let pair#48 : pair int (list Data) = unConstrData data#46 in +trace "selected" in fstPair pair#48 +--- isolated cleaned Core +let anf#49 : int = trace "tag" in 59 in +let anf#50 : bool = trace "fields" in true in +let data#46 : Data = constrData anf#49 anf#50 in +let effect#47 : int = trace "between" in 0 in +let pair#48 : pair int (list Data) = unConstrData data#46 in +trace "selected" in anf#49 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_49 + [(lam anf_50 + [(lam data_46 + [(lam effect_47 + [(lam generated_51 + (force + [[[[[[(force (builtin chooseData)) generated_51] + (delay + [(lam pair_48 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_48])])) + [(builtin unConstrData) generated_51]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_46]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_49] anf_50]]) + (force + [[(force (builtin trace)) (con string "fields")] (delay (con bool True))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_49 + [(lam anf_50 + [(lam data_46 + [(lam effect_47 + [(lam pair_48 + (force [[(force (builtin trace)) (con string "selected")] (delay anf_49)])) + [(builtin unConstrData) data_46]]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_49] anf_50]]) + (force + [[(force (builtin trace)) (con string "fields")] (delay (con bool True))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con integer 59))])]) +--- result +error: Runtime(ExpectedList(Boolean(true))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_tag_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_tag_used_false.snap new file mode 100644 index 00000000..51680524 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_tag_used_false.snap @@ -0,0 +1,113 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#31 : Data = constrData (trace "tag" in true) (trace "fields" in (con (list data) [(I 42)])) in +let effect#32 : int = trace "between" in 0 in +case@Data data#31 of + DataConstr pair#33 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_31 + [(lam effect_32 + [(lam generated_34 + (force + [[[[[[(force (builtin chooseData)) generated_34] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_31]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con bool True))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#4 : bool = trace "tag" in true in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_9 + [(lam anf_3 + [(lam anf_6 + [(lam data_7 + [(lam effect_8 + (force [[builtin_9 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_9 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_3] anf_6]]) + (force [[builtin_9 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_9 (con string "tag")] (delay (con bool True))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#34 : bool = trace "tag" in true in +let anf#35 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#31 : Data = constrData anf#34 anf#35 in +let effect#32 : int = trace "between" in 0 in +case@Data data#31 of + DataConstr pair#33 -> trace "selected" in 9 +--- isolated folded Core +let anf#34 : bool = trace "tag" in true in +let anf#35 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#31 : Data = constrData anf#34 anf#35 in +let effect#32 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#34 : bool = trace "tag" in true in +let anf#35 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#31 : Data = constrData anf#34 anf#35 in +let effect#32 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_34 + [(lam anf_35 + [(lam data_31 + [(lam effect_32 + [(lam generated_36 + (force + [[[[[[(force (builtin chooseData)) generated_36] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_31]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_34] anf_35]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con bool True))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_34 + [(lam anf_35 + [(lam data_31 + [(lam effect_32 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_34] anf_35]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con bool True))])]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_tag_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_tag_used_true.snap new file mode 100644 index 00000000..b649e948 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__constr_wrong_tag_used_true.snap @@ -0,0 +1,124 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#36 : Data = constrData (trace "tag" in true) (trace "fields" in (con (list data) [(I 42)])) in +let effect#37 : int = trace "between" in 0 in +case@Data data#36 of + DataConstr pair#38 -> trace "selected" in fstPair pair#38 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_36 + [(lam effect_37 + [(lam generated_39 + (force + [[[[[[(force (builtin chooseData)) generated_39] + (delay + [(lam pair_38 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_38])])) + [(builtin unConstrData) generated_39]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_36]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) + (force [[(force (builtin trace)) (con string "tag")] (delay (con bool True))])] + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#4 : bool = trace "tag" in true in +let anf#5 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#1 : Data = constrData anf#4 anf#5 in +let effect#2 : int = trace "between" in 0 in +let pair#3 : pair int (list Data) = unConstrData data#1 in +trace "selected" in anf#4 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_11 + [(lam anf_6 + [(lam anf_7 + [(lam data_8 + [(lam effect_9 + [(lam pair_10 (force [[builtin_11 (con string "selected")] (delay anf_6)])) + [(builtin unConstrData) data_8]]) + (force [[builtin_11 (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_6] anf_7]]) + (force [[builtin_11 (con string "fields")] (delay (con (list data) [(I 42)]))])]) + (force [[builtin_11 (con string "tag")] (delay (con bool True))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#39 : bool = trace "tag" in true in +let anf#40 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#36 : Data = constrData anf#39 anf#40 in +let effect#37 : int = trace "between" in 0 in +case@Data data#36 of + DataConstr pair#38 -> trace "selected" in fstPair pair#38 +--- isolated folded Core +let anf#39 : bool = trace "tag" in true in +let anf#40 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#36 : Data = constrData anf#39 anf#40 in +let effect#37 : int = trace "between" in 0 in +let pair#38 : pair int (list Data) = unConstrData data#36 in +trace "selected" in fstPair pair#38 +--- isolated cleaned Core +let anf#39 : bool = trace "tag" in true in +let anf#40 : list Data = trace "fields" in (con (list data) [(I 42)]) in +let data#36 : Data = constrData anf#39 anf#40 in +let effect#37 : int = trace "between" in 0 in +let pair#38 : pair int (list Data) = unConstrData data#36 in +trace "selected" in anf#39 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_39 + [(lam anf_40 + [(lam data_36 + [(lam effect_37 + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] + (delay + [(lam pair_38 + (force + [[(force (builtin trace)) (con string "selected")] + (delay [(force (force (builtin fstPair))) pair_38])])) + [(builtin unConstrData) generated_41]])] + (delay (error))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_36]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_39] anf_40]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con bool True))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_39 + [(lam anf_40 + [(lam data_36 + [(lam effect_37 + [(lam pair_38 + (force [[(force (builtin trace)) (con string "selected")] (delay anf_39)])) + [(builtin unConstrData) data_36]]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [[(builtin constrData) anf_39] anf_40]]) + (force + [[(force (builtin trace)) (con string "fields")] + (delay (con (list data) [(I 42)]))])]) + (force [[(force (builtin trace)) (con string "tag")] (delay (con bool True))])]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +["tag", "fields"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_captured_cold_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_captured_cold_false.snap new file mode 100644 index 00000000..5d8463ef --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_captured_cold_false.snap @@ -0,0 +1,85 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = iData (trace "before" in 42) in +case@Bool false of + True -> 42 + False -> force (delay (case@Data data#1 of + DataI payload#2 -> payload#2)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + (case + (con bool False) + (force + (delay + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (error))])) + data_1])) + (con integer 42))) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]]) +--- optimized Core +let anf#5 : int = trace "before" in 42 in +let data#3 : Data = iData anf#5 in +anf#5 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 [(lam data_2 anf_1) [(builtin iData) anf_1]]) + (force [[builtin_3 (con string "before")] (delay (con integer 42))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#3 : int = trace "before" in 42 in +let data#1 : Data = iData anf#3 in +case@Bool false of + True -> 42 + False -> force (delay (case@Data data#1 of + DataI payload#2 -> payload#2)) +--- isolated folded Core +let anf#3 : int = trace "before" in 42 in +let data#1 : Data = iData anf#3 in +case@Bool false of + True -> 42 + False -> force (delay (let payload#2 : int = anf#3 in + payload#2)) +--- isolated cleaned Core +let anf#3 : int = trace "before" in 42 in +let data#1 : Data = iData anf#3 in +anf#3 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam data_1 + (case + (con bool False) + (force + (delay + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_4]])] + (delay (error))])) + data_1])) + (con integer 42))) + [(builtin iData) anf_3]]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_3 [(lam data_1 anf_3) [(builtin iData) anf_3]]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]) +--- result +(con integer 42) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_captured_cold_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_captured_cold_true.snap new file mode 100644 index 00000000..28f05a6a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_captured_cold_true.snap @@ -0,0 +1,85 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = iData (trace "before" in 42) in +case@Bool true of + True -> 42 + False -> force (delay (case@Data data#1 of + DataI payload#2 -> payload#2)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + (case + (con bool True) + (force + (delay + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (error))])) + data_1])) + (con integer 42))) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]]) +--- optimized Core +let anf#5 : int = trace "before" in 42 in +let data#3 : Data = iData anf#5 in +42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 [(lam data_2 (con integer 42)) [(builtin iData) anf_1]]) + (force [[builtin_3 (con string "before")] (delay (con integer 42))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "before" in 42 in +let data#1 : Data = iData anf#4 in +case@Bool true of + True -> 42 + False -> force (delay (case@Data data#1 of + DataI payload#2 -> payload#2)) +--- isolated folded Core +let anf#4 : int = trace "before" in 42 in +let data#1 : Data = iData anf#4 in +case@Bool true of + True -> 42 + False -> force (delay (let payload#2 : int = anf#4 in + payload#2)) +--- isolated cleaned Core +let anf#4 : int = trace "before" in 42 in +let data#1 : Data = iData anf#4 in +42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam data_1 + (case + (con bool True) + (force + (delay + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_5]])] + (delay (error))])) + data_1])) + (con integer 42))) + [(builtin iData) anf_4]]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 [(lam data_1 (con integer 42)) [(builtin iData) anf_4]]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 42))])]) +--- result +(con integer 42) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_default_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_default_false.snap new file mode 100644 index 00000000..4617eb80 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_default_false.snap @@ -0,0 +1,65 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData (trace "operand" in 42) of + DataList wrong#1 -> trace "wrong" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))] + (delay (error))])) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]]) +--- optimized Core +let anf#3 : int = trace "operand" in 42 in +let anf#4 : Data = iData anf#3 in +error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 [(lam anf_2 (error)) [(builtin iData) anf_1]]) + (force [[builtin_3 (con string "operand")] (delay (con integer 42))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#2 : int = trace "operand" in 42 in +let anf#3 : Data = iData anf#2 in +case@Data anf#3 of + DataList wrong#1 -> trace "wrong" in error +--- isolated folded Core +let anf#2 : int = trace "operand" in 42 in +let anf#3 : Data = iData anf#2 in +error +--- isolated cleaned Core +let anf#2 : int = trace "operand" in 42 in +let anf#3 : Data = iData anf#2 in +error +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))] + (delay (error))])) + anf_3]) + [(builtin iData) anf_2]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 [(lam anf_3 (error)) [(builtin iData) anf_2]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_default_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_default_true.snap new file mode 100644 index 00000000..70a0300b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_default_true.snap @@ -0,0 +1,94 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData (trace "operand" in 42) of + DataList wrong#1 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]]) +--- optimized Core +let anf#3 : int = trace "operand" in 42 in +let anf#4 : Data = iData anf#3 in +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 + [(lam anf_2 + (force [[builtin_3 (con string "fallback")] (delay (con integer 9))])) + [(builtin iData) anf_1]]) + (force [[builtin_3 (con string "operand")] (delay (con integer 42))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "operand" in 42 in +let anf#5 : Data = iData anf#4 in +case@Data anf#5 of + DataList wrong#1 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- isolated folded Core +let anf#4 : int = trace "operand" in 42 in +let anf#5 : Data = iData anf#4 in +trace "fallback" in 9 +--- isolated cleaned Core +let anf#4 : int = trace "operand" in 42 in +let anf#5 : Data = iData anf#4 in +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + anf_5]) + [(builtin iData) anf_4]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) + [(builtin iData) anf_4]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]) +--- result +(con integer 9) +--- logs +["operand", "fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_bool_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_bool_fallback_false.snap new file mode 100644 index 00000000..fcf335ca --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_bool_fallback_false.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData true of + DataI unused#2 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin iData) (con bool True)]]) +--- optimized Core +let anf#2 : Data = iData true in +9 +--- optimized UPLC +(program 1.1.0 [(lam anf_1 (con integer 9)) [(builtin iData) (con bool True)]]) +--- isolated pass +--- isolated ANF input +let anf#3 : Data = iData true in +case@Data anf#3 of + DataI unused#2 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#4 : bool = true in +let anf#3 : Data = iData data_operand#4 in +let unused#2 : bool = data_operand#4 in +9 +--- isolated cleaned Core +let anf#3 : Data = iData true in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_3]) + [(builtin iData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 [(lam anf_3 (con integer 9)) [(builtin iData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_bool_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_bool_fallback_true.snap new file mode 100644 index 00000000..817100d1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_bool_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData true of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin iData) (con bool True)]]) +--- optimized Core +let anf#1 : Data = iData true in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_2 + (force [[builtin_3 (con string "unreachable")] (delay (con integer 0))])) + [(builtin iData) (con bool True)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#6 : Data = iData true in +case@Data anf#6 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#7 : bool = true in +let anf#6 : Data = iData data_operand#7 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#6 : Data = iData true in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_6 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_6]) + [(builtin iData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_6 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin iData) (con bool True)]]) +--- result +error: Runtime(TypeMismatch(Integer, Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_delay_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_delay_fallback_false.snap new file mode 100644 index 00000000..bd69965a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_delay_fallback_false.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData (delay (\x#1 : int -> x#1)) of + DataI unused#14 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin iData) (delay (lam x_1 x_1))]]) +--- optimized Core +let anf#4 : Data = iData (delay (\x#2 : int -> x#2)) in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_3 (con integer 9)) [(builtin iData) (delay (lam x_1 x_1))]]) +--- isolated pass +--- isolated ANF input +let anf#15 : Data = iData (delay (\x#1 : int -> x#1)) in +case@Data anf#15 of + DataI unused#14 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#16 : @delay (int -> int) = delay (\x#1 : int -> x#1) in +let anf#15 : Data = iData data_operand#16 in +let unused#14 : @delay (int -> int) = data_operand#16 in +9 +--- isolated cleaned Core +let anf#15 : Data = iData (delay (\x#1 : int -> x#1)) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_15 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_15]) + [(builtin iData) (delay (lam x_1 x_1))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_15 (con integer 9)) [(builtin iData) (delay (lam x_1 x_1))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_delay_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_delay_fallback_true.snap new file mode 100644 index 00000000..2645e2b9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_delay_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData (delay (\x#1 : int -> x#1)) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin iData) (delay (lam x_1 x_1))]]) +--- optimized Core +let anf#3 : Data = iData (delay (\x#2 : int -> x#2)) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin iData) (delay (lam x_1 x_1))]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#18 : Data = iData (delay (\x#1 : int -> x#1)) in +case@Data anf#18 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#19 : @delay (int -> int) = delay (\x#1 : int -> x#1) in +let anf#18 : Data = iData data_operand#19 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#18 : Data = iData (delay (\x#1 : int -> x#1)) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_18 + [(lam generated_19 + (force + [[[[[[(force (builtin chooseData)) generated_19] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_18]) + [(builtin iData) (delay (lam x_1 x_1))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_18 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin iData) (delay (lam x_1 x_1))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_duplicate.snap new file mode 100644 index 00000000..91635fde --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_duplicate.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 -> 42 + DataI payload#1 -> 42 +--- after +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 -> 42 + DataI payload#1 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_function_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_function_fallback_false.snap new file mode 100644 index 00000000..ea5acfb5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_function_fallback_false.snap @@ -0,0 +1,73 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData (\x#1 : int -> x#1) of + DataI unused#8 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin iData) (lam x_1 x_1)]]) +--- optimized Core +let anf#4 : Data = iData (\x#2 : int -> x#2) in +9 +--- optimized UPLC +(program 1.1.0 [(lam anf_3 (con integer 9)) [(builtin iData) (lam x_1 x_1)]]) +--- isolated pass +--- isolated ANF input +let anf#9 : Data = iData (\x#1 : int -> x#1) in +case@Data anf#9 of + DataI unused#8 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#10 : int -> int = \x#1 : int -> x#1 in +let anf#9 : Data = iData data_operand#10 in +let unused#8 : int -> int = data_operand#10 in +9 +--- isolated cleaned Core +let anf#9 : Data = iData (\x#1 : int -> x#1) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_9 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_9]) + [(builtin iData) (lam x_1 x_1)]]) +--- isolated UPLC after +(program 1.1.0 [(lam anf_9 (con integer 9)) [(builtin iData) (lam x_1 x_1)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_function_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_function_fallback_true.snap new file mode 100644 index 00000000..6f72595d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_function_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData (\x#1 : int -> x#1) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin iData) (lam x_1 x_1)]]) +--- optimized Core +let anf#3 : Data = iData (\x#2 : int -> x#2) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin iData) (lam x_1 x_1)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#12 : Data = iData (\x#1 : int -> x#1) in +case@Data anf#12 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#13 : int -> int = \x#1 : int -> x#1 in +let anf#12 : Data = iData data_operand#13 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#12 : Data = iData (\x#1 : int -> x#1) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_12]) + [(builtin iData) (lam x_1 x_1)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin iData) (lam x_1 x_1)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_selected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_selected_arity.snap new file mode 100644 index 00000000..e4fc9fc5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_selected_arity.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 payload#1 -> 0 +--- after +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 payload#1 -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_unselected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_unselected_arity.snap new file mode 100644 index 00000000..3acdcb34 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_unselected_arity.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 -> 42 + DataList -> 0 +--- after +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 -> 42 + DataList -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_wrong_test.snap new file mode 100644 index 00000000..11def591 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_invalid_wrong_test.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 -> 42 + True -> 0 +--- after +let data#2 : Data = iData 42 in +case@Data data#2 of + DataI payload#1 -> 42 + True -> 0 +--- errors +InvalidCase("non-Data test") +InvalidCase("non-Data test") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_overapplied.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_overapplied.snap new file mode 100644 index 00000000..abb6c013 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_overapplied.snap @@ -0,0 +1,81 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData 42 0 of + DataI payload#1 -> payload#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (error))])) + [[(builtin iData) (con integer 42)] (con integer 0)]]) +--- optimized Core +let anf#3 : Data = iData 42 in +let anf#4 : Data = anf#3 0 in +case@Data anf#4 of + DataI payload#2 -> payload#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_8 + [(lam anf_1 + [(lam anf_5 + [(lam generated_7 + (force + [[[[[[builtin_8 generated_7] (delay (error))] (delay (error))] (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unIData) generated_7]])] + (delay (error))])) + anf_5]) + [anf_1 (con integer 0)]]) + [(builtin iData) (con integer 42)]]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#2 : Data = iData 42 in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataI payload#1 -> payload#1 +--- isolated folded Core +let anf#2 : Data = iData 42 in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataI payload#1 -> payload#1 +--- isolated cleaned Core +let anf#2 : Data = iData 42 in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataI payload#1 -> payload#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_4]])] + (delay (error))])) + anf_3]) + [anf_2 (con integer 0)]]) + [(builtin iData) (con integer 42)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_4]])] + (delay (error))])) + anf_3]) + [anf_2 (con integer 0)]]) + [(builtin iData) (con integer 42)]]) +--- result +error: NonFunctionApplication(Con(Integer(0)), Con(Data(Integer(42)))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_parameter_false.snap new file mode 100644 index 00000000..6825f8b1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_parameter_false.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData 42 of + DataI payload#2 -> payload#2 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_3]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [(builtin iData) (con integer 42)]]) +--- optimized Core +let anf#2 : Data = iData 42 in +42 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 42)) [(builtin iData) (con integer 42)]]) +--- isolated pass +--- isolated ANF input +let anf#3 : Data = iData 42 in +case@Data anf#3 of + DataI payload#2 -> payload#2 + _ -> trace "cold" in error +--- isolated folded Core +let data_operand#4 : int = 42 in +let anf#3 : Data = iData data_operand#4 in +let payload#2 : int = data_operand#4 in +payload#2 +--- isolated cleaned Core +let anf#3 : Data = iData 42 in +42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_2 payload_2) [(builtin unIData) generated_4]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_3]) + [(builtin iData) (con integer 42)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_3 (con integer 42)) [(builtin iData) (con integer 42)]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_parameter_true.snap new file mode 100644 index 00000000..55e13f6c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_parameter_true.snap @@ -0,0 +1,62 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\input#5 : int -> case@Data iData input#5 of + DataI payload#6 -> payload#6 + _ -> trace "cold" in error) 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam input_5 + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_6 payload_6) [(builtin unIData) generated_7]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [(builtin iData) input_5]]) + (con integer 42)]) +--- optimized Core +let anf#3 : Data = iData 42 in +42 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 42)) [(builtin iData) (con integer 42)]]) +--- isolated pass +--- isolated ANF input +(\input#5 : int -> let anf#7 : Data = iData input#5 in +case@Data anf#7 of + DataI payload#6 -> payload#6 + _ -> trace "cold" in error) 42 +--- isolated folded Core +(\input#5 : int -> let anf#7 : Data = iData input#5 in +let payload#6 : int = input#5 in +payload#6) 42 +--- isolated cleaned Core +let anf#7 : Data = iData 42 in +42 +--- isolated UPLC before +(program 1.1.0 + [(lam input_5 + [(lam anf_7 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_6 payload_6) [(builtin unIData) generated_8]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_7]) + [(builtin iData) input_5]]) + (con integer 42)]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_7 (con integer 42)) [(builtin iData) (con integer 42)]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_partial.snap new file mode 100644 index 00000000..288db772 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_partial.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data iData of + DataI payload#1 -> payload#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (builtin iData)]) +--- optimized Core +case@Data iData of + DataI payload#2 -> payload#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam generated_2 + (force + [[[[[[builtin_3 generated_2] (delay (error))] (delay (error))] (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (builtin iData)]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +case@Data iData of + DataI payload#1 -> payload#1 +--- isolated folded Core +case@Data iData of + DataI payload#1 -> payload#1 +--- isolated cleaned Core +case@Data iData of + DataI payload#1 -> payload#1 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (builtin iData)]) +--- isolated UPLC after +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (builtin iData)]) +--- result +error: NotAConstant(Builtin(Runtime { args: [], fun: IData, forces: 0 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_shared_escape.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_shared_escape.snap new file mode 100644 index 00000000..c11eab97 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_shared_escape.snap @@ -0,0 +1,98 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = iData (trace "once" in 42) in +let alias#2 : Data = data#1 in +constr 0 data#1 (case@Data alias#2 of + DataI payload#3 -> payload#3) (case@Data alias#2 of + DataI payload#4 -> payload#4) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + [(lam alias_2 + (constr 0 + data_1 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_3 payload_3) [(builtin unIData) generated_5]])] + (delay (error))])) + alias_2] + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unIData) generated_6]])] + (delay (error))])) + alias_2])) + data_1]) + [(builtin iData) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 42))])]]) +--- optimized Core +let anf#9 : int = trace "once" in 42 in +let data#5 : Data = iData anf#9 in +constr 0 data#5 anf#9 anf#9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_1 [(lam data_2 (constr 0 data_2 anf_1 anf_1)) [(builtin iData) anf_1]]) + (force [[builtin_3 (con string "once")] (delay (con integer 42))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#5 : int = trace "once" in 42 in +let data#1 : Data = iData anf#5 in +let alias#2 : Data = data#1 in +let anf#6 : int = case@Data alias#2 of + DataI payload#3 -> payload#3 in +let anf#7 : int = case@Data alias#2 of + DataI payload#4 -> payload#4 in +constr 0 data#1 anf#6 anf#7 +--- isolated folded Core +let anf#5 : int = trace "once" in 42 in +let data#1 : Data = iData anf#5 in +let alias#2 : Data = data#1 in +let anf#6 : int = let payload#3 : int = anf#5 in +payload#3 in +let anf#7 : int = let payload#4 : int = anf#5 in +payload#4 in +constr 0 data#1 anf#6 anf#7 +--- isolated cleaned Core +let anf#5 : int = trace "once" in 42 in +let data#1 : Data = iData anf#5 in +constr 0 data#1 anf#5 anf#5 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_5 + [(lam data_1 + [(lam alias_2 + [(lam anf_6 + [(lam anf_7 (constr 0 data_1 anf_6 anf_7)) + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unIData) generated_8]])] + (delay (error))])) + alias_2]]) + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_3 payload_3) [(builtin unIData) generated_9]])] + (delay (error))])) + alias_2]]) + data_1]) + [(builtin iData) anf_5]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_5 [(lam data_1 (constr 0 data_1 anf_5 anf_5)) [(builtin iData) anf_5]]) + (force [[(force (builtin trace)) (con string "once")] (delay (con integer 42))])]) +--- result +(constr 0 (con data (I 42)) (con integer 42) (con integer 42)) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_strict_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_strict_failure_false.snap new file mode 100644 index 00000000..c9539234 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_strict_failure_false.snap @@ -0,0 +1,96 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = iData (trace "operand" in 42) in +let effect#3 : int = trace "between" in 0 in +case@Data data#1 of + DataI payload#2 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + [(lam effect_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))])) + data_1]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin iData) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]]) +--- optimized Core +let anf#7 : int = trace "operand" in 42 in +let data#4 : Data = iData anf#7 in +let effect#5 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam anf_1 + [(lam data_2 + [(lam effect_3 + (force [[builtin_4 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_4 (con string "between")] (delay (con integer 0))])]) + [(builtin iData) anf_1]]) + (force [[builtin_4 (con string "operand")] (delay (con integer 42))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "operand" in 42 in +let data#1 : Data = iData anf#4 in +let effect#3 : int = trace "between" in 0 in +case@Data data#1 of + DataI payload#2 -> trace "selected" in 9 +--- isolated folded Core +let anf#4 : int = trace "operand" in 42 in +let data#1 : Data = iData anf#4 in +let effect#3 : int = trace "between" in 0 in +let payload#2 : int = anf#4 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#4 : int = trace "operand" in 42 in +let data#1 : Data = iData anf#4 in +let effect#3 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam data_1 + [(lam effect_3 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))])) + data_1]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin iData) anf_4]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam data_1 + [(lam effect_3 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin iData) anf_4]]) + (force + [[(force (builtin trace)) (con string "operand")] (delay (con integer 42))])]) +--- result +(con integer 9) +--- logs +["operand", "between", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_strict_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_strict_failure_true.snap new file mode 100644 index 00000000..9e1bb5e9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_strict_failure_true.snap @@ -0,0 +1,93 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#5 : Data = iData (trace "operand" in error) in +let effect#7 : int = trace "between" in 0 in +case@Data data#5 of + DataI payload#6 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_5 + [(lam effect_7 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))])) + data_5]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin iData) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]]) +--- optimized Core +let anf#4 : int = trace "operand" in error in +let data#1 : Data = iData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin iData) anf_3]]) + (force [[builtin_7 (con string "operand")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#8 : int = trace "operand" in error in +let data#5 : Data = iData anf#8 in +let effect#7 : int = trace "between" in 0 in +case@Data data#5 of + DataI payload#6 -> trace "selected" in 9 +--- isolated folded Core +let anf#8 : int = trace "operand" in error in +let data#5 : Data = iData anf#8 in +let effect#7 : int = trace "between" in 0 in +let payload#6 : int = anf#8 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#8 : int = trace "operand" in error in +let data#5 : Data = iData anf#8 in +let effect#7 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam data_5 + [(lam effect_7 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))])) + data_5]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin iData) anf_8]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 + [(lam data_5 + [(lam effect_7 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin iData) anf_8]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_traced.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_traced.snap new file mode 100644 index 00000000..df416889 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__integer_traced.snap @@ -0,0 +1,80 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (trace "producer" in iData 42) of + DataI payload#1 -> payload#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin iData) (con integer 42)])])]) +--- optimized Core +let anf#3 : Data = trace "producer" in iData 42 in +case@Data anf#3 of + DataI payload#2 -> payload#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam builtin_7 + [(lam anf_1 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] (delay (error))] (delay (error))] (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unIData) generated_5]])] + (delay (error))])) + anf_1]) + (force + [[builtin_7 (con string "producer")] (delay [(builtin iData) (con integer 42)])])]) + (force (builtin trace))]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#4 : Data = trace "producer" in iData 42 in +case@Data anf#4 of + DataI payload#1 -> payload#1 +--- isolated folded Core +let anf#4 : Data = trace "producer" in iData 42 in +case@Data anf#4 of + DataI payload#1 -> payload#1 +--- isolated cleaned Core +let anf#4 : Data = trace "producer" in iData 42 in +case@Data anf#4 of + DataI payload#1 -> payload#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_5]])] + (delay (error))])) + anf_4]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin iData) (con integer 42)])])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_1 payload_1) [(builtin unIData) generated_5]])] + (delay (error))])) + anf_4]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin iData) (con integer 42)])])]) +--- result +(con integer 42) +--- logs +["producer"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_captured_cold_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_captured_cold_false.snap new file mode 100644 index 00000000..35efab7f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_captured_cold_false.snap @@ -0,0 +1,88 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#9 : Data = listData (trace "before" in (con (list data) [(I 42)])) in +case@Bool false of + True -> (con (list data) [(I 42)]) + False -> force (delay (case@Data data#9 of + DataList payload#10 -> payload#10)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_9 + (case + (con bool False) + (force + (delay + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] (delay (error))] (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unListData) generated_11]])] + (delay (error))] + (delay (error))])) + data_9])) + (con (list data) [(I 42)]))) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#3 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#1 : Data = listData anf#3 in +anf#3 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 [(lam data_4 anf_2) [(builtin listData) anf_2]]) + (force [[builtin_5 (con string "before")] (delay (con (list data) [(I 42)]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#11 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#9 : Data = listData anf#11 in +case@Bool false of + True -> (con (list data) [(I 42)]) + False -> force (delay (case@Data data#9 of + DataList payload#10 -> payload#10)) +--- isolated folded Core +let anf#11 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#9 : Data = listData anf#11 in +case@Bool false of + True -> (con (list data) [(I 42)]) + False -> force (delay (let payload#10 : list Data = anf#11 in + payload#10)) +--- isolated cleaned Core +let anf#11 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#9 : Data = listData anf#11 in +anf#11 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_11 + [(lam data_9 + (case + (con bool False) + (force + (delay + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unListData) generated_12]])] + (delay (error))] + (delay (error))])) + data_9])) + (con (list data) [(I 42)]))) + [(builtin listData) anf_11]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con (list data) [(I 42)]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_11 [(lam data_9 anf_11) [(builtin listData) anf_11]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con (list data) [(I 42)]))])]) +--- result +(con (list data) [(I 42)]) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_captured_cold_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_captured_cold_true.snap new file mode 100644 index 00000000..093db5b3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_captured_cold_true.snap @@ -0,0 +1,89 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#9 : Data = listData (trace "before" in (con (list data) [(I 42)])) in +case@Bool true of + True -> (con (list data) [(I 42)]) + False -> force (delay (case@Data data#9 of + DataList payload#10 -> payload#10)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_9 + (case + (con bool True) + (force + (delay + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] (delay (error))] (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unListData) generated_11]])] + (delay (error))] + (delay (error))])) + data_9])) + (con (list data) [(I 42)]))) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#3 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#1 : Data = listData anf#3 in +(con (list data) [(I 42)]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 [(lam data_4 (con (list data) [(I 42)])) [(builtin listData) anf_2]]) + (force [[builtin_5 (con string "before")] (delay (con (list data) [(I 42)]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#12 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#9 : Data = listData anf#12 in +case@Bool true of + True -> (con (list data) [(I 42)]) + False -> force (delay (case@Data data#9 of + DataList payload#10 -> payload#10)) +--- isolated folded Core +let anf#12 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#9 : Data = listData anf#12 in +case@Bool true of + True -> (con (list data) [(I 42)]) + False -> force (delay (let payload#10 : list Data = anf#12 in + payload#10)) +--- isolated cleaned Core +let anf#12 : list Data = trace "before" in (con (list data) [(I 42)]) in +let data#9 : Data = listData anf#12 in +(con (list data) [(I 42)]) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam data_9 + (case + (con bool True) + (force + (delay + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] (delay (error))] (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unListData) generated_13]])] + (delay (error))] + (delay (error))])) + data_9])) + (con (list data) [(I 42)]))) + [(builtin listData) anf_12]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con (list data) [(I 42)]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 + [(lam data_9 (con (list data) [(I 42)])) [(builtin listData) anf_12]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay (con (list data) [(I 42)]))])]) +--- result +(con (list data) [(I 42)]) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_cons_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_cons_used_false.snap new file mode 100644 index 00000000..1a65d42f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_cons_used_false.snap @@ -0,0 +1,63 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (mkCons (con data (I 42)) (con (list data) [])) of + DataList payload#19 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_20 + (force + [[[[[[(force (builtin chooseData)) generated_20] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) + [[(force (builtin mkCons)) (con data (I 42))] (con (list data) [])]]]) +--- optimized Core +let anf#2 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#3 : Data = listData anf#2 in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 [(lam anf_4 (con (list data) [])) [(builtin listData) anf_1]]) + [[builtin_5 (con data (I 42))] (con (list data) [])]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#20 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#21 : Data = listData anf#20 in +case@Data anf#21 of + DataList payload#19 -> (con (list data) []) +--- isolated folded Core +let anf#20 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#21 : Data = listData anf#20 in +let payload#19 : list Data = anf#20 in +(con (list data) []) +--- isolated cleaned Core +let anf#20 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#21 : Data = listData anf#20 in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_20 + [(lam anf_21 + [(lam generated_22 + (force + [[[[[[(force (builtin chooseData)) generated_22] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_21]) + [(builtin listData) anf_20]]) + [[(force (builtin mkCons)) (con data (I 42))] (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_20 [(lam anf_21 (con (list data) [])) [(builtin listData) anf_20]]) + [[(force (builtin mkCons)) (con data (I 42))] (con (list data) [])]]) +--- result +(con (list data) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_cons_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_cons_used_true.snap new file mode 100644 index 00000000..68593863 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_cons_used_true.snap @@ -0,0 +1,63 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (mkCons (con data (I 42)) (con (list data) [])) of + DataList payload#22 -> payload#22 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_23 + (force + [[[[[[(force (builtin chooseData)) generated_23] (delay (error))] (delay (error))] + (delay [(lam payload_22 payload_22) [(builtin unListData) generated_23]])] + (delay (error))] + (delay (error))])) + [(builtin listData) + [[(force (builtin mkCons)) (con data (I 42))] (con (list data) [])]]]) +--- optimized Core +let anf#2 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#3 : Data = listData anf#2 in +anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 [(lam anf_4 anf_1) [(builtin listData) anf_1]]) + [[builtin_5 (con data (I 42))] (con (list data) [])]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#23 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#24 : Data = listData anf#23 in +case@Data anf#24 of + DataList payload#22 -> payload#22 +--- isolated folded Core +let anf#23 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#24 : Data = listData anf#23 in +let payload#22 : list Data = anf#23 in +payload#22 +--- isolated cleaned Core +let anf#23 : list Data = mkCons (con data (I 42)) (con (list data) []) in +let anf#24 : Data = listData anf#23 in +anf#23 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_23 + [(lam anf_24 + [(lam generated_25 + (force + [[[[[[(force (builtin chooseData)) generated_25] (delay (error))] (delay (error))] + (delay [(lam payload_22 payload_22) [(builtin unListData) generated_25]])] + (delay (error))] + (delay (error))])) + anf_24]) + [(builtin listData) anf_23]]) + [[(force (builtin mkCons)) (con data (I 42))] (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_23 [(lam anf_24 anf_23) [(builtin listData) anf_23]]) + [[(force (builtin mkCons)) (con data (I 42))] (con (list data) [])]]) +--- result +(con (list data) [(I 42)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_default_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_default_false.snap new file mode 100644 index 00000000..acbb29ec --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_default_false.snap @@ -0,0 +1,68 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (trace "operand" in (con (list data) [(I 42)])) of + DataI wrong#11 -> trace "wrong" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))])) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#2 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#3 : Data = listData anf#2 in +error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 [(lam anf_4 (error)) [(builtin listData) anf_1]]) + (force [[builtin_5 (con string "operand")] (delay (con (list data) [(I 42)]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#12 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#13 : Data = listData anf#12 in +case@Data anf#13 of + DataI wrong#11 -> trace "wrong" in error +--- isolated folded Core +let anf#12 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#13 : Data = listData anf#12 in +error +--- isolated cleaned Core +let anf#12 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#13 : Data = listData anf#12 in +error +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam anf_13 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] (delay (error))] + (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))])) + anf_13]) + [(builtin listData) anf_12]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 [(lam anf_13 (error)) [(builtin listData) anf_12]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_default_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_default_true.snap new file mode 100644 index 00000000..d48611af --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_default_true.snap @@ -0,0 +1,97 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (trace "operand" in (con (list data) [(I 42)])) of + DataI wrong#11 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#2 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#3 : Data = listData anf#2 in +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_4 + (force [[builtin_5 (con string "fallback")] (delay (con integer 9))])) + [(builtin listData) anf_1]]) + (force [[builtin_5 (con string "operand")] (delay (con (list data) [(I 42)]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#14 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#15 : Data = listData anf#14 in +case@Data anf#15 of + DataI wrong#11 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- isolated folded Core +let anf#14 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#15 : Data = listData anf#14 in +trace "fallback" in 9 +--- isolated cleaned Core +let anf#14 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let anf#15 : Data = listData anf#14 in +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_14 + [(lam anf_15 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + anf_15]) + [(builtin listData) anf_14]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_14 + [(lam anf_15 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) + [(builtin listData) anf_14]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]) +--- result +(con integer 9) +--- logs +["operand", "fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_empty_used_false.snap new file mode 100644 index 00000000..daab501a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_empty_used_false.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list data) []) of + DataList payload#13 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list data) [])]]) +--- optimized Core +let anf#2 : Data = listData (con (list data) []) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) [(builtin listData) (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#14 : Data = listData (con (list data) []) in +case@Data anf#14 of + DataList payload#13 -> (con (list data) []) +--- isolated folded Core +let data_operand#15 : list Data = (con (list data) []) in +let anf#14 : Data = listData data_operand#15 in +let payload#13 : list Data = data_operand#15 in +(con (list data) []) +--- isolated cleaned Core +let anf#14 : Data = listData (con (list data) []) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_14 + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_14]) + [(builtin listData) (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_14 (con (list data) [])) [(builtin listData) (con (list data) [])]]) +--- result +(con (list data) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_empty_used_true.snap new file mode 100644 index 00000000..ef4f7bde --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_empty_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list data) []) of + DataList payload#16 -> payload#16 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] (delay (error))] (delay (error))] + (delay [(lam payload_16 payload_16) [(builtin unListData) generated_17]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list data) [])]]) +--- optimized Core +let data_operand#3 : list Data = (con (list data) []) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list data) [])]) +--- isolated pass +--- isolated ANF input +let anf#17 : Data = listData (con (list data) []) in +case@Data anf#17 of + DataList payload#16 -> payload#16 +--- isolated folded Core +let data_operand#18 : list Data = (con (list data) []) in +let anf#17 : Data = listData data_operand#18 in +let payload#16 : list Data = data_operand#18 in +payload#16 +--- isolated cleaned Core +let data_operand#18 : list Data = (con (list data) []) in +let anf#17 : Data = listData data_operand#18 in +data_operand#18 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_17 + [(lam generated_18 + (force + [[[[[[(force (builtin chooseData)) generated_18] (delay (error))] (delay (error))] + (delay [(lam payload_16 payload_16) [(builtin unListData) generated_18]])] + (delay (error))] + (delay (error))])) + anf_17]) + [(builtin listData) (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_18 + [(lam anf_17 data_operand_18) [(builtin listData) data_operand_18]]) + (con (list data) [])]) +--- result +(con (list data) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_bool_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_bool_fallback_false.snap new file mode 100644 index 00000000..0460d811 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_bool_fallback_false.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData true of + DataList unused#40 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin listData) (con bool True)]]) +--- optimized Core +let anf#2 : Data = listData true in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 9)) [(builtin listData) (con bool True)]]) +--- isolated pass +--- isolated ANF input +let anf#41 : Data = listData true in +case@Data anf#41 of + DataList unused#40 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#42 : bool = true in +let anf#41 : Data = listData data_operand#42 in +let unused#40 : bool = data_operand#42 in +9 +--- isolated cleaned Core +let anf#41 : Data = listData true in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_41 + [(lam generated_42 + (force + [[[[[[(force (builtin chooseData)) generated_42] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_41]) + [(builtin listData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_41 (con integer 9)) [(builtin listData) (con bool True)]]) +--- result +error: Runtime(ExpectedList(Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_bool_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_bool_fallback_true.snap new file mode 100644 index 00000000..97f2e901 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_bool_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData true of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin listData) (con bool True)]]) +--- optimized Core +let anf#1 : Data = listData true in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_2 + (force [[builtin_3 (con string "unreachable")] (delay (con integer 0))])) + [(builtin listData) (con bool True)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#44 : Data = listData true in +case@Data anf#44 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#45 : bool = true in +let anf#44 : Data = listData data_operand#45 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#44 : Data = listData true in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_44 + [(lam generated_45 + (force + [[[[[[(force (builtin chooseData)) generated_45] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_44]) + [(builtin listData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_44 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin listData) (con bool True)]]) +--- result +error: Runtime(ExpectedList(Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_delay_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_delay_fallback_false.snap new file mode 100644 index 00000000..03959a35 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_delay_fallback_false.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (delay (\x#39 : int -> x#39)) of + DataList unused#52 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_53 + (force + [[[[[[(force (builtin chooseData)) generated_53] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin listData) (delay (lam x_39 x_39))]]) +--- optimized Core +let anf#3 : Data = listData (delay (\x#1 : int -> x#1)) in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_4 (con integer 9)) [(builtin listData) (delay (lam x_2 x_2))]]) +--- isolated pass +--- isolated ANF input +let anf#53 : Data = listData (delay (\x#39 : int -> x#39)) in +case@Data anf#53 of + DataList unused#52 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#54 : @delay (int -> int) = delay (\x#39 : int -> x#39) in +let anf#53 : Data = listData data_operand#54 in +let unused#52 : @delay (int -> int) = data_operand#54 in +9 +--- isolated cleaned Core +let anf#53 : Data = listData (delay (\x#39 : int -> x#39)) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_53 + [(lam generated_54 + (force + [[[[[[(force (builtin chooseData)) generated_54] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_53]) + [(builtin listData) (delay (lam x_39 x_39))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_53 (con integer 9)) [(builtin listData) (delay (lam x_39 x_39))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_delay_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_delay_fallback_true.snap new file mode 100644 index 00000000..7e392592 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_delay_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (delay (\x#39 : int -> x#39)) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_40 + (force + [[[[[[(force (builtin chooseData)) generated_40] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin listData) (delay (lam x_39 x_39))]]) +--- optimized Core +let anf#2 : Data = listData (delay (\x#1 : int -> x#1)) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin listData) (delay (lam x_3 x_3))]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#56 : Data = listData (delay (\x#39 : int -> x#39)) in +case@Data anf#56 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#57 : @delay (int -> int) = delay (\x#39 : int -> x#39) in +let anf#56 : Data = listData data_operand#57 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#56 : Data = listData (delay (\x#39 : int -> x#39)) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_56 + [(lam generated_57 + (force + [[[[[[(force (builtin chooseData)) generated_57] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_56]) + [(builtin listData) (delay (lam x_39 x_39))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_56 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin listData) (delay (lam x_39 x_39))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_duplicate.snap new file mode 100644 index 00000000..0c986377 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_duplicate.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 -> 42 + DataList payload#5 -> 42 +--- after +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 -> 42 + DataList payload#5 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_function_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_function_fallback_false.snap new file mode 100644 index 00000000..acb84d5d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_function_fallback_false.snap @@ -0,0 +1,74 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (\x#39 : int -> x#39) of + DataList unused#46 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_47 + (force + [[[[[[(force (builtin chooseData)) generated_47] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin listData) (lam x_39 x_39)]]) +--- optimized Core +let anf#3 : Data = listData (\x#1 : int -> x#1) in +9 +--- optimized UPLC +(program 1.1.0 [(lam anf_4 (con integer 9)) [(builtin listData) (lam x_2 x_2)]]) +--- isolated pass +--- isolated ANF input +let anf#47 : Data = listData (\x#39 : int -> x#39) in +case@Data anf#47 of + DataList unused#46 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#48 : int -> int = \x#39 : int -> x#39 in +let anf#47 : Data = listData data_operand#48 in +let unused#46 : int -> int = data_operand#48 in +9 +--- isolated cleaned Core +let anf#47 : Data = listData (\x#39 : int -> x#39) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_47 + [(lam generated_48 + (force + [[[[[[(force (builtin chooseData)) generated_48] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_47]) + [(builtin listData) (lam x_39 x_39)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_47 (con integer 9)) [(builtin listData) (lam x_39 x_39)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_function_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_function_fallback_true.snap new file mode 100644 index 00000000..5ae9dd96 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_function_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (\x#39 : int -> x#39) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_40 + (force + [[[[[[(force (builtin chooseData)) generated_40] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin listData) (lam x_39 x_39)]]) +--- optimized Core +let anf#2 : Data = listData (\x#1 : int -> x#1) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin listData) (lam x_3 x_3)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#50 : Data = listData (\x#39 : int -> x#39) in +case@Data anf#50 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#51 : int -> int = \x#39 : int -> x#39 in +let anf#50 : Data = listData data_operand#51 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#50 : Data = listData (\x#39 : int -> x#39) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_50 + [(lam generated_51 + (force + [[[[[[(force (builtin chooseData)) generated_51] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_50]) + [(builtin listData) (lam x_39 x_39)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_50 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin listData) (lam x_39 x_39)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_selected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_selected_arity.snap new file mode 100644 index 00000000..381bf9f8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_selected_arity.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 payload#5 -> 0 +--- after +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 payload#5 -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_unselected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_unselected_arity.snap new file mode 100644 index 00000000..99af1480 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_unselected_arity.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 -> 42 + DataI -> 0 +--- after +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 -> 42 + DataI -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_wrong_test.snap new file mode 100644 index 00000000..13cea318 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_invalid_wrong_test.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 -> 42 + True -> 0 +--- after +let data#6 : Data = listData (con (list data) [(I 42)]) in +case@Data data#6 of + DataList payload#5 -> 42 + True -> 0 +--- errors +InvalidCase("non-Data test") +InvalidCase("non-Data test") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_nested_returned_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_nested_returned_function.snap new file mode 100644 index 00000000..ec44d621 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_nested_returned_function.snap @@ -0,0 +1,100 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(case@Data listData (con (list data) [(I 42)]) of + DataList outer#1 -> case@Data listData outer#1 of + DataList inner#2 -> \x#3 : int -> constr 0 inner#2 x#3) 7 +--- unoptimized UPLC +(program 1.1.0 + [[(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay + [(lam outer_1 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay + [(lam inner_2 (lam x_3 (constr 0 inner_2 x_3))) + [(builtin unListData) generated_5]])] + (delay (error))] + (delay (error))])) + [(builtin listData) outer_1]]) + [(builtin unListData) generated_4]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list data) [(I 42)])]] + (con integer 7)]) +--- optimized Core +let data_operand#10 : list Data = (con (list data) [(I 42)]) in +let anf#7 : Data = listData data_operand#10 in +let anf#8 : Data = listData data_operand#10 in +constr 0 data_operand#10 7 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_2 + [(lam anf_3 (constr 0 data_operand_1 (con integer 7))) + [(builtin listData) data_operand_1]]) + [(builtin listData) data_operand_1]]) + (con (list data) [(I 42)])]) +--- isolated pass +--- isolated ANF input +let anf#4 : Data = listData (con (list data) [(I 42)]) in +let anf#6 : int -> 'erased = case@Data anf#4 of + DataList outer#1 -> let anf#5 : Data = listData outer#1 in + case@Data anf#5 of + DataList inner#2 -> \x#3 : int -> constr 0 inner#2 x#3 in +anf#6 7 +--- isolated folded Core +let data_operand#7 : list Data = (con (list data) [(I 42)]) in +let anf#4 : Data = listData data_operand#7 in +let anf#6 : int -> 'erased = let outer#1 : list Data = data_operand#7 in +let anf#5 : Data = listData outer#1 in +let inner#2 : list Data = outer#1 in +\x#3 : int -> constr 0 inner#2 x#3 in +anf#6 7 +--- isolated cleaned Core +let data_operand#7 : list Data = (con (list data) [(I 42)]) in +let anf#4 : Data = listData data_operand#7 in +let anf#5 : Data = listData data_operand#7 in +constr 0 data_operand#7 7 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_6 [anf_6 (con integer 7)]) + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay + [(lam outer_1 + [(lam anf_5 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay + [(lam inner_2 (lam x_3 (constr 0 inner_2 x_3))) + [(builtin unListData) generated_8]])] + (delay (error))] + (delay (error))])) + anf_5]) + [(builtin listData) outer_1]]) + [(builtin unListData) generated_7]])] + (delay (error))] + (delay (error))])) + anf_4]]) + [(builtin listData) (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_7 + [(lam anf_4 + [(lam anf_5 (constr 0 data_operand_7 (con integer 7))) + [(builtin listData) data_operand_7]]) + [(builtin listData) data_operand_7]]) + (con (list data) [(I 42)])]) +--- result +(constr 0 (con (list data) [(I 42)]) (con integer 7)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_empty_used_false.snap new file mode 100644 index 00000000..f5ee1e53 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_empty_used_false.snap @@ -0,0 +1,55 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data data)) []) of + DataList payload#1 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data data)) [])]]) +--- optimized Core +let anf#3 : Data = listData (con (list (pair data data)) []) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) + [(builtin listData) (con (list (pair data data)) [])]]) +--- isolated pass +--- isolated ANF input +let anf#2 : Data = listData (con (list (pair data data)) []) in +case@Data anf#2 of + DataList payload#1 -> (con (list data) []) +--- isolated folded Core +let data_operand#3 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#2 : Data = listData data_operand#3 in +let payload#1 : list Data = data_operand#3 in +(con (list data) []) +--- isolated cleaned Core +let anf#2 : Data = listData (con (list (pair data data)) []) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 + [(lam generated_3 + (force + [[[[[[(force (builtin chooseData)) generated_3] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_2]) + [(builtin listData) (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 (con (list data) [])) + [(builtin listData) (con (list (pair data data)) [])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Data), []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_empty_used_true.snap new file mode 100644 index 00000000..82cadbaa --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_empty_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data data)) []) of + DataList payload#4 -> payload#4 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unListData) generated_5]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data data)) [])]]) +--- optimized Core +let data_operand#3 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list (pair data data)) [])]) +--- isolated pass +--- isolated ANF input +let anf#5 : Data = listData (con (list (pair data data)) []) in +case@Data anf#5 of + DataList payload#4 -> payload#4 +--- isolated folded Core +let data_operand#6 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#5 : Data = listData data_operand#6 in +let payload#4 : list Data = data_operand#6 in +payload#4 +--- isolated cleaned Core +let data_operand#6 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#5 : Data = listData data_operand#6 in +data_operand#6 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_5 + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unListData) generated_6]])] + (delay (error))] + (delay (error))])) + anf_5]) + [(builtin listData) (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_6 + [(lam anf_5 data_operand_6) [(builtin listData) data_operand_6]]) + (con (list (pair data data)) [])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Data), []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_items_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_items_used_false.snap new file mode 100644 index 00000000..98cc180b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_items_used_false.snap @@ -0,0 +1,55 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data data)) [((I 42), (I 42))]) of + DataList payload#7 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data data)) [((I 42), (I 42))])]]) +--- optimized Core +let anf#2 : Data = listData (con (list (pair data data)) [((I 42), (I 42))]) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) + [(builtin listData) (con (list (pair data data)) [((I 42), (I 42))])]]) +--- isolated pass +--- isolated ANF input +let anf#8 : Data = listData (con (list (pair data data)) [((I 42), (I 42))]) in +case@Data anf#8 of + DataList payload#7 -> (con (list data) []) +--- isolated folded Core +let data_operand#9 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42))]) in +let anf#8 : Data = listData data_operand#9 in +let payload#7 : list Data = data_operand#9 in +(con (list data) []) +--- isolated cleaned Core +let anf#8 : Data = listData (con (list (pair data data)) [((I 42), (I 42))]) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_8]) + [(builtin listData) (con (list (pair data data)) [((I 42), (I 42))])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 (con (list data) [])) + [(builtin listData) (con (list (pair data data)) [((I 42), (I 42))])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Data), [ProtoPair(Data, Data, Data(Integer(42)), Data(Integer(42)))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_items_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_items_used_true.snap new file mode 100644 index 00000000..b9f9762d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_other_items_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data data)) [((I 42), (I 42))]) of + DataList payload#10 -> payload#10 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] (delay (error))] (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unListData) generated_11]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data data)) [((I 42), (I 42))])]]) +--- optimized Core +let data_operand#3 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42))]) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list (pair data data)) [((I 42), (I 42))])]) +--- isolated pass +--- isolated ANF input +let anf#11 : Data = listData (con (list (pair data data)) [((I 42), (I 42))]) in +case@Data anf#11 of + DataList payload#10 -> payload#10 +--- isolated folded Core +let data_operand#12 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42))]) in +let anf#11 : Data = listData data_operand#12 in +let payload#10 : list Data = data_operand#12 in +payload#10 +--- isolated cleaned Core +let data_operand#12 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 42))]) in +let anf#11 : Data = listData data_operand#12 in +data_operand#12 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_11 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay [(lam payload_10 payload_10) [(builtin unListData) generated_12]])] + (delay (error))] + (delay (error))])) + anf_11]) + [(builtin listData) (con (list (pair data data)) [((I 42), (I 42))])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_12 + [(lam anf_11 data_operand_12) [(builtin listData) data_operand_12]]) + (con (list (pair data data)) [((I 42), (I 42))])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Data), [ProtoPair(Data, Data, Data(Integer(42)), Data(Integer(42)))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_overapplied.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_overapplied.snap new file mode 100644 index 00000000..5044af77 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_overapplied.snap @@ -0,0 +1,82 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list data) [(I 42)]) 0 of + DataList payload#9 -> payload#9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_10]])] + (delay (error))] + (delay (error))])) + [[(builtin listData) (con (list data) [(I 42)])] (con integer 0)]]) +--- optimized Core +let anf#2 : Data = listData (con (list data) [(I 42)]) in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataList payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_8 + [(lam anf_4 + [(lam anf_5 + [(lam generated_7 + (force + [[[[[[builtin_8 generated_7] (delay (error))] (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unListData) generated_7]])] + (delay (error))] + (delay (error))])) + anf_5]) + [anf_4 (con integer 0)]]) + [(builtin listData) (con (list data) [(I 42)])]]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#10 : Data = listData (con (list data) [(I 42)]) in +let anf#11 : Data = anf#10 0 in +case@Data anf#11 of + DataList payload#9 -> payload#9 +--- isolated folded Core +let anf#10 : Data = listData (con (list data) [(I 42)]) in +let anf#11 : Data = anf#10 0 in +case@Data anf#11 of + DataList payload#9 -> payload#9 +--- isolated cleaned Core +let anf#10 : Data = listData (con (list data) [(I 42)]) in +let anf#11 : Data = anf#10 0 in +case@Data anf#11 of + DataList payload#9 -> payload#9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_10 + [(lam anf_11 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_12]])] + (delay (error))] + (delay (error))])) + anf_11]) + [anf_10 (con integer 0)]]) + [(builtin listData) (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_10 + [(lam anf_11 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_12]])] + (delay (error))] + (delay (error))])) + anf_11]) + [anf_10 (con integer 0)]]) + [(builtin listData) (con (list data) [(I 42)])]]) +--- result +error: NonFunctionApplication(Con(Integer(0)), Con(Data(List([Integer(42)])))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_parameter_false.snap new file mode 100644 index 00000000..eb2faa2f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_parameter_false.snap @@ -0,0 +1,65 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list data) [(I 42)]) of + DataList payload#16 -> payload#16 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_16 payload_16) [(builtin unListData) generated_17]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [(builtin listData) (con (list data) [(I 42)])]]) +--- optimized Core +let data_operand#3 : list Data = (con (list data) [(I 42)]) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list data) [(I 42)])]) +--- isolated pass +--- isolated ANF input +let anf#17 : Data = listData (con (list data) [(I 42)]) in +case@Data anf#17 of + DataList payload#16 -> payload#16 + _ -> trace "cold" in error +--- isolated folded Core +let data_operand#18 : list Data = (con (list data) [(I 42)]) in +let anf#17 : Data = listData data_operand#18 in +let payload#16 : list Data = data_operand#18 in +payload#16 +--- isolated cleaned Core +let data_operand#18 : list Data = (con (list data) [(I 42)]) in +let anf#17 : Data = listData data_operand#18 in +data_operand#18 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_17 + [(lam generated_18 + (force + [[[[[[(force (builtin chooseData)) generated_18] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_16 payload_16) [(builtin unListData) generated_18]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_17]) + [(builtin listData) (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_18 + [(lam anf_17 data_operand_18) [(builtin listData) data_operand_18]]) + (con (list data) [(I 42)])]) +--- result +(con (list data) [(I 42)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_parameter_true.snap new file mode 100644 index 00000000..78f9a656 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_parameter_true.snap @@ -0,0 +1,67 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\input#19 : list Data -> case@Data listData input#19 of + DataList payload#20 -> payload#20 + _ -> trace "cold" in error) (con (list data) [(I 42)]) +--- unoptimized UPLC +(program 1.1.0 + [(lam input_19 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_20 payload_20) [(builtin unListData) generated_21]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [(builtin listData) input_19]]) + (con (list data) [(I 42)])]) +--- optimized Core +let data_operand#4 : list Data = (con (list data) [(I 42)]) in +let anf#3 : Data = listData data_operand#4 in +data_operand#4 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_2 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list data) [(I 42)])]) +--- isolated pass +--- isolated ANF input +(\input#19 : list Data -> let anf#21 : Data = listData input#19 in +case@Data anf#21 of + DataList payload#20 -> payload#20 + _ -> trace "cold" in error) (con (list data) [(I 42)]) +--- isolated folded Core +(\input#19 : list Data -> let anf#21 : Data = listData input#19 in +let payload#20 : list Data = input#19 in +payload#20) (con (list data) [(I 42)]) +--- isolated cleaned Core +let input#19 : list Data = (con (list data) [(I 42)]) in +let anf#21 : Data = listData input#19 in +input#19 +--- isolated UPLC before +(program 1.1.0 + [(lam input_19 + [(lam anf_21 + [(lam generated_22 + (force + [[[[[[(force (builtin chooseData)) generated_22] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_20 payload_20) [(builtin unListData) generated_22]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_21]) + [(builtin listData) input_19]]) + (con (list data) [(I 42)])]) +--- isolated UPLC after +(program 1.1.0 + [(lam input_19 [(lam anf_21 input_19) [(builtin listData) input_19]]) + (con (list data) [(I 42)])]) +--- result +(con (list data) [(I 42)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_partial.snap new file mode 100644 index 00000000..76b1f306 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_partial.snap @@ -0,0 +1,62 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData of + DataList payload#9 -> payload#9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_10]])] + (delay (error))] + (delay (error))])) + (builtin listData)]) +--- optimized Core +case@Data listData of + DataList payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam generated_3 + (force + [[[[[[builtin_4 generated_3] (delay (error))] (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unListData) generated_3]])] + (delay (error))] + (delay (error))])) + (builtin listData)]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +case@Data listData of + DataList payload#9 -> payload#9 +--- isolated folded Core +case@Data listData of + DataList payload#9 -> payload#9 +--- isolated cleaned Core +case@Data listData of + DataList payload#9 -> payload#9 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_10]])] + (delay (error))] + (delay (error))])) + (builtin listData)]) +--- isolated UPLC after +(program 1.1.0 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_10]])] + (delay (error))] + (delay (error))])) + (builtin listData)]) +--- result +error: NotAConstant(Builtin(Runtime { args: [], fun: ListData, forces: 0 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_producer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_producer.snap new file mode 100644 index 00000000..6ad7cfb5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_producer.snap @@ -0,0 +1,54 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list data) []) of + _ -> 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))])) + [(builtin listData) (con (list data) [])]]) +--- optimized Core +let anf#1 : Data = listData (con (list data) []) in +42 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 (con integer 42)) [(builtin listData) (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#1 : Data = listData (con (list data) []) in +case@Data anf#1 of + _ -> 42 +--- isolated folded Core +let data_operand#2 : list Data = (con (list data) []) in +let anf#1 : Data = listData data_operand#2 in +42 +--- isolated cleaned Core +let anf#1 : Data = listData (con (list data) []) in +42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))])) + anf_1]) + [(builtin listData) (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 (con integer 42)) [(builtin listData) (con (list data) [])]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_shared_escape.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_shared_escape.snap new file mode 100644 index 00000000..b644e28d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_shared_escape.snap @@ -0,0 +1,109 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#15 : Data = listData (trace "once" in (con (list data) [(I 42)])) in +let alias#16 : Data = data#15 in +constr 0 data#15 (case@Data alias#16 of + DataList payload#17 -> payload#17) (case@Data alias#16 of + DataList payload#18 -> payload#18) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_15 + [(lam alias_16 + (constr 0 + data_15 + [(lam generated_19 + (force + [[[[[[(force (builtin chooseData)) generated_19] (delay (error))] (delay (error))] + (delay [(lam payload_17 payload_17) [(builtin unListData) generated_19]])] + (delay (error))] + (delay (error))])) + alias_16] + [(lam generated_20 + (force + [[[[[[(force (builtin chooseData)) generated_20] (delay (error))] (delay (error))] + (delay [(lam payload_18 payload_18) [(builtin unListData) generated_20]])] + (delay (error))] + (delay (error))])) + alias_16])) + data_15]) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#5 : list Data = trace "once" in (con (list data) [(I 42)]) in +let data#1 : Data = listData anf#5 in +constr 0 data#1 anf#5 anf#5 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam anf_2 + [(lam data_3 (constr 0 data_3 anf_2 anf_2)) [(builtin listData) anf_2]]) + (force [[builtin_4 (con string "once")] (delay (con (list data) [(I 42)]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#19 : list Data = trace "once" in (con (list data) [(I 42)]) in +let data#15 : Data = listData anf#19 in +let alias#16 : Data = data#15 in +let anf#20 : list Data = case@Data alias#16 of + DataList payload#17 -> payload#17 in +let anf#21 : list Data = case@Data alias#16 of + DataList payload#18 -> payload#18 in +constr 0 data#15 anf#20 anf#21 +--- isolated folded Core +let anf#19 : list Data = trace "once" in (con (list data) [(I 42)]) in +let data#15 : Data = listData anf#19 in +let alias#16 : Data = data#15 in +let anf#20 : list Data = let payload#17 : list Data = anf#19 in +payload#17 in +let anf#21 : list Data = let payload#18 : list Data = anf#19 in +payload#18 in +constr 0 data#15 anf#20 anf#21 +--- isolated cleaned Core +let anf#19 : list Data = trace "once" in (con (list data) [(I 42)]) in +let data#15 : Data = listData anf#19 in +constr 0 data#15 anf#19 anf#19 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_19 + [(lam data_15 + [(lam alias_16 + [(lam anf_20 + [(lam anf_21 (constr 0 data_15 anf_20 anf_21)) + [(lam generated_22 + (force + [[[[[[(force (builtin chooseData)) generated_22] (delay (error))] (delay (error))] + (delay [(lam payload_18 payload_18) [(builtin unListData) generated_22]])] + (delay (error))] + (delay (error))])) + alias_16]]) + [(lam generated_23 + (force + [[[[[[(force (builtin chooseData)) generated_23] (delay (error))] (delay (error))] + (delay [(lam payload_17 payload_17) [(builtin unListData) generated_23]])] + (delay (error))] + (delay (error))])) + alias_16]]) + data_15]) + [(builtin listData) anf_19]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 42)]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_19 + [(lam data_15 (constr 0 data_15 anf_19 anf_19)) [(builtin listData) anf_19]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay (con (list data) [(I 42)]))])]) +--- result +(constr 0 + (con data (List [I 42])) + (con (list data) [(I 42)]) + (con (list data) [(I 42)])) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_strict_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_strict_failure_false.snap new file mode 100644 index 00000000..0c5ca14b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_strict_failure_false.snap @@ -0,0 +1,99 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#17 : Data = listData (trace "operand" in (con (list data) [(I 42)])) in +let effect#19 : int = trace "between" in 0 in +case@Data data#17 of + DataList payload#18 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_17 + [(lam effect_19 + [(lam generated_20 + (force + [[[[[[(force (builtin chooseData)) generated_20] (delay (error))] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))])) + data_17]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin listData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]]) +--- optimized Core +let anf#4 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let data#1 : Data = listData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin listData) anf_3]]) + (force [[builtin_7 (con string "operand")] (delay (con (list data) [(I 42)]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#20 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let data#17 : Data = listData anf#20 in +let effect#19 : int = trace "between" in 0 in +case@Data data#17 of + DataList payload#18 -> trace "selected" in 9 +--- isolated folded Core +let anf#20 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let data#17 : Data = listData anf#20 in +let effect#19 : int = trace "between" in 0 in +let payload#18 : list Data = anf#20 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#20 : list Data = trace "operand" in (con (list data) [(I 42)]) in +let data#17 : Data = listData anf#20 in +let effect#19 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_20 + [(lam data_17 + [(lam effect_19 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] (delay (error))] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))])) + data_17]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin listData) anf_20]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_20 + [(lam data_17 + [(lam effect_19 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin listData) anf_20]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay (con (list data) [(I 42)]))])]) +--- result +(con integer 9) +--- logs +["operand", "between", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_strict_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_strict_failure_true.snap new file mode 100644 index 00000000..39315eb9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_strict_failure_true.snap @@ -0,0 +1,93 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#21 : Data = listData (trace "operand" in error) in +let effect#23 : int = trace "between" in 0 in +case@Data data#21 of + DataList payload#22 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_21 + [(lam effect_23 + [(lam generated_24 + (force + [[[[[[(force (builtin chooseData)) generated_24] (delay (error))] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))])) + data_21]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin listData) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]]) +--- optimized Core +let anf#4 : list Data = trace "operand" in error in +let data#1 : Data = listData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin listData) anf_3]]) + (force [[builtin_7 (con string "operand")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#24 : list Data = trace "operand" in error in +let data#21 : Data = listData anf#24 in +let effect#23 : int = trace "between" in 0 in +case@Data data#21 of + DataList payload#22 -> trace "selected" in 9 +--- isolated folded Core +let anf#24 : list Data = trace "operand" in error in +let data#21 : Data = listData anf#24 in +let effect#23 : int = trace "between" in 0 in +let payload#22 : list Data = anf#24 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#24 : list Data = trace "operand" in error in +let data#21 : Data = listData anf#24 in +let effect#23 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_24 + [(lam data_21 + [(lam effect_23 + [(lam generated_25 + (force + [[[[[[(force (builtin chooseData)) generated_25] (delay (error))] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))])) + data_21]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin listData) anf_24]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_24 + [(lam data_21 + [(lam effect_23 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin listData) anf_24]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_traced.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_traced.snap new file mode 100644 index 00000000..85832c32 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_traced.snap @@ -0,0 +1,82 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (trace "producer" in listData (con (list data) [(I 42)])) of + DataList payload#9 -> payload#9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_10]])] + (delay (error))] + (delay (error))])) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin listData) (con (list data) [(I 42)])])])]) +--- optimized Core +let anf#2 : Data = trace "producer" in listData (con (list data) [(I 42)]) in +case@Data anf#2 of + DataList payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam builtin_7 + [(lam anf_3 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] (delay (error))] (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unListData) generated_5]])] + (delay (error))] + (delay (error))])) + anf_3]) + (force + [[builtin_7 (con string "producer")] + (delay [(builtin listData) (con (list data) [(I 42)])])])]) + (force (builtin trace))]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#12 : Data = trace "producer" in listData (con (list data) [(I 42)]) in +case@Data anf#12 of + DataList payload#9 -> payload#9 +--- isolated folded Core +let anf#12 : Data = trace "producer" in listData (con (list data) [(I 42)]) in +case@Data anf#12 of + DataList payload#9 -> payload#9 +--- isolated cleaned Core +let anf#12 : Data = trace "producer" in listData (con (list data) [(I 42)]) in +case@Data anf#12 of + DataList payload#9 -> payload#9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_12 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_13]])] + (delay (error))] + (delay (error))])) + anf_12]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin listData) (con (list data) [(I 42)])])])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_12 + [(lam generated_13 + (force + [[[[[[(force (builtin chooseData)) generated_13] (delay (error))] (delay (error))] + (delay [(lam payload_9 payload_9) [(builtin unListData) generated_13]])] + (delay (error))] + (delay (error))])) + anf_12]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay [(builtin listData) (con (list data) [(I 42)])])])]) +--- result +(con (list data) [(I 42)]) +--- logs +["producer"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_empty_used_false.snap new file mode 100644 index 00000000..b6501b9c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_empty_used_false.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list integer) []) of + DataList payload#25 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list integer) [])]]) +--- optimized Core +let anf#2 : Data = listData (con (list integer) []) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) [(builtin listData) (con (list integer) [])]]) +--- isolated pass +--- isolated ANF input +let anf#26 : Data = listData (con (list integer) []) in +case@Data anf#26 of + DataList payload#25 -> (con (list data) []) +--- isolated folded Core +let data_operand#27 : list int = (con (list integer) []) in +let anf#26 : Data = listData data_operand#27 in +let payload#25 : list Data = data_operand#27 in +(con (list data) []) +--- isolated cleaned Core +let anf#26 : Data = listData (con (list integer) []) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_26 + [(lam generated_27 + (force + [[[[[[(force (builtin chooseData)) generated_27] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_26]) + [(builtin listData) (con (list integer) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_26 (con (list data) [])) [(builtin listData) (con (list integer) [])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_empty_used_true.snap new file mode 100644 index 00000000..4a10e172 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_empty_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list integer) []) of + DataList payload#28 -> payload#28 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] (delay (error))] (delay (error))] + (delay [(lam payload_28 payload_28) [(builtin unListData) generated_29]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list integer) [])]]) +--- optimized Core +let data_operand#3 : list int = (con (list integer) []) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list integer) [])]) +--- isolated pass +--- isolated ANF input +let anf#29 : Data = listData (con (list integer) []) in +case@Data anf#29 of + DataList payload#28 -> payload#28 +--- isolated folded Core +let data_operand#30 : list int = (con (list integer) []) in +let anf#29 : Data = listData data_operand#30 in +let payload#28 : list Data = data_operand#30 in +payload#28 +--- isolated cleaned Core +let data_operand#30 : list int = (con (list integer) []) in +let anf#29 : Data = listData data_operand#30 in +data_operand#30 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_29 + [(lam generated_30 + (force + [[[[[[(force (builtin chooseData)) generated_30] (delay (error))] (delay (error))] + (delay [(lam payload_28 payload_28) [(builtin unListData) generated_30]])] + (delay (error))] + (delay (error))])) + anf_29]) + [(builtin listData) (con (list integer) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_30 + [(lam anf_29 data_operand_30) [(builtin listData) data_operand_30]]) + (con (list integer) [])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_items_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_items_used_false.snap new file mode 100644 index 00000000..0801af0c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_items_used_false.snap @@ -0,0 +1,54 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list integer) [7]) of + DataList payload#31 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_32 + (force + [[[[[[(force (builtin chooseData)) generated_32] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list integer) [7])]]) +--- optimized Core +let anf#2 : Data = listData (con (list integer) [7]) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) [(builtin listData) (con (list integer) [7])]]) +--- isolated pass +--- isolated ANF input +let anf#32 : Data = listData (con (list integer) [7]) in +case@Data anf#32 of + DataList payload#31 -> (con (list data) []) +--- isolated folded Core +let data_operand#33 : list int = (con (list integer) [7]) in +let anf#32 : Data = listData data_operand#33 in +let payload#31 : list Data = data_operand#33 in +(con (list data) []) +--- isolated cleaned Core +let anf#32 : Data = listData (con (list integer) [7]) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_32 + [(lam generated_33 + (force + [[[[[[(force (builtin chooseData)) generated_33] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_32]) + [(builtin listData) (con (list integer) [7])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_32 (con (list data) [])) + [(builtin listData) (con (list integer) [7])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, [Integer(7)]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_items_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_items_used_true.snap new file mode 100644 index 00000000..b713b3a0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_items_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list integer) [7]) of + DataList payload#34 -> payload#34 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_35 + (force + [[[[[[(force (builtin chooseData)) generated_35] (delay (error))] (delay (error))] + (delay [(lam payload_34 payload_34) [(builtin unListData) generated_35]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list integer) [7])]]) +--- optimized Core +let data_operand#3 : list int = (con (list integer) [7]) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list integer) [7])]) +--- isolated pass +--- isolated ANF input +let anf#35 : Data = listData (con (list integer) [7]) in +case@Data anf#35 of + DataList payload#34 -> payload#34 +--- isolated folded Core +let data_operand#36 : list int = (con (list integer) [7]) in +let anf#35 : Data = listData data_operand#36 in +let payload#34 : list Data = data_operand#36 in +payload#34 +--- isolated cleaned Core +let data_operand#36 : list int = (con (list integer) [7]) in +let anf#35 : Data = listData data_operand#36 in +data_operand#36 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_35 + [(lam generated_36 + (force + [[[[[[(force (builtin chooseData)) generated_36] (delay (error))] (delay (error))] + (delay [(lam payload_34 payload_34) [(builtin unListData) generated_36]])] + (delay (error))] + (delay (error))])) + anf_35]) + [(builtin listData) (con (list integer) [7])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_36 + [(lam anf_35 data_operand_36) [(builtin listData) data_operand_36]]) + (con (list integer) [7])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Integer, [Integer(7)]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_empty_used_false.snap new file mode 100644 index 00000000..69b7b12a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_empty_used_false.snap @@ -0,0 +1,55 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data integer)) []) of + DataList payload#37 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_38 + (force + [[[[[[(force (builtin chooseData)) generated_38] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data integer)) [])]]) +--- optimized Core +let anf#2 : Data = listData (con (list (pair data integer)) []) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) + [(builtin listData) (con (list (pair data integer)) [])]]) +--- isolated pass +--- isolated ANF input +let anf#38 : Data = listData (con (list (pair data integer)) []) in +case@Data anf#38 of + DataList payload#37 -> (con (list data) []) +--- isolated folded Core +let data_operand#39 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#38 : Data = listData data_operand#39 in +let payload#37 : list Data = data_operand#39 in +(con (list data) []) +--- isolated cleaned Core +let anf#38 : Data = listData (con (list (pair data integer)) []) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_38 + [(lam generated_39 + (force + [[[[[[(force (builtin chooseData)) generated_39] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_38]) + [(builtin listData) (con (list (pair data integer)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_38 (con (list data) [])) + [(builtin listData) (con (list (pair data integer)) [])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Integer), []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_empty_used_true.snap new file mode 100644 index 00000000..34cbe7e0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_empty_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data integer)) []) of + DataList payload#40 -> payload#40 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_41 + (force + [[[[[[(force (builtin chooseData)) generated_41] (delay (error))] (delay (error))] + (delay [(lam payload_40 payload_40) [(builtin unListData) generated_41]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data integer)) [])]]) +--- optimized Core +let data_operand#3 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list (pair data integer)) [])]) +--- isolated pass +--- isolated ANF input +let anf#41 : Data = listData (con (list (pair data integer)) []) in +case@Data anf#41 of + DataList payload#40 -> payload#40 +--- isolated folded Core +let data_operand#42 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#41 : Data = listData data_operand#42 in +let payload#40 : list Data = data_operand#42 in +payload#40 +--- isolated cleaned Core +let data_operand#42 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#41 : Data = listData data_operand#42 in +data_operand#42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_41 + [(lam generated_42 + (force + [[[[[[(force (builtin chooseData)) generated_42] (delay (error))] (delay (error))] + (delay [(lam payload_40 payload_40) [(builtin unListData) generated_42]])] + (delay (error))] + (delay (error))])) + anf_41]) + [(builtin listData) (con (list (pair data integer)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_42 + [(lam anf_41 data_operand_42) [(builtin listData) data_operand_42]]) + (con (list (pair data integer)) [])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Integer), []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_items_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_items_used_false.snap new file mode 100644 index 00000000..d45cf633 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_items_used_false.snap @@ -0,0 +1,55 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data integer)) [((I 42), 7)]) of + DataList payload#43 -> (con (list data) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_44 + (force + [[[[[[(force (builtin chooseData)) generated_44] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- optimized Core +let anf#2 : Data = listData (con (list (pair data integer)) [((I 42), 7)]) in +(con (list data) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list data) [])) + [(builtin listData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- isolated pass +--- isolated ANF input +let anf#44 : Data = listData (con (list (pair data integer)) [((I 42), 7)]) in +case@Data anf#44 of + DataList payload#43 -> (con (list data) []) +--- isolated folded Core +let data_operand#45 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#44 : Data = listData data_operand#45 in +let payload#43 : list Data = data_operand#45 in +(con (list data) []) +--- isolated cleaned Core +let anf#44 : Data = listData (con (list (pair data integer)) [((I 42), 7)]) in +(con (list data) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_44 + [(lam generated_45 + (force + [[[[[[(force (builtin chooseData)) generated_45] (delay (error))] (delay (error))] + (delay (con (list data) []))] + (delay (error))] + (delay (error))])) + anf_44]) + [(builtin listData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_44 (con (list data) [])) + [(builtin listData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Integer), [ProtoPair(Data, Integer, Data(Integer(42)), Integer(7))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_items_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_items_used_true.snap new file mode 100644 index 00000000..bd2c7045 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__list_wrong_pair_items_used_true.snap @@ -0,0 +1,59 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data listData (con (list (pair data integer)) [((I 42), 7)]) of + DataList payload#46 -> payload#46 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_47 + (force + [[[[[[(force (builtin chooseData)) generated_47] (delay (error))] (delay (error))] + (delay [(lam payload_46 payload_46) [(builtin unListData) generated_47]])] + (delay (error))] + (delay (error))])) + [(builtin listData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- optimized Core +let data_operand#3 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#2 : Data = listData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin listData) data_operand_1]]) + (con (list (pair data integer)) [((I 42), 7)])]) +--- isolated pass +--- isolated ANF input +let anf#47 : Data = listData (con (list (pair data integer)) [((I 42), 7)]) in +case@Data anf#47 of + DataList payload#46 -> payload#46 +--- isolated folded Core +let data_operand#48 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#47 : Data = listData data_operand#48 in +let payload#46 : list Data = data_operand#48 in +payload#46 +--- isolated cleaned Core +let data_operand#48 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#47 : Data = listData data_operand#48 in +data_operand#48 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_47 + [(lam generated_48 + (force + [[[[[[(force (builtin chooseData)) generated_48] (delay (error))] (delay (error))] + (delay [(lam payload_46 payload_46) [(builtin unListData) generated_48]])] + (delay (error))] + (delay (error))])) + anf_47]) + [(builtin listData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_48 + [(lam anf_47 data_operand_48) [(builtin listData) data_operand_48]]) + (con (list (pair data integer)) [((I 42), 7)])]) +--- result +error: Runtime(TypeMismatch(Data, ProtoList(Pair(Data, Integer), [ProtoPair(Data, Integer, Data(Integer(42)), Integer(7))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_captured_cold_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_captured_cold_false.snap new file mode 100644 index 00000000..8c69d0c4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_captured_cold_false.snap @@ -0,0 +1,96 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#13 : Data = mapData (trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) in +case@Bool false of + True -> (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + False -> force (delay (case@Data data#13 of + DataMap payload#14 -> payload#14)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_13 + (case + (con bool False) + (force + (delay + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] (delay (error))] + (delay [(lam payload_14 payload_14) [(builtin unMapData) generated_15]])] + (delay (error))] + (delay (error))] + (delay (error))])) + data_13])) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]]) +--- optimized Core +let anf#3 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#1 : Data = mapData anf#3 in +anf#3 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 [(lam data_4 anf_2) [(builtin mapData) anf_2]]) + (force + [[builtin_5 (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#15 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#13 : Data = mapData anf#15 in +case@Bool false of + True -> (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + False -> force (delay (case@Data data#13 of + DataMap payload#14 -> payload#14)) +--- isolated folded Core +let anf#15 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#13 : Data = mapData anf#15 in +case@Bool false of + True -> (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + False -> force (delay (let payload#14 : list (pair Data Data) = anf#15 in + payload#14)) +--- isolated cleaned Core +let anf#15 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#13 : Data = mapData anf#15 in +anf#15 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_15 + [(lam data_13 + (case + (con bool False) + (force + (delay + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] (delay (error))] + (delay [(lam payload_14 payload_14) [(builtin unMapData) generated_16]])] + (delay (error))] + (delay (error))] + (delay (error))])) + data_13])) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))) + [(builtin mapData) anf_15]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_15 [(lam data_13 anf_15) [(builtin mapData) anf_15]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- result +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_captured_cold_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_captured_cold_true.snap new file mode 100644 index 00000000..df35be4b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_captured_cold_true.snap @@ -0,0 +1,102 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#13 : Data = mapData (trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) in +case@Bool true of + True -> (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + False -> force (delay (case@Data data#13 of + DataMap payload#14 -> payload#14)) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_13 + (case + (con bool True) + (force + (delay + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] (delay (error))] + (delay [(lam payload_14 payload_14) [(builtin unMapData) generated_15]])] + (delay (error))] + (delay (error))] + (delay (error))])) + data_13])) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]]) +--- optimized Core +let anf#3 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#1 : Data = mapData anf#3 in +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 + [(lam data_4 + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) + [(builtin mapData) anf_2]]) + (force + [[builtin_5 (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#16 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#13 : Data = mapData anf#16 in +case@Bool true of + True -> (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + False -> force (delay (case@Data data#13 of + DataMap payload#14 -> payload#14)) +--- isolated folded Core +let anf#16 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#13 : Data = mapData anf#16 in +case@Bool true of + True -> (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + False -> force (delay (let payload#14 : list (pair Data Data) = anf#16 in + payload#14)) +--- isolated cleaned Core +let anf#16 : list (pair Data Data) = trace "before" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#13 : Data = mapData anf#16 in +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_16 + [(lam data_13 + (case + (con bool True) + (force + (delay + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] (delay (error))] + (delay [(lam payload_14 payload_14) [(builtin unMapData) generated_17]])] + (delay (error))] + (delay (error))] + (delay (error))])) + data_13])) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))) + [(builtin mapData) anf_16]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_16 + [(lam data_13 + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) + [(builtin mapData) anf_16]]) + (force + [[(force (builtin trace)) (con string "before")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- result +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_cons_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_cons_used_false.snap new file mode 100644 index 00000000..6234def0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_cons_used_false.snap @@ -0,0 +1,71 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) [])) of + DataMap payload#67 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_68 + (force + [[[[[[(force (builtin chooseData)) generated_68] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) + [[(force (builtin mkCons)) (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]]) +--- optimized Core +let anf#2 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#3 : Data = mapData anf#2 in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_4 (con (list (pair data data)) [])) [(builtin mapData) anf_1]]) + [[builtin_5 (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#68 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#69 : Data = mapData anf#68 in +case@Data anf#69 of + DataMap payload#67 -> (con (list (pair data data)) []) +--- isolated folded Core +let anf#68 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#69 : Data = mapData anf#68 in +let payload#67 : list (pair Data Data) = anf#68 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#68 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#69 : Data = mapData anf#68 in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_68 + [(lam anf_69 + [(lam generated_70 + (force + [[[[[[(force (builtin chooseData)) generated_70] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_69]) + [(builtin mapData) anf_68]]) + [[(force (builtin mkCons)) (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_68 + [(lam anf_69 (con (list (pair data data)) [])) [(builtin mapData) anf_68]]) + [[(force (builtin mkCons)) (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]) +--- result +(con (list (pair data data)) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_cons_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_cons_used_true.snap new file mode 100644 index 00000000..b3d0346b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_cons_used_true.snap @@ -0,0 +1,69 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) [])) of + DataMap payload#70 -> payload#70 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_71 + (force + [[[[[[(force (builtin chooseData)) generated_71] (delay (error))] + (delay [(lam payload_70 payload_70) [(builtin unMapData) generated_71]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) + [[(force (builtin mkCons)) (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]]) +--- optimized Core +let anf#2 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#3 : Data = mapData anf#2 in +anf#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 [(lam anf_4 anf_1) [(builtin mapData) anf_1]]) + [[builtin_5 (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#71 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#72 : Data = mapData anf#71 in +case@Data anf#72 of + DataMap payload#70 -> payload#70 +--- isolated folded Core +let anf#71 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#72 : Data = mapData anf#71 in +let payload#70 : list (pair Data Data) = anf#71 in +payload#70 +--- isolated cleaned Core +let anf#71 : list (pair Data Data) = mkCons (con (pair data data) ((I 42), (I 42))) (con (list (pair data data)) []) in +let anf#72 : Data = mapData anf#71 in +anf#71 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_71 + [(lam anf_72 + [(lam generated_73 + (force + [[[[[[(force (builtin chooseData)) generated_73] (delay (error))] + (delay [(lam payload_70 payload_70) [(builtin unMapData) generated_73]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_72]) + [(builtin mapData) anf_71]]) + [[(force (builtin mkCons)) (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_71 [(lam anf_72 anf_71) [(builtin mapData) anf_71]]) + [[(force (builtin mkCons)) (con (pair data data) ((I 42), (I 42)))] + (con (list (pair data data)) [])]]) +--- result +(con (list (pair data data)) [((I 42), (I 42))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_default_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_default_false.snap new file mode 100644 index 00000000..11ae7f88 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_default_false.snap @@ -0,0 +1,74 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) of + DataList wrong#16 -> trace "wrong" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] (delay (error))] (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))] + (delay (error))])) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]]) +--- optimized Core +let anf#2 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#3 : Data = mapData anf#2 in +error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 [(lam anf_4 (error)) [(builtin mapData) anf_1]]) + (force + [[builtin_5 (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#17 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#18 : Data = mapData anf#17 in +case@Data anf#18 of + DataList wrong#16 -> trace "wrong" in error +--- isolated folded Core +let anf#17 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#18 : Data = mapData anf#17 in +error +--- isolated cleaned Core +let anf#17 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#18 : Data = mapData anf#17 in +error +--- isolated UPLC before +(program 1.1.0 + [(lam anf_17 + [(lam anf_18 + [(lam generated_19 + (force + [[[[[[(force (builtin chooseData)) generated_19] (delay (error))] (delay (error))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay (error))] + (delay (error))])) + anf_18]) + [(builtin mapData) anf_17]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_17 [(lam anf_18 (error)) [(builtin mapData) anf_17]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_default_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_default_true.snap new file mode 100644 index 00000000..204eb1b1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_default_true.snap @@ -0,0 +1,103 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) of + DataList wrong#16 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]]) +--- optimized Core +let anf#2 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#3 : Data = mapData anf#2 in +trace "fallback" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_4 + (force [[builtin_5 (con string "fallback")] (delay (con integer 9))])) + [(builtin mapData) anf_1]]) + (force + [[builtin_5 (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#19 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#20 : Data = mapData anf#19 in +case@Data anf#20 of + DataList wrong#16 -> trace "wrong" in error + _ -> trace "fallback" in 9 +--- isolated folded Core +let anf#19 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#20 : Data = mapData anf#19 in +trace "fallback" in 9 +--- isolated cleaned Core +let anf#19 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#20 : Data = mapData anf#19 in +trace "fallback" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_19 + [(lam anf_20 + [(lam generated_21 + (force + [[[[[[(force (builtin chooseData)) generated_21] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay (force [[(force (builtin trace)) (con string "wrong")] (delay (error))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))] + (delay + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))]))])) + anf_20]) + [(builtin mapData) anf_19]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_19 + [(lam anf_20 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 9))])) + [(builtin mapData) anf_19]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- result +(con integer 9) +--- logs +["operand", "fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_empty_used_false.snap new file mode 100644 index 00000000..979f46de --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_empty_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data data)) []) of + DataMap payload#61 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_62 + (force + [[[[[[(force (builtin chooseData)) generated_62] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list (pair data data)) []) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- isolated pass +--- isolated ANF input +let anf#62 : Data = mapData (con (list (pair data data)) []) in +case@Data anf#62 of + DataMap payload#61 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#63 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#62 : Data = mapData data_operand#63 in +let payload#61 : list (pair Data Data) = data_operand#63 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#62 : Data = mapData (con (list (pair data data)) []) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_62 + [(lam generated_63 + (force + [[[[[[(force (builtin chooseData)) generated_63] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_62]) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_62 (con (list (pair data data)) [])) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- result +(con (list (pair data data)) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_empty_used_true.snap new file mode 100644 index 00000000..67a6c5ea --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_empty_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data data)) []) of + DataMap payload#64 -> payload#64 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_65 + (force + [[[[[[(force (builtin chooseData)) generated_65] (delay (error))] + (delay [(lam payload_64 payload_64) [(builtin unMapData) generated_65]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- optimized Core +let data_operand#3 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list (pair data data)) [])]) +--- isolated pass +--- isolated ANF input +let anf#65 : Data = mapData (con (list (pair data data)) []) in +case@Data anf#65 of + DataMap payload#64 -> payload#64 +--- isolated folded Core +let data_operand#66 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#65 : Data = mapData data_operand#66 in +let payload#64 : list (pair Data Data) = data_operand#66 in +payload#64 +--- isolated cleaned Core +let data_operand#66 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#65 : Data = mapData data_operand#66 in +data_operand#66 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_65 + [(lam generated_66 + (force + [[[[[[(force (builtin chooseData)) generated_66] (delay (error))] + (delay [(lam payload_64 payload_64) [(builtin unMapData) generated_66]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_65]) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_66 + [(lam anf_65 data_operand_66) [(builtin mapData) data_operand_66]]) + (con (list (pair data data)) [])]) +--- result +(con (list (pair data data)) []) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_bool_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_bool_fallback_false.snap new file mode 100644 index 00000000..fd3309b6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_bool_fallback_false.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData true of + DataMap unused#59 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_60 + (force + [[[[[[(force (builtin chooseData)) generated_60] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin mapData) (con bool True)]]) +--- optimized Core +let anf#2 : Data = mapData true in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con integer 9)) [(builtin mapData) (con bool True)]]) +--- isolated pass +--- isolated ANF input +let anf#60 : Data = mapData true in +case@Data anf#60 of + DataMap unused#59 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#61 : bool = true in +let anf#60 : Data = mapData data_operand#61 in +let unused#59 : bool = data_operand#61 in +9 +--- isolated cleaned Core +let anf#60 : Data = mapData true in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_60 + [(lam generated_61 + (force + [[[[[[(force (builtin chooseData)) generated_61] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_60]) + [(builtin mapData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_60 (con integer 9)) [(builtin mapData) (con bool True)]]) +--- result +error: Runtime(ExpectedList(Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_bool_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_bool_fallback_true.snap new file mode 100644 index 00000000..fbe28f8c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_bool_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData true of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin mapData) (con bool True)]]) +--- optimized Core +let anf#1 : Data = mapData true in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam anf_2 + (force [[builtin_3 (con string "unreachable")] (delay (con integer 0))])) + [(builtin mapData) (con bool True)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#63 : Data = mapData true in +case@Data anf#63 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#64 : bool = true in +let anf#63 : Data = mapData data_operand#64 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#63 : Data = mapData true in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_63 + [(lam generated_64 + (force + [[[[[[(force (builtin chooseData)) generated_64] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_63]) + [(builtin mapData) (con bool True)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_63 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin mapData) (con bool True)]]) +--- result +error: Runtime(ExpectedList(Boolean(true))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_delay_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_delay_fallback_false.snap new file mode 100644 index 00000000..c4282817 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_delay_fallback_false.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (delay (\x#58 : int -> x#58)) of + DataMap unused#71 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_72 + (force + [[[[[[(force (builtin chooseData)) generated_72] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin mapData) (delay (lam x_58 x_58))]]) +--- optimized Core +let anf#3 : Data = mapData (delay (\x#1 : int -> x#1)) in +9 +--- optimized UPLC +(program 1.1.0 + [(lam anf_4 (con integer 9)) [(builtin mapData) (delay (lam x_2 x_2))]]) +--- isolated pass +--- isolated ANF input +let anf#72 : Data = mapData (delay (\x#58 : int -> x#58)) in +case@Data anf#72 of + DataMap unused#71 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#73 : @delay (int -> int) = delay (\x#58 : int -> x#58) in +let anf#72 : Data = mapData data_operand#73 in +let unused#71 : @delay (int -> int) = data_operand#73 in +9 +--- isolated cleaned Core +let anf#72 : Data = mapData (delay (\x#58 : int -> x#58)) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_72 + [(lam generated_73 + (force + [[[[[[(force (builtin chooseData)) generated_73] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_72]) + [(builtin mapData) (delay (lam x_58 x_58))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_72 (con integer 9)) [(builtin mapData) (delay (lam x_58 x_58))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_delay_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_delay_fallback_true.snap new file mode 100644 index 00000000..b0942e20 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_delay_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (delay (\x#58 : int -> x#58)) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_59 + (force + [[[[[[(force (builtin chooseData)) generated_59] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin mapData) (delay (lam x_58 x_58))]]) +--- optimized Core +let anf#2 : Data = mapData (delay (\x#1 : int -> x#1)) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin mapData) (delay (lam x_3 x_3))]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#75 : Data = mapData (delay (\x#58 : int -> x#58)) in +case@Data anf#75 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#76 : @delay (int -> int) = delay (\x#58 : int -> x#58) in +let anf#75 : Data = mapData data_operand#76 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#75 : Data = mapData (delay (\x#58 : int -> x#58)) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_75 + [(lam generated_76 + (force + [[[[[[(force (builtin chooseData)) generated_76] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_75]) + [(builtin mapData) (delay (lam x_58 x_58))]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_75 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin mapData) (delay (lam x_58 x_58))]]) +--- result +error: NotAConstant(Delay(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)) }, Empty)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_duplicate.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_duplicate.snap new file mode 100644 index 00000000..560fd004 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_duplicate.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 -> 42 + DataMap payload#7 -> 42 +--- after +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 -> 42 + DataMap payload#7 -> 42 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_function_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_function_fallback_false.snap new file mode 100644 index 00000000..39a243c6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_function_fallback_false.snap @@ -0,0 +1,74 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (\x#58 : int -> x#58) of + DataMap unused#65 -> 9 + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_66 + (force + [[[[[[(force (builtin chooseData)) generated_66] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin mapData) (lam x_58 x_58)]]) +--- optimized Core +let anf#3 : Data = mapData (\x#1 : int -> x#1) in +9 +--- optimized UPLC +(program 1.1.0 [(lam anf_4 (con integer 9)) [(builtin mapData) (lam x_2 x_2)]]) +--- isolated pass +--- isolated ANF input +let anf#66 : Data = mapData (\x#58 : int -> x#58) in +case@Data anf#66 of + DataMap unused#65 -> 9 + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#67 : int -> int = \x#58 : int -> x#58 in +let anf#66 : Data = mapData data_operand#67 in +let unused#65 : int -> int = data_operand#67 in +9 +--- isolated cleaned Core +let anf#66 : Data = mapData (\x#58 : int -> x#58) in +9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_66 + [(lam generated_67 + (force + [[[[[[(force (builtin chooseData)) generated_67] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay (con integer 9))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_66]) + [(builtin mapData) (lam x_58 x_58)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_66 (con integer 9)) [(builtin mapData) (lam x_58 x_58)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_function_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_function_fallback_true.snap new file mode 100644 index 00000000..b05e95c7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_function_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (\x#58 : int -> x#58) of + _ -> trace "unreachable" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_59 + (force + [[[[[[(force (builtin chooseData)) generated_59] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + [(builtin mapData) (lam x_58 x_58)]]) +--- optimized Core +let anf#2 : Data = mapData (\x#1 : int -> x#1) in +trace "unreachable" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_4 + (force [[builtin_5 (con string "unreachable")] (delay (con integer 0))])) + [(builtin mapData) (lam x_3 x_3)]]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#69 : Data = mapData (\x#58 : int -> x#58) in +case@Data anf#69 of + _ -> trace "unreachable" in 0 +--- isolated folded Core +let data_operand#70 : int -> int = \x#58 : int -> x#58 in +let anf#69 : Data = mapData data_operand#70 in +trace "unreachable" in 0 +--- isolated cleaned Core +let anf#69 : Data = mapData (\x#58 : int -> x#58) in +trace "unreachable" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_69 + [(lam generated_70 + (force + [[[[[[(force (builtin chooseData)) generated_70] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))] + (delay + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))]))])) + anf_69]) + [(builtin mapData) (lam x_58 x_58)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_69 + (force + [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 0))])) + [(builtin mapData) (lam x_58 x_58)]]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Empty }) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_selected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_selected_arity.snap new file mode 100644 index 00000000..d53aaa04 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_selected_arity.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 payload#7 -> 0 +--- after +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 payload#7 -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_unselected_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_unselected_arity.snap new file mode 100644 index 00000000..7b621d4f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_unselected_arity.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 -> 42 + DataList -> 0 +--- after +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 -> 42 + DataList -> 0 +--- errors +InvalidCase("invalid Data branch") +InvalidCase("invalid Data branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_wrong_test.snap new file mode 100644 index 00000000..7abf3d4f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_invalid_wrong_test.snap @@ -0,0 +1,17 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 -> 42 + True -> 0 +--- after +let data#8 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data data#8 of + DataMap payload#7 -> 42 + True -> 0 +--- errors +InvalidCase("non-Data test") +InvalidCase("non-Data test") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_nested_returned_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_nested_returned_function.snap new file mode 100644 index 00000000..5c5751d5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_nested_returned_function.snap @@ -0,0 +1,108 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(case@Data mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) of + DataMap outer#8 -> case@Data mapData outer#8 of + DataMap inner#9 -> \x#10 : int -> constr 0 inner#9 x#10) 7 +--- unoptimized UPLC +(program 1.1.0 + [[(lam generated_11 + (force + [[[[[[(force (builtin chooseData)) generated_11] (delay (error))] + (delay + [(lam outer_8 + [(lam generated_12 + (force + [[[[[[(force (builtin chooseData)) generated_12] (delay (error))] + (delay + [(lam inner_9 (lam x_10 (constr 0 inner_9 x_10))) + [(builtin unMapData) generated_12]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) outer_8]]) + [(builtin unMapData) generated_11]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]] + (con integer 7)]) +--- optimized Core +let data_operand#7 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#4 : Data = mapData data_operand#7 in +let anf#5 : Data = mapData data_operand#7 in +constr 0 data_operand#7 7 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_2 + [(lam anf_3 (constr 0 data_operand_1 (con integer 7))) + [(builtin mapData) data_operand_1]]) + [(builtin mapData) data_operand_1]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- isolated pass +--- isolated ANF input +let anf#11 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#13 : int -> 'erased = case@Data anf#11 of + DataMap outer#8 -> let anf#12 : Data = mapData outer#8 in + case@Data anf#12 of + DataMap inner#9 -> \x#10 : int -> constr 0 inner#9 x#10 in +anf#13 7 +--- isolated folded Core +let data_operand#14 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#11 : Data = mapData data_operand#14 in +let anf#13 : int -> 'erased = let outer#8 : list (pair Data Data) = data_operand#14 in +let anf#12 : Data = mapData outer#8 in +let inner#9 : list (pair Data Data) = outer#8 in +\x#10 : int -> constr 0 inner#9 x#10 in +anf#13 7 +--- isolated cleaned Core +let data_operand#14 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#11 : Data = mapData data_operand#14 in +let anf#12 : Data = mapData data_operand#14 in +constr 0 data_operand#14 7 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_11 + [(lam anf_13 [anf_13 (con integer 7)]) + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] + (delay + [(lam outer_8 + [(lam anf_12 + [(lam generated_15 + (force + [[[[[[(force (builtin chooseData)) generated_15] (delay (error))] + (delay + [(lam inner_9 (lam x_10 (constr 0 inner_9 x_10))) + [(builtin unMapData) generated_15]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_12]) + [(builtin mapData) outer_8]]) + [(builtin unMapData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_11]]) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_14 + [(lam anf_11 + [(lam anf_12 (constr 0 data_operand_14 (con integer 7))) + [(builtin mapData) data_operand_14]]) + [(builtin mapData) data_operand_14]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- result +(constr 0 + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + (con integer 7)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_empty_used_false.snap new file mode 100644 index 00000000..0e6c0fdf --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_empty_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list data) []) of + DataMap payload#49 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_50 + (force + [[[[[[(force (builtin chooseData)) generated_50] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list data) [])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list data) []) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list data) [])]]) +--- isolated pass +--- isolated ANF input +let anf#50 : Data = mapData (con (list data) []) in +case@Data anf#50 of + DataMap payload#49 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#51 : list Data = (con (list data) []) in +let anf#50 : Data = mapData data_operand#51 in +let payload#49 : list (pair Data Data) = data_operand#51 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#50 : Data = mapData (con (list data) []) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_50 + [(lam generated_51 + (force + [[[[[[(force (builtin chooseData)) generated_51] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_50]) + [(builtin mapData) (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_50 (con (list (pair data data)) [])) + [(builtin mapData) (con (list data) [])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_empty_used_true.snap new file mode 100644 index 00000000..8e7dcbb2 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_empty_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list data) []) of + DataMap payload#52 -> payload#52 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_53 + (force + [[[[[[(force (builtin chooseData)) generated_53] (delay (error))] + (delay [(lam payload_52 payload_52) [(builtin unMapData) generated_53]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list data) [])]]) +--- optimized Core +let data_operand#3 : list Data = (con (list data) []) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list data) [])]) +--- isolated pass +--- isolated ANF input +let anf#53 : Data = mapData (con (list data) []) in +case@Data anf#53 of + DataMap payload#52 -> payload#52 +--- isolated folded Core +let data_operand#54 : list Data = (con (list data) []) in +let anf#53 : Data = mapData data_operand#54 in +let payload#52 : list (pair Data Data) = data_operand#54 in +payload#52 +--- isolated cleaned Core +let data_operand#54 : list Data = (con (list data) []) in +let anf#53 : Data = mapData data_operand#54 in +data_operand#54 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_53 + [(lam generated_54 + (force + [[[[[[(force (builtin chooseData)) generated_54] (delay (error))] + (delay [(lam payload_52 payload_52) [(builtin unMapData) generated_54]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_53]) + [(builtin mapData) (con (list data) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_54 + [(lam anf_53 data_operand_54) [(builtin mapData) data_operand_54]]) + (con (list data) [])]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_items_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_items_used_false.snap new file mode 100644 index 00000000..9b4a715f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_items_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list data) [(I 42)]) of + DataMap payload#55 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_56 + (force + [[[[[[(force (builtin chooseData)) generated_56] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list data) [(I 42)])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list data) [(I 42)]) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list data) [(I 42)])]]) +--- isolated pass +--- isolated ANF input +let anf#56 : Data = mapData (con (list data) [(I 42)]) in +case@Data anf#56 of + DataMap payload#55 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#57 : list Data = (con (list data) [(I 42)]) in +let anf#56 : Data = mapData data_operand#57 in +let payload#55 : list (pair Data Data) = data_operand#57 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#56 : Data = mapData (con (list data) [(I 42)]) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_56 + [(lam generated_57 + (force + [[[[[[(force (builtin chooseData)) generated_57] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_56]) + [(builtin mapData) (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_56 (con (list (pair data data)) [])) + [(builtin mapData) (con (list data) [(I 42)])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, [Data(Integer(42))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_items_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_items_used_true.snap new file mode 100644 index 00000000..7ce1bafc --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_other_items_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list data) [(I 42)]) of + DataMap payload#58 -> payload#58 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_59 + (force + [[[[[[(force (builtin chooseData)) generated_59] (delay (error))] + (delay [(lam payload_58 payload_58) [(builtin unMapData) generated_59]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list data) [(I 42)])]]) +--- optimized Core +let data_operand#3 : list Data = (con (list data) [(I 42)]) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list data) [(I 42)])]) +--- isolated pass +--- isolated ANF input +let anf#59 : Data = mapData (con (list data) [(I 42)]) in +case@Data anf#59 of + DataMap payload#58 -> payload#58 +--- isolated folded Core +let data_operand#60 : list Data = (con (list data) [(I 42)]) in +let anf#59 : Data = mapData data_operand#60 in +let payload#58 : list (pair Data Data) = data_operand#60 in +payload#58 +--- isolated cleaned Core +let data_operand#60 : list Data = (con (list data) [(I 42)]) in +let anf#59 : Data = mapData data_operand#60 in +data_operand#60 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_59 + [(lam generated_60 + (force + [[[[[[(force (builtin chooseData)) generated_60] (delay (error))] + (delay [(lam payload_58 payload_58) [(builtin unMapData) generated_60]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_59]) + [(builtin mapData) (con (list data) [(I 42)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_60 + [(lam anf_59 data_operand_60) [(builtin mapData) data_operand_60]]) + (con (list data) [(I 42)])]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, [Data(Integer(42))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_overapplied.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_overapplied.snap new file mode 100644 index 00000000..59d03329 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_overapplied.snap @@ -0,0 +1,91 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) 0 of + DataMap payload#13 -> payload#13 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [[(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])] + (con integer 0)]]) +--- optimized Core +let anf#2 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#3 : Data = anf#2 0 in +case@Data anf#3 of + DataMap payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_8 + [(lam anf_4 + [(lam anf_5 + [(lam generated_7 + (force + [[[[[[builtin_8 generated_7] (delay (error))] + (delay [(lam payload_6 payload_6) [(builtin unMapData) generated_7]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_5]) + [anf_4 (con integer 0)]]) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#14 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#15 : Data = anf#14 0 in +case@Data anf#15 of + DataMap payload#13 -> payload#13 +--- isolated folded Core +let anf#14 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#15 : Data = anf#14 0 in +case@Data anf#15 of + DataMap payload#13 -> payload#13 +--- isolated cleaned Core +let anf#14 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#15 : Data = anf#14 0 in +case@Data anf#15 of + DataMap payload#13 -> payload#13 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_14 + [(lam anf_15 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_16]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_15]) + [anf_14 (con integer 0)]]) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_14 + [(lam anf_15 + [(lam generated_16 + (force + [[[[[[(force (builtin chooseData)) generated_16] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_16]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_15]) + [anf_14 (con integer 0)]]) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]]) +--- result +error: NonFunctionApplication(Con(Integer(0)), Con(Data(Map([(Integer(42), Integer(7)), (Integer(7), Integer(42)), (Integer(42), Integer(42))])))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_parameter_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_parameter_false.snap new file mode 100644 index 00000000..4330a21c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_parameter_false.snap @@ -0,0 +1,67 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) of + DataMap payload#23 -> payload#23 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_24 + (force + [[[[[[(force (builtin chooseData)) generated_24] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_23 payload_23) [(builtin unMapData) generated_24]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]]) +--- optimized Core +let data_operand#3 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- isolated pass +--- isolated ANF input +let anf#24 : Data = mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data anf#24 of + DataMap payload#23 -> payload#23 + _ -> trace "cold" in error +--- isolated folded Core +let data_operand#25 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#24 : Data = mapData data_operand#25 in +let payload#23 : list (pair Data Data) = data_operand#25 in +payload#23 +--- isolated cleaned Core +let data_operand#25 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#24 : Data = mapData data_operand#25 in +data_operand#25 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_24 + [(lam generated_25 + (force + [[[[[[(force (builtin chooseData)) generated_25] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_23 payload_23) [(builtin unMapData) generated_25]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_24]) + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_25 + [(lam anf_24 data_operand_25) [(builtin mapData) data_operand_25]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- result +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_parameter_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_parameter_true.snap new file mode 100644 index 00000000..7b4e2ce2 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_parameter_true.snap @@ -0,0 +1,67 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\input#26 : list (pair Data Data) -> case@Data mapData input#26 of + DataMap payload#27 -> payload#27 + _ -> trace "cold" in error) (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- unoptimized UPLC +(program 1.1.0 + [(lam input_26 + [(lam generated_28 + (force + [[[[[[(force (builtin chooseData)) generated_28] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_27 payload_27) [(builtin unMapData) generated_28]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + [(builtin mapData) input_26]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- optimized Core +let data_operand#4 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#3 : Data = mapData data_operand#4 in +data_operand#4 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_2 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- isolated pass +--- isolated ANF input +(\input#26 : list (pair Data Data) -> let anf#28 : Data = mapData input#26 in +case@Data anf#28 of + DataMap payload#27 -> payload#27 + _ -> trace "cold" in error) (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- isolated folded Core +(\input#26 : list (pair Data Data) -> let anf#28 : Data = mapData input#26 in +let payload#27 : list (pair Data Data) = input#26 in +payload#27) (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- isolated cleaned Core +let input#26 : list (pair Data Data) = (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let anf#28 : Data = mapData input#26 in +input#26 +--- isolated UPLC before +(program 1.1.0 + [(lam input_26 + [(lam anf_28 + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay [(lam payload_27 payload_27) [(builtin unMapData) generated_29]])] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))] + (delay (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))])) + anf_28]) + [(builtin mapData) input_26]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam input_26 [(lam anf_28 input_26) [(builtin mapData) input_26]]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])]) +--- result +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_partial.snap new file mode 100644 index 00000000..e157e613 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_partial.snap @@ -0,0 +1,66 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData of + DataMap payload#13 -> payload#13 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin mapData)]) +--- optimized Core +case@Data mapData of + DataMap payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam generated_3 + (force + [[[[[[builtin_4 generated_3] (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unMapData) generated_3]])] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin mapData)]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +case@Data mapData of + DataMap payload#13 -> payload#13 +--- isolated folded Core +case@Data mapData of + DataMap payload#13 -> payload#13 +--- isolated cleaned Core +case@Data mapData of + DataMap payload#13 -> payload#13 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin mapData)]) +--- isolated UPLC after +(program 1.1.0 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))])) + (builtin mapData)]) +--- result +error: NotAConstant(Builtin(Runtime { args: [], fun: MapData, forces: 0 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_producer.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_producer.snap new file mode 100644 index 00000000..6bb2bc2f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_producer.snap @@ -0,0 +1,56 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data data)) []) of + _ -> 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (force + [[[[[[(force (builtin chooseData)) generated_1] (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))])) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- optimized Core +let anf#1 : Data = mapData (con (list (pair data data)) []) in +42 +--- optimized UPLC +(program 1.1.0 + [(lam anf_2 (con integer 42)) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- isolated pass +--- isolated ANF input +let anf#3 : Data = mapData (con (list (pair data data)) []) in +case@Data anf#3 of + _ -> 42 +--- isolated folded Core +let data_operand#4 : list (pair Data Data) = (con (list (pair data data)) []) in +let anf#3 : Data = mapData data_operand#4 in +42 +--- isolated cleaned Core +let anf#3 : Data = mapData (con (list (pair data data)) []) in +42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_3 + [(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))] + (delay (con integer 42))])) + anf_3]) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_3 (con integer 42)) + [(builtin mapData) (con (list (pair data data)) [])]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_shared_escape.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_shared_escape.snap new file mode 100644 index 00000000..f3b6f549 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_shared_escape.snap @@ -0,0 +1,119 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#22 : Data = mapData (trace "once" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) in +let alias#23 : Data = data#22 in +constr 0 data#22 (case@Data alias#23 of + DataMap payload#24 -> payload#24) (case@Data alias#23 of + DataMap payload#25 -> payload#25) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_22 + [(lam alias_23 + (constr 0 + data_22 + [(lam generated_26 + (force + [[[[[[(force (builtin chooseData)) generated_26] (delay (error))] + (delay [(lam payload_24 payload_24) [(builtin unMapData) generated_26]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_23] + [(lam generated_27 + (force + [[[[[[(force (builtin chooseData)) generated_27] (delay (error))] + (delay [(lam payload_25 payload_25) [(builtin unMapData) generated_27]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_23])) + data_22]) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "once")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]]) +--- optimized Core +let anf#5 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#1 : Data = mapData anf#5 in +constr 0 data#1 anf#5 anf#5 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam anf_2 + [(lam data_3 (constr 0 data_3 anf_2 anf_2)) [(builtin mapData) anf_2]]) + (force + [[builtin_4 (con string "once")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#26 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#22 : Data = mapData anf#26 in +let alias#23 : Data = data#22 in +let anf#27 : list (pair Data Data) = case@Data alias#23 of + DataMap payload#24 -> payload#24 in +let anf#28 : list (pair Data Data) = case@Data alias#23 of + DataMap payload#25 -> payload#25 in +constr 0 data#22 anf#27 anf#28 +--- isolated folded Core +let anf#26 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#22 : Data = mapData anf#26 in +let alias#23 : Data = data#22 in +let anf#27 : list (pair Data Data) = let payload#24 : list (pair Data Data) = anf#26 in +payload#24 in +let anf#28 : list (pair Data Data) = let payload#25 : list (pair Data Data) = anf#26 in +payload#25 in +constr 0 data#22 anf#27 anf#28 +--- isolated cleaned Core +let anf#26 : list (pair Data Data) = trace "once" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#22 : Data = mapData anf#26 in +constr 0 data#22 anf#26 anf#26 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_26 + [(lam data_22 + [(lam alias_23 + [(lam anf_27 + [(lam anf_28 (constr 0 data_22 anf_27 anf_28)) + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] (delay (error))] + (delay [(lam payload_25 payload_25) [(builtin unMapData) generated_29]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_23]]) + [(lam generated_30 + (force + [[[[[[(force (builtin chooseData)) generated_30] (delay (error))] + (delay [(lam payload_24 payload_24) [(builtin unMapData) generated_30]])] + (delay (error))] + (delay (error))] + (delay (error))])) + alias_23]]) + data_22]) + [(builtin mapData) anf_26]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_26 + [(lam data_22 (constr 0 data_22 anf_26 anf_26)) [(builtin mapData) anf_26]]) + (force + [[(force (builtin trace)) (con string "once")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- result +(constr 0 + (con data (Map [(I 42, I 7), (I 7, I 42), (I 42, I 42)])) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) +--- logs +["once"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_strict_failure_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_strict_failure_false.snap new file mode 100644 index 00000000..0c2d581d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_strict_failure_false.snap @@ -0,0 +1,107 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#25 : Data = mapData (trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) in +let effect#27 : int = trace "between" in 0 in +case@Data data#25 of + DataMap payload#26 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_25 + [(lam effect_27 + [(lam generated_28 + (force + [[[[[[(force (builtin chooseData)) generated_28] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_25]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]]) +--- optimized Core +let anf#4 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#1 : Data = mapData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) anf_3]]) + (force + [[builtin_7 (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#28 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#25 : Data = mapData anf#28 in +let effect#27 : int = trace "between" in 0 in +case@Data data#25 of + DataMap payload#26 -> trace "selected" in 9 +--- isolated folded Core +let anf#28 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#25 : Data = mapData anf#28 in +let effect#27 : int = trace "between" in 0 in +let payload#26 : list (pair Data Data) = anf#28 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#28 : list (pair Data Data) = trace "operand" in (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +let data#25 : Data = mapData anf#28 in +let effect#27 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_28 + [(lam data_25 + [(lam effect_27 + [(lam generated_29 + (force + [[[[[[(force (builtin chooseData)) generated_29] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_25]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) anf_28]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_28 + [(lam data_25 + [(lam effect_27 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) anf_28]]) + (force + [[(force (builtin trace)) (con string "operand")] + (delay + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]))])]) +--- result +(con integer 9) +--- logs +["operand", "between", "selected"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_strict_failure_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_strict_failure_true.snap new file mode 100644 index 00000000..9a03acb1 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_strict_failure_true.snap @@ -0,0 +1,95 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#29 : Data = mapData (trace "operand" in error) in +let effect#31 : int = trace "between" in 0 in +case@Data data#29 of + DataMap payload#30 -> trace "selected" in 9 +--- unoptimized UPLC +(program 1.1.0 + [(lam data_29 + [(lam effect_31 + [(lam generated_32 + (force + [[[[[[(force (builtin chooseData)) generated_32] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_29]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]]) +--- optimized Core +let anf#4 : list (pair Data Data) = trace "operand" in error in +let data#1 : Data = mapData anf#4 in +let effect#2 : int = trace "between" in 0 in +trace "selected" in 9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam data_5 + [(lam effect_6 + (force [[builtin_7 (con string "selected")] (delay (con integer 9))])) + (force [[builtin_7 (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) anf_3]]) + (force [[builtin_7 (con string "operand")] (delay (error))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#32 : list (pair Data Data) = trace "operand" in error in +let data#29 : Data = mapData anf#32 in +let effect#31 : int = trace "between" in 0 in +case@Data data#29 of + DataMap payload#30 -> trace "selected" in 9 +--- isolated folded Core +let anf#32 : list (pair Data Data) = trace "operand" in error in +let data#29 : Data = mapData anf#32 in +let effect#31 : int = trace "between" in 0 in +let payload#30 : list (pair Data Data) = anf#32 in +trace "selected" in 9 +--- isolated cleaned Core +let anf#32 : list (pair Data Data) = trace "operand" in error in +let data#29 : Data = mapData anf#32 in +let effect#31 : int = trace "between" in 0 in +trace "selected" in 9 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_32 + [(lam data_29 + [(lam effect_31 + [(lam generated_33 + (force + [[[[[[(force (builtin chooseData)) generated_33] (delay (error))] + (delay + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))]))] + (delay (error))] + (delay (error))] + (delay (error))])) + data_29]) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) anf_32]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_32 + [(lam data_29 + [(lam effect_31 + (force + [[(force (builtin trace)) (con string "selected")] (delay (con integer 9))])) + (force + [[(force (builtin trace)) (con string "between")] (delay (con integer 0))])]) + [(builtin mapData) anf_32]]) + (force [[(force (builtin trace)) (con string "operand")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["operand"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_traced.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_traced.snap new file mode 100644 index 00000000..30c130e7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_traced.snap @@ -0,0 +1,94 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data (trace "producer" in mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])) of + DataMap payload#13 -> payload#13 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_14 + (force + [[[[[[(force (builtin chooseData)) generated_14] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_14]])] + (delay (error))] + (delay (error))] + (delay (error))])) + (force + [[(force (builtin trace)) (con string "producer")] + (delay + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])])])]) +--- optimized Core +let anf#2 : Data = trace "producer" in mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data anf#2 of + DataMap payload#1 -> payload#1 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_6 + [(lam builtin_7 + [(lam anf_3 + [(lam generated_5 + (force + [[[[[[builtin_6 generated_5] (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unMapData) generated_5]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_3]) + (force + [[builtin_7 (con string "producer")] + (delay + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])])])]) + (force (builtin trace))]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +let anf#16 : Data = trace "producer" in mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data anf#16 of + DataMap payload#13 -> payload#13 +--- isolated folded Core +let anf#16 : Data = trace "producer" in mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data anf#16 of + DataMap payload#13 -> payload#13 +--- isolated cleaned Core +let anf#16 : Data = trace "producer" in mapData (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) in +case@Data anf#16 of + DataMap payload#13 -> payload#13 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_16 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_17]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_16]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])])])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_16 + [(lam generated_17 + (force + [[[[[[(force (builtin chooseData)) generated_17] (delay (error))] + (delay [(lam payload_13 payload_13) [(builtin unMapData) generated_17]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_16]) + (force + [[(force (builtin trace)) (con string "producer")] + (delay + [(builtin mapData) + (con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))])])])]) +--- result +(con (list (pair data data)) [((I 42), (I 7)), ((I 7), (I 42)), ((I 42), (I 42))]) +--- logs +["producer"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_empty_used_false.snap new file mode 100644 index 00000000..83649cb8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_empty_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list integer) []) of + DataMap payload#73 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_74 + (force + [[[[[[(force (builtin chooseData)) generated_74] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list integer) [])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list integer) []) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list integer) [])]]) +--- isolated pass +--- isolated ANF input +let anf#74 : Data = mapData (con (list integer) []) in +case@Data anf#74 of + DataMap payload#73 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#75 : list int = (con (list integer) []) in +let anf#74 : Data = mapData data_operand#75 in +let payload#73 : list (pair Data Data) = data_operand#75 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#74 : Data = mapData (con (list integer) []) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_74 + [(lam generated_75 + (force + [[[[[[(force (builtin chooseData)) generated_75] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_74]) + [(builtin mapData) (con (list integer) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_74 (con (list (pair data data)) [])) + [(builtin mapData) (con (list integer) [])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Integer, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_empty_used_true.snap new file mode 100644 index 00000000..97f1197e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_empty_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list integer) []) of + DataMap payload#76 -> payload#76 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_77 + (force + [[[[[[(force (builtin chooseData)) generated_77] (delay (error))] + (delay [(lam payload_76 payload_76) [(builtin unMapData) generated_77]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list integer) [])]]) +--- optimized Core +let data_operand#3 : list int = (con (list integer) []) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list integer) [])]) +--- isolated pass +--- isolated ANF input +let anf#77 : Data = mapData (con (list integer) []) in +case@Data anf#77 of + DataMap payload#76 -> payload#76 +--- isolated folded Core +let data_operand#78 : list int = (con (list integer) []) in +let anf#77 : Data = mapData data_operand#78 in +let payload#76 : list (pair Data Data) = data_operand#78 in +payload#76 +--- isolated cleaned Core +let data_operand#78 : list int = (con (list integer) []) in +let anf#77 : Data = mapData data_operand#78 in +data_operand#78 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_77 + [(lam generated_78 + (force + [[[[[[(force (builtin chooseData)) generated_78] (delay (error))] + (delay [(lam payload_76 payload_76) [(builtin unMapData) generated_78]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_77]) + [(builtin mapData) (con (list integer) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_78 + [(lam anf_77 data_operand_78) [(builtin mapData) data_operand_78]]) + (con (list integer) [])]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Integer, []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_items_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_items_used_false.snap new file mode 100644 index 00000000..e261edf7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_items_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list integer) [7]) of + DataMap payload#79 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_80 + (force + [[[[[[(force (builtin chooseData)) generated_80] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list integer) [7])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list integer) [7]) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list integer) [7])]]) +--- isolated pass +--- isolated ANF input +let anf#80 : Data = mapData (con (list integer) [7]) in +case@Data anf#80 of + DataMap payload#79 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#81 : list int = (con (list integer) [7]) in +let anf#80 : Data = mapData data_operand#81 in +let payload#79 : list (pair Data Data) = data_operand#81 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#80 : Data = mapData (con (list integer) [7]) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_80 + [(lam generated_81 + (force + [[[[[[(force (builtin chooseData)) generated_81] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_80]) + [(builtin mapData) (con (list integer) [7])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_80 (con (list (pair data data)) [])) + [(builtin mapData) (con (list integer) [7])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Integer, [Integer(7)]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_items_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_items_used_true.snap new file mode 100644 index 00000000..9e96de23 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_items_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list integer) [7]) of + DataMap payload#82 -> payload#82 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_83 + (force + [[[[[[(force (builtin chooseData)) generated_83] (delay (error))] + (delay [(lam payload_82 payload_82) [(builtin unMapData) generated_83]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list integer) [7])]]) +--- optimized Core +let data_operand#3 : list int = (con (list integer) [7]) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list integer) [7])]) +--- isolated pass +--- isolated ANF input +let anf#83 : Data = mapData (con (list integer) [7]) in +case@Data anf#83 of + DataMap payload#82 -> payload#82 +--- isolated folded Core +let data_operand#84 : list int = (con (list integer) [7]) in +let anf#83 : Data = mapData data_operand#84 in +let payload#82 : list (pair Data Data) = data_operand#84 in +payload#82 +--- isolated cleaned Core +let data_operand#84 : list int = (con (list integer) [7]) in +let anf#83 : Data = mapData data_operand#84 in +data_operand#84 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_83 + [(lam generated_84 + (force + [[[[[[(force (builtin chooseData)) generated_84] (delay (error))] + (delay [(lam payload_82 payload_82) [(builtin unMapData) generated_84]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_83]) + [(builtin mapData) (con (list integer) [7])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_84 + [(lam anf_83 data_operand_84) [(builtin mapData) data_operand_84]]) + (con (list integer) [7])]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Integer, [Integer(7)]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_empty_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_empty_used_false.snap new file mode 100644 index 00000000..d277a98c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_empty_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data integer)) []) of + DataMap payload#85 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_86 + (force + [[[[[[(force (builtin chooseData)) generated_86] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list (pair data integer)) [])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list (pair data integer)) []) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list (pair data integer)) [])]]) +--- isolated pass +--- isolated ANF input +let anf#86 : Data = mapData (con (list (pair data integer)) []) in +case@Data anf#86 of + DataMap payload#85 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#87 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#86 : Data = mapData data_operand#87 in +let payload#85 : list (pair Data Data) = data_operand#87 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#86 : Data = mapData (con (list (pair data integer)) []) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_86 + [(lam generated_87 + (force + [[[[[[(force (builtin chooseData)) generated_87] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_86]) + [(builtin mapData) (con (list (pair data integer)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_86 (con (list (pair data data)) [])) + [(builtin mapData) (con (list (pair data integer)) [])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Pair(Data, Integer), []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_empty_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_empty_used_true.snap new file mode 100644 index 00000000..13d54ff7 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_empty_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data integer)) []) of + DataMap payload#88 -> payload#88 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_89 + (force + [[[[[[(force (builtin chooseData)) generated_89] (delay (error))] + (delay [(lam payload_88 payload_88) [(builtin unMapData) generated_89]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list (pair data integer)) [])]]) +--- optimized Core +let data_operand#3 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list (pair data integer)) [])]) +--- isolated pass +--- isolated ANF input +let anf#89 : Data = mapData (con (list (pair data integer)) []) in +case@Data anf#89 of + DataMap payload#88 -> payload#88 +--- isolated folded Core +let data_operand#90 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#89 : Data = mapData data_operand#90 in +let payload#88 : list (pair Data Data) = data_operand#90 in +payload#88 +--- isolated cleaned Core +let data_operand#90 : list (pair Data int) = (con (list (pair data integer)) []) in +let anf#89 : Data = mapData data_operand#90 in +data_operand#90 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_89 + [(lam generated_90 + (force + [[[[[[(force (builtin chooseData)) generated_90] (delay (error))] + (delay [(lam payload_88 payload_88) [(builtin unMapData) generated_90]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_89]) + [(builtin mapData) (con (list (pair data integer)) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_90 + [(lam anf_89 data_operand_90) [(builtin mapData) data_operand_90]]) + (con (list (pair data integer)) [])]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Pair(Data, Integer), []))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_items_used_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_items_used_false.snap new file mode 100644 index 00000000..e90669f4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_items_used_false.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data integer)) [((I 42), 7)]) of + DataMap payload#91 -> (con (list (pair data data)) []) +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_92 + (force + [[[[[[(force (builtin chooseData)) generated_92] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- optimized Core +let anf#2 : Data = mapData (con (list (pair data integer)) [((I 42), 7)]) in +(con (list (pair data data)) []) +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 (con (list (pair data data)) [])) + [(builtin mapData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- isolated pass +--- isolated ANF input +let anf#92 : Data = mapData (con (list (pair data integer)) [((I 42), 7)]) in +case@Data anf#92 of + DataMap payload#91 -> (con (list (pair data data)) []) +--- isolated folded Core +let data_operand#93 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#92 : Data = mapData data_operand#93 in +let payload#91 : list (pair Data Data) = data_operand#93 in +(con (list (pair data data)) []) +--- isolated cleaned Core +let anf#92 : Data = mapData (con (list (pair data integer)) [((I 42), 7)]) in +(con (list (pair data data)) []) +--- isolated UPLC before +(program 1.1.0 + [(lam anf_92 + [(lam generated_93 + (force + [[[[[[(force (builtin chooseData)) generated_93] (delay (error))] + (delay (con (list (pair data data)) []))] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_92]) + [(builtin mapData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_92 (con (list (pair data data)) [])) + [(builtin mapData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Pair(Data, Integer), [ProtoPair(Data, Integer, Data(Integer(42)), Integer(7))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_items_used_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_items_used_true.snap new file mode 100644 index 00000000..1d8495cb --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__map_wrong_pair_items_used_true.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data mapData (con (list (pair data integer)) [((I 42), 7)]) of + DataMap payload#94 -> payload#94 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_95 + (force + [[[[[[(force (builtin chooseData)) generated_95] (delay (error))] + (delay [(lam payload_94 payload_94) [(builtin unMapData) generated_95]])] + (delay (error))] + (delay (error))] + (delay (error))])) + [(builtin mapData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- optimized Core +let data_operand#3 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#2 : Data = mapData data_operand#3 in +data_operand#3 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam anf_4 data_operand_1) [(builtin mapData) data_operand_1]]) + (con (list (pair data integer)) [((I 42), 7)])]) +--- isolated pass +--- isolated ANF input +let anf#95 : Data = mapData (con (list (pair data integer)) [((I 42), 7)]) in +case@Data anf#95 of + DataMap payload#94 -> payload#94 +--- isolated folded Core +let data_operand#96 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#95 : Data = mapData data_operand#96 in +let payload#94 : list (pair Data Data) = data_operand#96 in +payload#94 +--- isolated cleaned Core +let data_operand#96 : list (pair Data int) = (con (list (pair data integer)) [((I 42), 7)]) in +let anf#95 : Data = mapData data_operand#96 in +data_operand#96 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_95 + [(lam generated_96 + (force + [[[[[[(force (builtin chooseData)) generated_96] (delay (error))] + (delay [(lam payload_94 payload_94) [(builtin unMapData) generated_96]])] + (delay (error))] + (delay (error))] + (delay (error))])) + anf_95]) + [(builtin mapData) (con (list (pair data integer)) [((I 42), 7)])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_96 + [(lam anf_95 data_operand_96) [(builtin mapData) data_operand_96]]) + (con (list (pair data integer)) [((I 42), 7)])]) +--- result +error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Pair(Data, Integer), [ProtoPair(Data, Integer, Data(Integer(42)), Integer(7))]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__nested_returned_function.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__nested_returned_function.snap new file mode 100644 index 00000000..db2254b6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__nested_returned_function.snap @@ -0,0 +1,94 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(case@Data iData 40 of + DataI payload#1 -> case@Data iData payload#1 of + DataI inner#2 -> \x#3 : int -> addInteger inner#2 x#3) 2 +--- unoptimized UPLC +(program 1.1.0 + [[(lam generated_4 + (force + [[[[[[(force (builtin chooseData)) generated_4] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam payload_1 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam inner_2 (lam x_3 [[(builtin addInteger) inner_2] x_3])) + [(builtin unIData) generated_5]])] + (delay (error))])) + [(builtin iData) payload_1]]) + [(builtin unIData) generated_4]])] + (delay (error))])) + [(builtin iData) (con integer 40)]] + (con integer 2)]) +--- optimized Core +let anf#7 : Data = iData 40 in +let anf#8 : Data = iData 40 in +addInteger 40 2 +--- optimized UPLC +(program 1.1.0 + [(lam anf_1 + [(lam anf_2 [[(builtin addInteger) (con integer 40)] (con integer 2)]) + [(builtin iData) (con integer 40)]]) + [(builtin iData) (con integer 40)]]) +--- isolated pass +--- isolated ANF input +let anf#4 : Data = iData 40 in +let anf#6 : int -> int = case@Data anf#4 of + DataI payload#1 -> let anf#5 : Data = iData payload#1 in + case@Data anf#5 of + DataI inner#2 -> \x#3 : int -> addInteger inner#2 x#3 in +anf#6 2 +--- isolated folded Core +let data_operand#7 : int = 40 in +let anf#4 : Data = iData data_operand#7 in +let anf#6 : int -> int = let payload#1 : int = data_operand#7 in +let anf#5 : Data = iData payload#1 in +let inner#2 : int = payload#1 in +\x#3 : int -> addInteger inner#2 x#3 in +anf#6 2 +--- isolated cleaned Core +let anf#4 : Data = iData 40 in +let anf#5 : Data = iData 40 in +addInteger 40 2 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_6 [anf_6 (con integer 2)]) + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam payload_1 + [(lam anf_5 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay + [(lam inner_2 (lam x_3 [[(builtin addInteger) inner_2] x_3])) + [(builtin unIData) generated_8]])] + (delay (error))])) + anf_5]) + [(builtin iData) payload_1]]) + [(builtin unIData) generated_7]])] + (delay (error))])) + anf_4]]) + [(builtin iData) (con integer 40)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 [[(builtin addInteger) (con integer 40)] (con integer 2)]) + [(builtin iData) (con integer 40)]]) + [(builtin iData) (con integer 40)]]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__shared_long_bytes.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__shared_long_bytes.snap new file mode 100644 index 00000000..ccd663b9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__shared_long_bytes.snap @@ -0,0 +1,113 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let data#1 : Data = bData (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) in +constr 0 (case@Data data#1 of + DataB payload#2 -> payload#2) (case@Data data#1 of + DataB payload#3 -> payload#3) (case@Data data#1 of + DataB payload#4 -> payload#4) +--- unoptimized UPLC +(program 1.1.0 + [(lam data_1 + (constr 0 + [(lam generated_5 + (force + [[[[[[(force (builtin chooseData)) generated_5] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unBData) generated_5]])])) + data_1] + [(lam generated_6 + (force + [[[[[[(force (builtin chooseData)) generated_6] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_3 payload_3) [(builtin unBData) generated_6]])])) + data_1] + [(lam generated_7 + (force + [[[[[[(force (builtin chooseData)) generated_7] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unBData) generated_7]])])) + data_1])) + [(builtin bData) + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707)]]) +--- optimized Core +let data_operand#12 : bytes = (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) in +let data#5 : Data = bData data_operand#12 in +constr 0 data_operand#12 data_operand#12 data_operand#12 +--- optimized UPLC +(program 1.1.0 + [(lam data_operand_1 + [(lam data_2 (constr 0 data_operand_1 data_operand_1 data_operand_1)) + [(builtin bData) data_operand_1]]) + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707)]) +--- isolated pass +--- isolated ANF input +let data#1 : Data = bData (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) in +let anf#5 : bytes = case@Data data#1 of + DataB payload#2 -> payload#2 in +let anf#6 : bytes = case@Data data#1 of + DataB payload#3 -> payload#3 in +let anf#7 : bytes = case@Data data#1 of + DataB payload#4 -> payload#4 in +constr 0 anf#5 anf#6 anf#7 +--- isolated folded Core +let data_operand#8 : bytes = (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) in +let data#1 : Data = bData data_operand#8 in +let anf#5 : bytes = let payload#2 : bytes = data_operand#8 in +payload#2 in +let anf#6 : bytes = let payload#3 : bytes = data_operand#8 in +payload#3 in +let anf#7 : bytes = let payload#4 : bytes = data_operand#8 in +payload#4 in +constr 0 anf#5 anf#6 anf#7 +--- isolated cleaned Core +let data_operand#8 : bytes = (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) in +let data#1 : Data = bData data_operand#8 in +constr 0 data_operand#8 data_operand#8 data_operand#8 +--- isolated UPLC before +(program 1.1.0 + [(lam data_1 + [(lam anf_5 + [(lam anf_6 + [(lam anf_7 (constr 0 anf_5 anf_6 anf_7)) + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_4 payload_4) [(builtin unBData) generated_8]])])) + data_1]]) + [(lam generated_9 + (force + [[[[[[(force (builtin chooseData)) generated_9] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_3 payload_3) [(builtin unBData) generated_9]])])) + data_1]]) + [(lam generated_10 + (force + [[[[[[(force (builtin chooseData)) generated_10] (delay (error))] (delay (error))] + (delay (error))] + (delay (error))] + (delay [(lam payload_2 payload_2) [(builtin unBData) generated_10]])])) + data_1]]) + [(builtin bData) + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam data_operand_8 + [(lam data_1 (constr 0 data_operand_8 data_operand_8 data_operand_8)) + [(builtin bData) data_operand_8]]) + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707)]) +--- result +(constr 0 + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707) + (con bytestring #0707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070707)) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__unknown_data_parameter.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__unknown_data_parameter.snap new file mode 100644 index 00000000..eae6889d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrappers__unknown_data_parameter.snap @@ -0,0 +1,48 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +(\unknown#6 : Data -> case@Data unknown#6 of + DataI payload#7 -> payload#7) (con data (I 42)) +--- unoptimized UPLC +(program 1.1.0 + [(lam unknown_6 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_7 payload_7) [(builtin unIData) generated_8]])] + (delay (error))])) + unknown_6]) + (con data (I 42))]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +(\unknown#6 : Data -> case@Data unknown#6 of + DataI payload#7 -> payload#7) (con data (I 42)) +--- isolated folded Core +(\unknown#6 : Data -> case@Data unknown#6 of + DataI payload#7 -> payload#7) (con data (I 42)) +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam unknown_6 + [(lam generated_8 + (force + [[[[[[(force (builtin chooseData)) generated_8] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam payload_7 payload_7) [(builtin unIData) generated_8]])] + (delay (error))])) + unknown_6]) + (con data (I 42))]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrong_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrong_subject.snap new file mode 100644 index 00000000..38c38102 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrong_subject.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@Data 42 of + DataI number#1 -> number#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (con integer 42)]) +--- optimized Core +case@Data 42 of + DataI number#2 -> number#2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam generated_2 + (force + [[[[[[builtin_3 generated_2] (delay (error))] (delay (error))] (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (con integer 42)]) + (force (builtin chooseData))]) +--- isolated pass +--- isolated ANF input +case@Data 42 of + DataI number#1 -> number#1 +--- isolated folded Core +case@Data 42 of + DataI number#1 -> number#1 +--- isolated cleaned Core +case@Data 42 of + DataI number#1 -> number#1 +--- isolated UPLC before +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (con integer 42)]) +--- isolated UPLC after +(program 1.1.0 + [(lam generated_2 + (force + [[[[[[(force (builtin chooseData)) generated_2] (delay (error))] (delay (error))] + (delay (error))] + (delay [(lam number_1 number_1) [(builtin unIData) generated_2]])] + (delay (error))])) + (con integer 42)]) +--- result +error: Runtime(NotData(Integer(42))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrong_test.snap new file mode 100644 index 00000000..ca5d7c57 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__data__wrong_test.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@Data (con data (I 42)) of + DataI p#1 -> 42 + True -> 9 +--- after +case@Data (con data (I 42)) of + DataI p#1 -> 42 + True -> 9 +--- errors +InvalidCase("non-Data test") +InvalidCase("non-Data test") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__bound_literal.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__bound_literal.snap new file mode 100644 index 00000000..ab853015 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__bound_literal.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let xs#13 : list int = (con (list integer) [21, 7]) in +let alias#14 : list int = xs#13 in +let alias2#15 : list int = alias#14 in +mkCons (addInteger (case@List alias2#15 of + Cons head#16 tail#17 -> head#16) (case@List alias2#15 of + Cons head#18 tail#19 -> head#18)) xs#13 +--- unoptimized UPLC +(program 1.1.0 + [(lam xs_13 + [(lam alias_14 + [(lam alias2_15 + [[(force (builtin mkCons)) + [[(builtin addInteger) + (case alias2_15 (lam head_16 (lam tail_17 head_16)) (error))] + (case alias2_15 (lam head_18 (lam tail_19 head_18)) (error))]] + xs_13]) + alias_14]) + xs_13]) + (con (list integer) [21, 7])]) +--- optimized Core +let anf#10 : int = addInteger 21 21 in +mkCons anf#10 (con (list integer) [21, 7]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam anf_1 [[builtin_2 anf_1] (con (list integer) [21, 7])]) + [[(builtin addInteger) (con integer 21)] (con integer 21)]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let xs#13 : list int = (con (list integer) [21, 7]) in +let alias#14 : list int = xs#13 in +let alias2#15 : list int = alias#14 in +let anf#20 : int = case@List alias2#15 of + Cons head#16 tail#17 -> head#16 in +let anf#21 : int = case@List alias2#15 of + Cons head#18 tail#19 -> head#18 in +let anf#22 : int = addInteger anf#20 anf#21 in +mkCons anf#22 xs#13 +--- isolated folded Core +let list_field#23 : int = 21 in +let list_field#24 : list int = (con (list integer) [7]) in +let xs#13 : list int = (con (list integer) [21, 7]) in +let alias#14 : list int = xs#13 in +let alias2#15 : list int = alias#14 in +let anf#20 : int = let head#16 : int = list_field#23 in +let tail#17 : list int = list_field#24 in +head#16 in +let anf#21 : int = let head#18 : int = list_field#23 in +let tail#19 : list int = list_field#24 in +head#18 in +let anf#22 : int = addInteger anf#20 anf#21 in +mkCons anf#22 xs#13 +--- isolated cleaned Core +let anf#22 : int = addInteger 21 21 in +mkCons anf#22 (con (list integer) [21, 7]) +--- isolated UPLC before +(program 1.1.0 + [(lam xs_13 + [(lam alias_14 + [(lam alias2_15 + [(lam anf_20 + [(lam anf_21 + [(lam anf_22 [[(force (builtin mkCons)) anf_22] xs_13]) + [[(builtin addInteger) anf_20] anf_21]]) + (case alias2_15 (lam head_18 (lam tail_19 head_18)) (error))]) + (case alias2_15 (lam head_16 (lam tail_17 head_16)) (error))]) + alias_14]) + xs_13]) + (con (list integer) [21, 7])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_22 [[(force (builtin mkCons)) anf_22] (con (list integer) [21, 7])]) + [[(builtin addInteger) (con integer 21)] (con integer 21)]]) +--- result +(con (list integer) [42, 21, 7]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__bound_mkcons.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__bound_mkcons.snap new file mode 100644 index 00000000..60964087 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__bound_mkcons.snap @@ -0,0 +1,100 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let xs#1 : list int = mkCons (trace "head" in 21) (con (list integer) [7]) in +let alias#2 : list int = xs#1 in +let alias2#3 : list int = alias#2 in +mkCons (addInteger (case@List alias2#3 of + Cons head#4 tail#5 -> head#4) (case@List alias2#3 of + Cons head#6 tail#7 -> head#6)) xs#1 +--- unoptimized UPLC +(program 1.1.0 + [(lam xs_1 + [(lam alias_2 + [(lam alias2_3 + [[(force (builtin mkCons)) + [[(builtin addInteger) (case alias2_3 (lam head_4 (lam tail_5 head_4)) (error))] + (case alias2_3 (lam head_6 (lam tail_7 head_6)) (error))]] + xs_1]) + alias_2]) + xs_1]) + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 21))])] + (con (list integer) [7])]]) +--- optimized Core +let anf#15 : int = trace "head" in 21 in +let xs#8 : list int = mkCons anf#15 (con (list integer) [7]) in +let anf#18 : int = addInteger anf#15 anf#15 in +mkCons anf#18 xs#8 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam builtin_5 + [(lam anf_1 + [(lam xs_2 + [(lam anf_3 [[builtin_4 anf_3] xs_2]) [[(builtin addInteger) anf_1] anf_1]]) + [[builtin_4 anf_1] (con (list integer) [7])]]) + (force [[builtin_5 (con string "head")] (delay (con integer 21))])]) + (force (builtin trace))]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#8 : int = trace "head" in 21 in +let xs#1 : list int = mkCons anf#8 (con (list integer) [7]) in +let alias#2 : list int = xs#1 in +let alias2#3 : list int = alias#2 in +let anf#9 : int = case@List alias2#3 of + Cons head#4 tail#5 -> head#4 in +let anf#10 : int = case@List alias2#3 of + Cons head#6 tail#7 -> head#6 in +let anf#11 : int = addInteger anf#9 anf#10 in +mkCons anf#11 xs#1 +--- isolated folded Core +let anf#8 : int = trace "head" in 21 in +let list_field#12 : list int = (con (list integer) [7]) in +let xs#1 : list int = mkCons anf#8 list_field#12 in +let alias#2 : list int = xs#1 in +let alias2#3 : list int = alias#2 in +let anf#9 : int = let head#4 : int = anf#8 in +let tail#5 : list int = list_field#12 in +head#4 in +let anf#10 : int = let head#6 : int = anf#8 in +let tail#7 : list int = list_field#12 in +head#6 in +let anf#11 : int = addInteger anf#9 anf#10 in +mkCons anf#11 xs#1 +--- isolated cleaned Core +let anf#8 : int = trace "head" in 21 in +let xs#1 : list int = mkCons anf#8 (con (list integer) [7]) in +let anf#11 : int = addInteger anf#8 anf#8 in +mkCons anf#11 xs#1 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_8 + [(lam xs_1 + [(lam alias_2 + [(lam alias2_3 + [(lam anf_9 + [(lam anf_10 + [(lam anf_11 [[(force (builtin mkCons)) anf_11] xs_1]) + [[(builtin addInteger) anf_9] anf_10]]) + (case alias2_3 (lam head_6 (lam tail_7 head_6)) (error))]) + (case alias2_3 (lam head_4 (lam tail_5 head_4)) (error))]) + alias_2]) + xs_1]) + [[(force (builtin mkCons)) anf_8] (con (list integer) [7])]]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 21))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_8 + [(lam xs_1 + [(lam anf_11 [[(force (builtin mkCons)) anf_11] xs_1]) + [[(builtin addInteger) anf_8] anf_8]]) + [[(force (builtin mkCons)) anf_8] (con (list integer) [7])]]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 21))])]) +--- result +(con (list integer) [42, 21, 7]) +--- logs +["head"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cold_match.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cold_match.snap new file mode 100644 index 00000000..0f1d924a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cold_match.snap @@ -0,0 +1,101 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let xs#1 : list int = mkCons (trace "head" in 42) (trace "tail" in (con (list integer) [])) in +case@Bool false of + True -> case@List xs#1 of + Cons head#2 tail#3 -> trace "cold" in head#2 + False -> trace "chosen" in 0 +--- unoptimized UPLC +(program 1.1.0 + [(lam xs_1 + (case + (con bool False) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]) + (case + xs_1 + (lam head_2 + (lam tail_3 + (force [[(force (builtin trace)) (con string "cold")] (delay head_2)]))) + (error)))) + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])] + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) []))])]]) +--- optimized Core +let anf#7 : int = trace "head" in 42 in +let anf#8 : list int = trace "tail" in (con (list integer) []) in +let xs#4 : list int = mkCons anf#7 anf#8 in +trace "chosen" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_2 + [(lam xs_3 (force [[builtin_4 (con string "chosen")] (delay (con integer 0))])) + [[builtin_5 anf_1] anf_2]]) + (force [[builtin_4 (con string "tail")] (delay (con (list integer) []))])]) + (force [[builtin_4 (con string "head")] (delay (con integer 42))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "head" in 42 in +let anf#5 : list int = trace "tail" in (con (list integer) []) in +let xs#1 : list int = mkCons anf#4 anf#5 in +case@Bool false of + True -> case@List xs#1 of + Cons head#2 tail#3 -> trace "cold" in head#2 + False -> trace "chosen" in 0 +--- isolated folded Core +let anf#4 : int = trace "head" in 42 in +let anf#5 : list int = trace "tail" in (con (list integer) []) in +let xs#1 : list int = mkCons anf#4 anf#5 in +case@Bool false of + True -> let head#2 : int = anf#4 in + let tail#3 : list int = anf#5 in + trace "cold" in head#2 + False -> trace "chosen" in 0 +--- isolated cleaned Core +let anf#4 : int = trace "head" in 42 in +let anf#5 : list int = trace "tail" in (con (list integer) []) in +let xs#1 : list int = mkCons anf#4 anf#5 in +trace "chosen" in 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam xs_1 + (case + (con bool False) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]) + (case + xs_1 + (lam head_2 + (lam tail_3 + (force [[(force (builtin trace)) (con string "cold")] (delay head_2)]))) + (error)))) + [[(force (builtin mkCons)) anf_4] anf_5]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) []))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam xs_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))])) + [[(force (builtin mkCons)) anf_4] anf_5]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) []))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- result +(con integer 0) +--- logs +["head", "tail", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_arity.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_arity.snap new file mode 100644 index 00000000..a85a6ca4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_arity.snap @@ -0,0 +1,13 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@List (con (list integer) []) of + Cons x#1 -> 42 +--- after +case@List (con (list integer) []) of + Cons x#1 -> 42 +--- errors +InvalidCase("invalid list branch") +InvalidCase("invalid list branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_default.snap new file mode 100644 index 00000000..992cb46c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_default.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) [42]) of + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) [42]) + (lam generated_2 + (lam generated_1 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) +--- optimized Core +trace "fallback" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) [42]) of + _ -> trace "fallback" in 42 +--- isolated folded Core +trace "fallback" in 42 +--- isolated cleaned Core +trace "fallback" in 42 +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) [42]) + (lam generated_2 + (lam generated_1 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_missing.snap new file mode 100644 index 00000000..6a851ba5 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__cons_missing.snap @@ -0,0 +1,35 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) [42]) of +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) [42]) + (lam generated_2 (lam generated_1 (error))) + (error))) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) [42]) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) [42]) + (lam generated_2 (lam generated_1 (error))) + (error))) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__data_tail_metadata.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__data_tail_metadata.snap new file mode 100644 index 00000000..1649ca12 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__data_tail_metadata.snap @@ -0,0 +1,39 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list data) [(I 21), (I 42)]) of + Cons head#1 tail#2 -> tail#2 +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list data) [(I 21), (I 42)]) + (lam head_1 (lam tail_2 tail_2)) + (error))) +--- optimized Core +(con (list data) [(I 42)]) +--- optimized UPLC +(program 1.1.0 (con (list data) [(I 42)])) +--- isolated pass +--- isolated ANF input +case@List (con (list data) [(I 21), (I 42)]) of + Cons head#1 tail#2 -> tail#2 +--- isolated folded Core +let head#1 : Data = (con data (I 21)) in +let tail#2 : list Data = (con (list data) [(I 42)]) in +tail#2 +--- isolated cleaned Core +(con (list data) [(I 42)]) +--- isolated UPLC before +(program 1.1.0 + (case + (con (list data) [(I 21), (I 42)]) + (lam head_1 (lam tail_2 tail_2)) + (error))) +--- isolated UPLC after +(program 1.1.0 (con (list data) [(I 42)])) +--- result +(con (list data) [(I 42)]) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__delay_head.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__delay_head.snap new file mode 100644 index 00000000..ba9f8422 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__delay_head.snap @@ -0,0 +1,78 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (delay (let p#37 : int = 42 in +p#37)) (trace "tail" in (con (list integer) [7])) of + Nil -> trace "cold" in error + Cons ignored#38 ignored#39 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) (delay [(lam p_37 p_37) (con integer 42)])] + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])] + (lam ignored_38 + (lam ignored_39 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#4 : list int = trace "tail" in (con (list integer) [7]) in +let anf#5 : list int = mkCons (delay 42) anf#4 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam builtin_4 + [(lam anf_1 + [(lam anf_2 (force [[builtin_3 (con string "body")] (delay (con integer 21))])) + [[builtin_4 (delay (con integer 42))] anf_1]]) + (force [[builtin_3 (con string "tail")] (delay (con (list integer) [7]))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#40 : list int = trace "tail" in (con (list integer) [7]) in +let anf#41 : list int = mkCons (delay (let p#37 : int = 42 in +p#37)) anf#40 in +case@List anf#41 of + Nil -> trace "cold" in error + Cons ignored#38 ignored#39 -> trace "body" in 21 +--- isolated folded Core +let anf#40 : list int = trace "tail" in (con (list integer) [7]) in +let list_field#42 : @delay int = delay (let p#37 : int = 42 in +p#37) in +let anf#41 : list int = mkCons list_field#42 anf#40 in +let ignored#38 : int = list_field#42 in +let ignored#39 : list int = anf#40 in +trace "body" in 21 +--- isolated cleaned Core +let anf#40 : list int = trace "tail" in (con (list integer) [7]) in +let anf#41 : list int = mkCons (delay 42) anf#40 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_40 + [(lam anf_41 + (case + anf_41 + (lam ignored_38 + (lam ignored_39 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) (delay [(lam p_37 p_37) (con integer 42)])] anf_40]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_40 + [(lam anf_41 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) (delay (con integer 42))] anf_40]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) +--- result +error: NotAConstant(Delay(Constant(Integer(42)), Cons { data: Con(ProtoList(Integer, [Integer(7)])), next: Empty })) +--- logs +["tail"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__duplicate_cons.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__duplicate_cons.snap new file mode 100644 index 00000000..2f2c975d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__duplicate_cons.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@List (con (list integer) []) of + Cons x#1 tail#2 -> 42 + Cons x#1 tail#2 -> 42 +--- after +case@List (con (list integer) []) of + Cons x#1 tail#2 -> 42 + Cons x#1 tail#2 -> 42 +--- errors +InvalidCase("invalid list branch") +InvalidCase("invalid list branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__duplicate_nil.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__duplicate_nil.snap new file mode 100644 index 00000000..a20c2f96 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__duplicate_nil.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@List (con (list integer) []) of + Nil -> 42 + Nil -> 42 +--- after +case@List (con (list integer) []) of + Nil -> 42 + Nil -> 42 +--- errors +InvalidCase("invalid list branch") +InvalidCase("invalid list branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty.snap new file mode 100644 index 00000000..d8d6a0f8 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) []) of + Cons head#1 tail#2 -> trace "cons" in tail#2 + Nil -> trace "nil" in (con (list integer) [0]) +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) []) + (lam head_1 + (lam tail_2 + (force [[(force (builtin trace)) (con string "cons")] (delay tail_2)]))) + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))]))) +--- optimized Core +trace "nil" in (con (list integer) [0]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "nil")] (delay (con (list integer) [0]))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) []) of + Cons head#1 tail#2 -> trace "cons" in tail#2 + Nil -> trace "nil" in (con (list integer) [0]) +--- isolated folded Core +trace "nil" in (con (list integer) [0]) +--- isolated cleaned Core +trace "nil" in (con (list integer) [0]) +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) []) + (lam head_1 + (lam tail_2 + (force [[(force (builtin trace)) (con string "cons")] (delay tail_2)]))) + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))]))) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))])) +--- result +(con (list integer) [0]) +--- logs +["nil"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty_default.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty_default.snap new file mode 100644 index 00000000..32edf5a3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty_default.snap @@ -0,0 +1,50 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) []) of + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) []) + (lam generated_2 + (lam generated_1 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) +--- optimized Core +trace "fallback" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "fallback")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) []) of + _ -> trace "fallback" in 42 +--- isolated folded Core +trace "fallback" in 42 +--- isolated cleaned Core +trace "fallback" in 42 +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) []) + (lam generated_2 + (lam generated_1 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]))) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))])) +--- result +(con integer 42) +--- logs +["fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty_missing.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty_missing.snap new file mode 100644 index 00000000..f4abd878 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__empty_missing.snap @@ -0,0 +1,35 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) []) of +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) []) + (lam generated_2 (lam generated_1 (error))) + (error))) +--- optimized Core +error +--- optimized UPLC +(program 1.1.0 (error)) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) []) of +--- isolated folded Core +error +--- isolated cleaned Core +error +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) []) + (lam generated_2 (lam generated_1 (error))) + (error))) +--- isolated UPLC after +(program 1.1.0 (error)) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__explicit_wins.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__explicit_wins.snap new file mode 100644 index 00000000..fafc080f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__explicit_wins.snap @@ -0,0 +1,41 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) [42]) of + Cons head#1 tail#2 -> head#1 + _ -> trace "cold" in error +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) [42]) + (lam head_1 (lam tail_2 head_1)) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) [42]) of + Cons head#1 tail#2 -> head#1 + _ -> trace "cold" in error +--- isolated folded Core +let head#1 : int = 42 in +let tail#2 : list int = (con (list integer) []) in +head#1 +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) [42]) + (lam head_1 (lam tail_2 head_1)) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__function_head.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__function_head.snap new file mode 100644 index 00000000..8bd126d6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__function_head.snap @@ -0,0 +1,75 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (\p#31 : int -> p#31) (trace "tail" in (con (list integer) [7])) of + Nil -> trace "cold" in error + Cons ignored#32 ignored#33 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) (lam p_31 p_31)] + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])] + (lam ignored_32 + (lam ignored_33 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#4 : list int = trace "tail" in (con (list integer) [7]) in +let anf#5 : list int = mkCons (\p#1 : int -> p#1) anf#4 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam builtin_8 + [(lam anf_2 + [(lam anf_6 (force [[builtin_7 (con string "body")] (delay (con integer 21))])) + [[builtin_8 (lam p_3 p_3)] anf_2]]) + (force [[builtin_7 (con string "tail")] (delay (con (list integer) [7]))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#34 : list int = trace "tail" in (con (list integer) [7]) in +let anf#35 : list int = mkCons (\p#31 : int -> p#31) anf#34 in +case@List anf#35 of + Nil -> trace "cold" in error + Cons ignored#32 ignored#33 -> trace "body" in 21 +--- isolated folded Core +let anf#34 : list int = trace "tail" in (con (list integer) [7]) in +let list_field#36 : int -> int = \p#31 : int -> p#31 in +let anf#35 : list int = mkCons list_field#36 anf#34 in +let ignored#32 : int = list_field#36 in +let ignored#33 : list int = anf#34 in +trace "body" in 21 +--- isolated cleaned Core +let anf#34 : list int = trace "tail" in (con (list integer) [7]) in +let anf#35 : list int = mkCons (\p#31 : int -> p#31) anf#34 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_34 + [(lam anf_35 + (case + anf_35 + (lam ignored_32 + (lam ignored_33 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) (lam p_31 p_31)] anf_34]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_34 + [(lam anf_35 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) (lam p_31 p_31)] anf_34]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) +--- result +error: NotAConstant(Lambda { parameter: DeBruijn(0), body: Var(DeBruijn(1)), env: Cons { data: Con(ProtoList(Integer, [Integer(7)])), next: Empty } }) +--- logs +["tail"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__head_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__head_failure.snap new file mode 100644 index 00000000..09474eef --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__head_failure.snap @@ -0,0 +1,85 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (trace "head" in error) (trace "tail" in (con (list integer) [7])) of + Nil -> trace "cold" in error + Cons ignored#8 ignored#9 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (error))])] + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])] + (lam ignored_8 + (lam ignored_9 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#3 : int = trace "head" in error in +let anf#4 : list int = trace "tail" in (con (list integer) [7]) in +let anf#5 : list int = mkCons anf#3 anf#4 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam builtin_8 + [(lam anf_1 + [(lam anf_2 + [(lam anf_6 (force [[builtin_7 (con string "body")] (delay (con integer 21))])) + [[builtin_8 anf_1] anf_2]]) + (force [[builtin_7 (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[builtin_7 (con string "head")] (delay (error))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#10 : int = trace "head" in error in +let anf#11 : list int = trace "tail" in (con (list integer) [7]) in +let anf#12 : list int = mkCons anf#10 anf#11 in +case@List anf#12 of + Nil -> trace "cold" in error + Cons ignored#8 ignored#9 -> trace "body" in 21 +--- isolated folded Core +let anf#10 : int = trace "head" in error in +let anf#11 : list int = trace "tail" in (con (list integer) [7]) in +let anf#12 : list int = mkCons anf#10 anf#11 in +let ignored#8 : int = anf#10 in +let ignored#9 : list int = anf#11 in +trace "body" in 21 +--- isolated cleaned Core +let anf#10 : int = trace "head" in error in +let anf#11 : list int = trace "tail" in (con (list integer) [7]) in +let anf#12 : list int = mkCons anf#10 anf#11 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_10 + [(lam anf_11 + [(lam anf_12 + (case + anf_12 + (lam ignored_8 + (lam ignored_9 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) anf_10] anf_11]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (error))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_10 + [(lam anf_11 + [(lam anf_12 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) anf_10] anf_11]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (error))])]) +--- result +error: ExplicitErrorTerm +--- logs +["head"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nested_mkcons.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nested_mkcons.snap new file mode 100644 index 00000000..3b71e35d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nested_mkcons.snap @@ -0,0 +1,80 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons 21 (mkCons (trace "inner" in 42) (con (list integer) [])) of + Cons head#1 tail#2 -> case@List tail#2 of + Cons head#3 tail#4 -> head#3 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) (con integer 21)] + [[(force (builtin mkCons)) + (force + [[(force (builtin trace)) (con string "inner")] (delay (con integer 42))])] + (con (list integer) [])]] + (lam head_1 (lam tail_2 (case tail_2 (lam head_3 (lam tail_4 head_3)) (error)))) + (error))) +--- optimized Core +let anf#9 : int = trace "inner" in 42 in +let anf#10 : list int = mkCons anf#9 (con (list integer) []) in +let anf#11 : list int = mkCons 21 anf#10 in +anf#9 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_2 [(lam anf_3 anf_1) [[builtin_4 (con integer 21)] anf_2]]) + [[builtin_4 anf_1] (con (list integer) [])]]) + (force [[builtin_5 (con string "inner")] (delay (con integer 42))])]) + (force (builtin trace))]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#5 : int = trace "inner" in 42 in +let anf#6 : list int = mkCons anf#5 (con (list integer) []) in +let anf#7 : list int = mkCons 21 anf#6 in +case@List anf#7 of + Cons head#1 tail#2 -> case@List tail#2 of + Cons head#3 tail#4 -> head#3 +--- isolated folded Core +let anf#5 : int = trace "inner" in 42 in +let anf#6 : list int = mkCons anf#5 (con (list integer) []) in +let list_field#8 : int = 21 in +let anf#7 : list int = mkCons list_field#8 anf#6 in +let head#1 : int = list_field#8 in +let tail#2 : list int = anf#6 in +case@List tail#2 of + Cons head#3 tail#4 -> head#3 +--- isolated cleaned Core +let anf#5 : int = trace "inner" in 42 in +let anf#6 : list int = mkCons anf#5 (con (list integer) []) in +let anf#7 : list int = mkCons 21 anf#6 in +anf#5 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_5 + [(lam anf_6 + [(lam anf_7 + (case + anf_7 + (lam head_1 (lam tail_2 (case tail_2 (lam head_3 (lam tail_4 head_3)) (error)))) + (error))) + [[(force (builtin mkCons)) (con integer 21)] anf_6]]) + [[(force (builtin mkCons)) anf_5] (con (list integer) [])]]) + (force + [[(force (builtin trace)) (con string "inner")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_5 + [(lam anf_6 + [(lam anf_7 anf_5) [[(force (builtin mkCons)) (con integer 21)] anf_6]]) + [[(force (builtin mkCons)) anf_5] (con (list integer) [])]]) + (force + [[(force (builtin trace)) (con string "inner")] (delay (con integer 42))])]) +--- result +(con integer 42) +--- logs +["inner"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nested_tail_delay.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nested_tail_delay.snap new file mode 100644 index 00000000..a86c9794 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nested_tail_delay.snap @@ -0,0 +1,48 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +force (case@List (con (list integer) [21, 42]) of + Cons head#1 tail#2 -> delay (case@List tail#2 of + Cons head#3 tail#4 -> head#3)) +--- unoptimized UPLC +(program 1.1.0 + (force + (case + (con (list integer) [21, 42]) + (lam head_1 + (lam tail_2 (delay (case tail_2 (lam head_3 (lam tail_4 head_3)) (error))))) + (error)))) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- isolated ANF input +let anf#5 : @delay int = case@List (con (list integer) [21, 42]) of + Cons head#1 tail#2 -> delay (case@List tail#2 of + Cons head#3 tail#4 -> head#3) in +force anf#5 +--- isolated folded Core +let anf#5 : @delay int = let head#1 : int = 21 in +let tail#2 : list int = (con (list integer) [42]) in +delay (case@List tail#2 of + Cons head#3 tail#4 -> head#3) in +force anf#5 +--- isolated cleaned Core +42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_5 (force anf_5)) + (case + (con (list integer) [21, 42]) + (lam head_1 + (lam tail_2 (delay (case tail_2 (lam head_3 (lam tail_4 head_3)) (error))))) + (error))]) +--- isolated UPLC after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nil_binder.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nil_binder.snap new file mode 100644 index 00000000..bf6e554a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nil_binder.snap @@ -0,0 +1,13 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@List (con (list integer) []) of + Nil x#1 -> 42 +--- after +case@List (con (list integer) []) of + Nil x#1 -> 42 +--- errors +InvalidCase("invalid list branch") +InvalidCase("invalid list branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nonempty.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nonempty.snap new file mode 100644 index 00000000..1ef0c557 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__nonempty.snap @@ -0,0 +1,53 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) [42, 7, 9]) of + Cons head#5 tail#6 -> trace "cons" in tail#6 + Nil -> trace "nil" in (con (list integer) [0]) +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) [42, 7, 9]) + (lam head_5 + (lam tail_6 + (force [[(force (builtin trace)) (con string "cons")] (delay tail_6)]))) + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))]))) +--- optimized Core +trace "cons" in (con (list integer) [7, 9]) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "cons")] (delay (con (list integer) [7, 9]))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) [42, 7, 9]) of + Cons head#5 tail#6 -> trace "cons" in tail#6 + Nil -> trace "nil" in (con (list integer) [0]) +--- isolated folded Core +let head#5 : int = 42 in +let tail#6 : list int = (con (list integer) [7, 9]) in +trace "cons" in tail#6 +--- isolated cleaned Core +trace "cons" in (con (list integer) [7, 9]) +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) [42, 7, 9]) + (lam head_5 + (lam tail_6 + (force [[(force (builtin trace)) (con string "cons")] (delay tail_6)]))) + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))]))) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "cons")] + (delay (con (list integer) [7, 9]))])) +--- result +(con (list integer) [7, 9]) +--- logs +["cons"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__oversaturated_cons.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__oversaturated_cons.snap new file mode 100644 index 00000000..1d09e298 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__oversaturated_cons.snap @@ -0,0 +1,62 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons 42 (con (list integer) []) 9 of + _ -> 0 +--- unoptimized UPLC +(program 1.1.0 + (case + [[[(force (builtin mkCons)) (con integer 42)] (con (list integer) [])] + (con integer 9)] + (lam generated_2 (lam generated_1 (con integer 0))) + (con integer 0))) +--- optimized Core +let anf#1 : list int = mkCons 42 (con (list integer) []) in +let anf#2 : list int = anf#1 9 in +case@List anf#2 of + _ -> 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam anf_3 + [(lam anf_4 + (case anf_4 (lam generated_6 (lam generated_5 (con integer 0))) (con integer 0))) + [anf_3 (con integer 9)]]) + [[builtin_7 (con integer 42)] (con (list integer) [])]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#2 : list int = mkCons 42 (con (list integer) []) in +let anf#3 : list int = anf#2 9 in +case@List anf#3 of + _ -> 0 +--- isolated folded Core +let anf#2 : list int = mkCons 42 (con (list integer) []) in +let anf#3 : list int = anf#2 9 in +case@List anf#3 of + _ -> 0 +--- isolated cleaned Core +let anf#2 : list int = mkCons 42 (con (list integer) []) in +let anf#3 : list int = anf#2 9 in +case@List anf#3 of + _ -> 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_2 + [(lam anf_3 + (case anf_3 (lam generated_5 (lam generated_4 (con integer 0))) (con integer 0))) + [anf_2 (con integer 9)]]) + [[(force (builtin mkCons)) (con integer 42)] (con (list integer) [])]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_2 + [(lam anf_3 + (case anf_3 (lam generated_5 (lam generated_4 (con integer 0))) (con integer 0))) + [anf_2 (con integer 9)]]) + [[(force (builtin mkCons)) (con integer 42)] (con (list integer) [])]]) +--- result +error: NonFunctionApplication(Con(Integer(9)), Con(ProtoList(Integer, [Integer(42)]))) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__partial_cons.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__partial_cons.snap new file mode 100644 index 00000000..24cad417 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__partial_cons.snap @@ -0,0 +1,51 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons 42 of + _ -> 0 +--- unoptimized UPLC +(program 1.1.0 + (case + [(force (builtin mkCons)) (con integer 42)] + (lam generated_2 (lam generated_1 (con integer 0))) + (con integer 0))) +--- optimized Core +let anf#1 : list int = mkCons 42 in +case@List anf#1 of + _ -> 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 + (case anf_2 (lam generated_4 (lam generated_3 (con integer 0))) (con integer 0))) + [builtin_5 (con integer 42)]]) + (force (builtin mkCons))]) +--- isolated pass +--- isolated ANF input +let anf#1 : list int = mkCons 42 in +case@List anf#1 of + _ -> 0 +--- isolated folded Core +let anf#1 : list int = mkCons 42 in +case@List anf#1 of + _ -> 0 +--- isolated cleaned Core +let anf#1 : list int = mkCons 42 in +case@List anf#1 of + _ -> 0 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + (case anf_1 (lam generated_3 (lam generated_2 (con integer 0))) (con integer 0))) + [(force (builtin mkCons)) (con integer 42)]]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + (case anf_1 (lam generated_3 (lam generated_2 (con integer 0))) (con integer 0))) + [(force (builtin mkCons)) (con integer 42)]]) +--- result +error: NonConstrScrutinized(Builtin(Runtime { args: [Con(Integer(42))], fun: MkCons, forces: 1 })) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__shared_literal_tails.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__shared_literal_tails.snap new file mode 100644 index 00000000..3decc004 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__shared_literal_tails.snap @@ -0,0 +1,67 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +let xs#1 : list int = (con (list integer) [21, 42, 7, 9]) in +constr 0 xs#1 (case@List xs#1 of + Cons head#2 tail#3 -> tail#3) (case@List xs#1 of + Cons head#4 tail#5 -> tail#5) +--- unoptimized UPLC +(program 1.1.0 + [(lam xs_1 + (constr 0 + xs_1 + (case xs_1 (lam head_2 (lam tail_3 tail_3)) (error)) + (case xs_1 (lam head_4 (lam tail_5 tail_5)) (error)))) + (con (list integer) [21, 42, 7, 9])]) +--- optimized Core +let list_field#14 : list int = (con (list integer) [42, 7, 9]) in +constr 0 (con (list integer) [21, 42, 7, 9]) list_field#14 list_field#14 +--- optimized UPLC +(program 1.1.0 + [(lam list_field_1 + (constr 0 (con (list integer) [21, 42, 7, 9]) list_field_1 list_field_1)) + (con (list integer) [42, 7, 9])]) +--- isolated pass +--- isolated ANF input +let xs#1 : list int = (con (list integer) [21, 42, 7, 9]) in +let anf#6 : list int = case@List xs#1 of + Cons head#2 tail#3 -> tail#3 in +let anf#7 : list int = case@List xs#1 of + Cons head#4 tail#5 -> tail#5 in +constr 0 xs#1 anf#6 anf#7 +--- isolated folded Core +let list_field#8 : int = 21 in +let list_field#9 : list int = (con (list integer) [42, 7, 9]) in +let xs#1 : list int = (con (list integer) [21, 42, 7, 9]) in +let anf#6 : list int = let head#2 : int = list_field#8 in +let tail#3 : list int = list_field#9 in +tail#3 in +let anf#7 : list int = let head#4 : int = list_field#8 in +let tail#5 : list int = list_field#9 in +tail#5 in +constr 0 xs#1 anf#6 anf#7 +--- isolated cleaned Core +let list_field#9 : list int = (con (list integer) [42, 7, 9]) in +constr 0 (con (list integer) [21, 42, 7, 9]) list_field#9 list_field#9 +--- isolated UPLC before +(program 1.1.0 + [(lam xs_1 + [(lam anf_6 + [(lam anf_7 (constr 0 xs_1 anf_6 anf_7)) + (case xs_1 (lam head_4 (lam tail_5 tail_5)) (error))]) + (case xs_1 (lam head_2 (lam tail_3 tail_3)) (error))]) + (con (list integer) [21, 42, 7, 9])]) +--- isolated UPLC after +(program 1.1.0 + [(lam list_field_9 + (constr 0 (con (list integer) [21, 42, 7, 9]) list_field_9 list_field_9)) + (con (list integer) [42, 7, 9])]) +--- result +(constr 0 + (con (list integer) [21, 42, 7, 9]) + (con (list integer) [42, 7, 9]) + (con (list integer) [42, 7, 9])) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__singleton.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__singleton.snap new file mode 100644 index 00000000..2de3bc8a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__singleton.snap @@ -0,0 +1,52 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (con (list integer) [42]) of + Cons head#3 tail#4 -> trace "cons" in tail#4 + Nil -> trace "nil" in (con (list integer) [0]) +--- unoptimized UPLC +(program 1.1.0 + (case + (con (list integer) [42]) + (lam head_3 + (lam tail_4 + (force [[(force (builtin trace)) (con string "cons")] (delay tail_4)]))) + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))]))) +--- optimized Core +trace "cons" in (con (list integer) []) +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "cons")] (delay (con (list integer) []))])) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +case@List (con (list integer) [42]) of + Cons head#3 tail#4 -> trace "cons" in tail#4 + Nil -> trace "nil" in (con (list integer) [0]) +--- isolated folded Core +let head#3 : int = 42 in +let tail#4 : list int = (con (list integer) []) in +trace "cons" in tail#4 +--- isolated cleaned Core +trace "cons" in (con (list integer) []) +--- isolated UPLC before +(program 1.1.0 + (case + (con (list integer) [42]) + (lam head_3 + (lam tail_4 + (force [[(force (builtin trace)) (con string "cons")] (delay tail_4)]))) + (force + [[(force (builtin trace)) (con string "nil")] (delay (con (list integer) [0]))]))) +--- isolated UPLC after +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "cons")] (delay (con (list integer) []))])) +--- result +(con (list integer) []) +--- logs +["cons"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__strict_order.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__strict_order.snap new file mode 100644 index 00000000..ad96c78c --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__strict_order.snap @@ -0,0 +1,85 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (trace "head" in 42) (trace "tail" in (con (list integer) [7])) of + Nil -> trace "cold" in error + Cons ignored#2 ignored#3 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])] + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])] + (lam ignored_2 + (lam ignored_3 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#5 : int = trace "head" in 42 in +let anf#6 : list int = trace "tail" in (con (list integer) [7]) in +let anf#7 : list int = mkCons anf#5 anf#6 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam builtin_5 + [(lam anf_1 + [(lam anf_2 + [(lam anf_3 (force [[builtin_4 (con string "body")] (delay (con integer 21))])) + [[builtin_5 anf_1] anf_2]]) + (force [[builtin_4 (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[builtin_4 (con string "head")] (delay (con integer 42))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#4 : int = trace "head" in 42 in +let anf#5 : list int = trace "tail" in (con (list integer) [7]) in +let anf#6 : list int = mkCons anf#4 anf#5 in +case@List anf#6 of + Nil -> trace "cold" in error + Cons ignored#2 ignored#3 -> trace "body" in 21 +--- isolated folded Core +let anf#4 : int = trace "head" in 42 in +let anf#5 : list int = trace "tail" in (con (list integer) [7]) in +let anf#6 : list int = mkCons anf#4 anf#5 in +let ignored#2 : int = anf#4 in +let ignored#3 : list int = anf#5 in +trace "body" in 21 +--- isolated cleaned Core +let anf#4 : int = trace "head" in 42 in +let anf#5 : list int = trace "tail" in (con (list integer) [7]) in +let anf#6 : list int = mkCons anf#4 anf#5 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 + (case + anf_6 + (lam ignored_2 + (lam ignored_3 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) anf_4] anf_5]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_4 + [(lam anf_5 + [(lam anf_6 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) anf_4] anf_5]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- result +(con integer 21) +--- logs +["head", "tail", "body"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__tail_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__tail_failure.snap new file mode 100644 index 00000000..a2996f7a --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__tail_failure.snap @@ -0,0 +1,82 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (trace "head" in 42) (trace "tail" in error) of + Nil -> trace "cold" in error + Cons ignored#14 ignored#15 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])] + (force [[(force (builtin trace)) (con string "tail")] (delay (error))])] + (lam ignored_14 + (lam ignored_15 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#3 : int = trace "head" in 42 in +let anf#4 : list int = trace "tail" in error in +let anf#5 : list int = mkCons anf#3 anf#4 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam builtin_8 + [(lam anf_1 + [(lam anf_2 + [(lam anf_6 (force [[builtin_7 (con string "body")] (delay (con integer 21))])) + [[builtin_8 anf_1] anf_2]]) + (force [[builtin_7 (con string "tail")] (delay (error))])]) + (force [[builtin_7 (con string "head")] (delay (con integer 42))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#16 : int = trace "head" in 42 in +let anf#17 : list int = trace "tail" in error in +let anf#18 : list int = mkCons anf#16 anf#17 in +case@List anf#18 of + Nil -> trace "cold" in error + Cons ignored#14 ignored#15 -> trace "body" in 21 +--- isolated folded Core +let anf#16 : int = trace "head" in 42 in +let anf#17 : list int = trace "tail" in error in +let anf#18 : list int = mkCons anf#16 anf#17 in +let ignored#14 : int = anf#16 in +let ignored#15 : list int = anf#17 in +trace "body" in 21 +--- isolated cleaned Core +let anf#16 : int = trace "head" in 42 in +let anf#17 : list int = trace "tail" in error in +let anf#18 : list int = mkCons anf#16 anf#17 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_16 + [(lam anf_17 + [(lam anf_18 + (case + anf_18 + (lam ignored_14 + (lam ignored_15 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) anf_16] anf_17]]) + (force [[(force (builtin trace)) (con string "tail")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_16 + [(lam anf_17 + [(lam anf_18 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) anf_16] anf_17]]) + (force [[(force (builtin trace)) (con string "tail")] (delay (error))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- result +error: ExplicitErrorTerm +--- logs +["head", "tail"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__unknown_traced_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__unknown_traced_subject.snap new file mode 100644 index 00000000..4504cadd --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__unknown_traced_subject.snap @@ -0,0 +1,57 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List (trace "subject" in (con (list integer) [])) of + Nil -> 42 +--- unoptimized UPLC +(program 1.1.0 + (case + (force + [[(force (builtin trace)) (con string "subject")] + (delay (con (list integer) []))]) + (lam generated_2 (lam generated_1 (error))) + (con integer 42))) +--- optimized Core +let anf#1 : list int = trace "subject" in (con (list integer) []) in +case@List anf#1 of + Nil -> 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_5 + [(lam anf_2 + (case anf_2 (lam generated_4 (lam generated_3 (error))) (con integer 42))) + (force [[builtin_5 (con string "subject")] (delay (con (list integer) []))])]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#1 : list int = trace "subject" in (con (list integer) []) in +case@List anf#1 of + Nil -> 42 +--- isolated folded Core +let anf#1 : list int = trace "subject" in (con (list integer) []) in +case@List anf#1 of + Nil -> 42 +--- isolated cleaned Core +let anf#1 : list int = trace "subject" in (con (list integer) []) in +case@List anf#1 of + Nil -> 42 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_1 + (case anf_1 (lam generated_3 (lam generated_2 (error))) (con integer 42))) + (force + [[(force (builtin trace)) (con string "subject")] + (delay (con (list integer) []))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_1 + (case anf_1 (lam generated_3 (lam generated_2 (error))) (con integer 42))) + (force + [[(force (builtin trace)) (con string "subject")] + (delay (con (list integer) []))])]) +--- result +(con integer 42) +--- logs +["subject"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_head_type.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_head_type.snap new file mode 100644 index 00000000..ee188195 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_head_type.snap @@ -0,0 +1,85 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (trace "head" in true) (trace "tail" in (con (list integer) [7])) of + Nil -> trace "cold" in error + Cons ignored#26 ignored#27 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (con bool True))])] + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])] + (lam ignored_26 + (lam ignored_27 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#3 : bool = trace "head" in true in +let anf#4 : list int = trace "tail" in (con (list integer) [7]) in +let anf#5 : list int = mkCons anf#3 anf#4 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam builtin_8 + [(lam anf_1 + [(lam anf_2 + [(lam anf_6 (force [[builtin_7 (con string "body")] (delay (con integer 21))])) + [[builtin_8 anf_1] anf_2]]) + (force [[builtin_7 (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[builtin_7 (con string "head")] (delay (con bool True))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#28 : bool = trace "head" in true in +let anf#29 : list int = trace "tail" in (con (list integer) [7]) in +let anf#30 : list int = mkCons anf#28 anf#29 in +case@List anf#30 of + Nil -> trace "cold" in error + Cons ignored#26 ignored#27 -> trace "body" in 21 +--- isolated folded Core +let anf#28 : bool = trace "head" in true in +let anf#29 : list int = trace "tail" in (con (list integer) [7]) in +let anf#30 : list int = mkCons anf#28 anf#29 in +let ignored#26 : int = anf#28 in +let ignored#27 : list int = anf#29 in +trace "body" in 21 +--- isolated cleaned Core +let anf#28 : bool = trace "head" in true in +let anf#29 : list int = trace "tail" in (con (list integer) [7]) in +let anf#30 : list int = mkCons anf#28 anf#29 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_28 + [(lam anf_29 + [(lam anf_30 + (case + anf_30 + (lam ignored_26 + (lam ignored_27 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) anf_28] anf_29]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con bool True))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_28 + [(lam anf_29 + [(lam anf_30 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) anf_28] anf_29]]) + (force + [[(force (builtin trace)) (con string "tail")] (delay (con (list integer) [7]))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con bool True))])]) +--- result +error: Runtime(MkConsTypeMismatch(Boolean(true))) +--- logs +["head", "tail"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_tail.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_tail.snap new file mode 100644 index 00000000..a3bc9d00 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_tail.snap @@ -0,0 +1,82 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, original,\nformat!(\"--- isolated ANF input\\n{}\\n--- isolated folded Core\\n{}\\n--- isolated cleaned Core\\n{}\\n--- isolated UPLC before\\n{}\\n--- isolated UPLC after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(folded), pretty(after), left.uplc, right.uplc,\nright.result, right.logs))" +--- +--- unoptimized Core +case@List mkCons (trace "head" in 42) (trace "tail" in 0) of + Nil -> trace "cold" in error + Cons ignored#20 ignored#21 -> trace "body" in 21 +--- unoptimized UPLC +(program 1.1.0 + (case + [[(force (builtin mkCons)) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])] + (force [[(force (builtin trace)) (con string "tail")] (delay (con integer 0))])] + (lam ignored_20 + (lam ignored_21 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) +--- optimized Core +let anf#3 : int = trace "head" in 42 in +let anf#4 : int = trace "tail" in 0 in +let anf#5 : list int = mkCons anf#3 anf#4 in +trace "body" in 21 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_7 + [(lam builtin_8 + [(lam anf_1 + [(lam anf_2 + [(lam anf_6 (force [[builtin_7 (con string "body")] (delay (con integer 21))])) + [[builtin_8 anf_1] anf_2]]) + (force [[builtin_7 (con string "tail")] (delay (con integer 0))])]) + (force [[builtin_7 (con string "head")] (delay (con integer 42))])]) + (force (builtin mkCons))]) + (force (builtin trace))]) +--- isolated pass +--- isolated ANF input +let anf#22 : int = trace "head" in 42 in +let anf#23 : int = trace "tail" in 0 in +let anf#24 : list int = mkCons anf#22 anf#23 in +case@List anf#24 of + Nil -> trace "cold" in error + Cons ignored#20 ignored#21 -> trace "body" in 21 +--- isolated folded Core +let anf#22 : int = trace "head" in 42 in +let anf#23 : int = trace "tail" in 0 in +let anf#24 : list int = mkCons anf#22 anf#23 in +let ignored#20 : int = anf#22 in +let ignored#21 : list int = anf#23 in +trace "body" in 21 +--- isolated cleaned Core +let anf#22 : int = trace "head" in 42 in +let anf#23 : int = trace "tail" in 0 in +let anf#24 : list int = mkCons anf#22 anf#23 in +trace "body" in 21 +--- isolated UPLC before +(program 1.1.0 + [(lam anf_22 + [(lam anf_23 + [(lam anf_24 + (case + anf_24 + (lam ignored_20 + (lam ignored_21 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))) + (force [[(force (builtin trace)) (con string "cold")] (delay (error))]))) + [[(force (builtin mkCons)) anf_22] anf_23]]) + (force [[(force (builtin trace)) (con string "tail")] (delay (con integer 0))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- isolated UPLC after +(program 1.1.0 + [(lam anf_22 + [(lam anf_23 + [(lam anf_24 + (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))])) + [[(force (builtin mkCons)) anf_22] anf_23]]) + (force [[(force (builtin trace)) (con string "tail")] (delay (con integer 0))])]) + (force [[(force (builtin trace)) (con string "head")] (delay (con integer 42))])]) +--- result +error: Runtime(ExpectedList(Integer(0))) +--- logs +["head", "tail"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_test.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_test.snap new file mode 100644 index 00000000..e5c280a0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__list__wrong_test.snap @@ -0,0 +1,13 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n--- after\\n{}\\n--- errors\\n{left:?}\\n{right:?}\",\npretty(before), pretty(after))" +--- +--- before +case@List (con (list integer) []) of + True -> 42 +--- after +case@List (con (list integer) []) of + True -> 42 +--- errors +InvalidCase("invalid list branch") +InvalidCase("invalid list branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_0_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_0_fallback_false.snap new file mode 100644 index 00000000..aac5081d --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_0_fallback_false.snap @@ -0,0 +1,79 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 0 of + 0 -> trace "chosen" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con integer 0)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 0))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 0 of + 0 -> trace "chosen" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con integer 0)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 0 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 0) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_0_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_0_fallback_true.snap new file mode 100644 index 00000000..a3901fad --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_0_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 0 of + 0 -> trace "chosen" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con integer 0)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 0))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 0 of + 0 -> trace "chosen" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con integer 0)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 0 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 0) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_1_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_1_fallback_false.snap new file mode 100644 index 00000000..e57beb7b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_1_fallback_false.snap @@ -0,0 +1,77 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 1 of + 0 -> trace "unselected" in 0 + 1 -> trace "chosen" in error + 2 -> trace "unselected" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 1)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 (force [[builtin_2 (con string "chosen")] (delay (error))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 1 of + 0 -> trace "unselected" in 0 + 1 -> trace "chosen" in error + 2 -> trace "unselected" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 1)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in error +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_1_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_1_fallback_true.snap new file mode 100644 index 00000000..fe0151a4 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_1_fallback_true.snap @@ -0,0 +1,81 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 1 of + 0 -> trace "unselected" in 0 + 1 -> trace "chosen" in error + 2 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 1)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 (force [[builtin_2 (con string "chosen")] (delay (error))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 1 of + 0 -> trace "unselected" in 0 + 1 -> trace "chosen" in error + 2 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 1)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in error +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_2_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_2_fallback_false.snap new file mode 100644 index 00000000..ff3e4033 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_2_fallback_false.snap @@ -0,0 +1,79 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 2 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "chosen" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 2)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 2))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 2 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "chosen" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 2)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 2 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 2) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_2_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_2_fallback_true.snap new file mode 100644 index 00000000..e7073181 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_2_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 2 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "chosen" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 2)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 2))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 2 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "chosen" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 2)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 2 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 2) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_9_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_9_fallback_false.snap new file mode 100644 index 00000000..6f788209 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_9_fallback_false.snap @@ -0,0 +1,110 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 9 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 9)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +case@Int 9 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam partial_4 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force [partial_4 (delay (con integer 2))])) + (force [partial_4 (delay (error))])) + (force [partial_4 (delay (con integer 0))]))) + (con integer 9)]) + (force [[builtin_3 (con string "before")] (delay (con integer 7))])]) + [builtin_3 (con string "unselected")]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 9 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 9)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +case@Int 9 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 +--- uplc after +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 9)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_9_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_9_fallback_true.snap new file mode 100644 index 00000000..a78b6714 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_false_value_9_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Int 9 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 9)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "fallback" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "fallback")] (delay (con integer 42))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Int 9 of + 0 -> trace "unselected" in 0 + 1 -> trace "unselected" in error + 2 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 0)] + (case + [[(builtin equalsInteger) generated_2] (con integer 1)] + (case + [[(builtin equalsInteger) generated_2] (con integer 2)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con integer 9)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "fallback" in 42 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 42) +--- logs +["before", "fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_0_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_0_fallback_false.snap new file mode 100644 index 00000000..0f0dedc0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_0_fallback_false.snap @@ -0,0 +1,79 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #00) of + #00 -> trace "chosen" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con bytestring #00)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 0))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #00) of + #00 -> trace "chosen" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con bytestring #00)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 0 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 0) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_0_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_0_fallback_true.snap new file mode 100644 index 00000000..64c0a355 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_0_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #00) of + #00 -> trace "chosen" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con bytestring #00)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 0 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 0))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #00) of + #00 -> trace "chosen" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))]))) + (con bytestring #00)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 0 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 0))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 0) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_1_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_1_fallback_false.snap new file mode 100644 index 00000000..be8d80a0 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_1_fallback_false.snap @@ -0,0 +1,77 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #01) of + #00 -> trace "unselected" in 0 + #01 -> trace "chosen" in error + #02 -> trace "unselected" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #01)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 (force [[builtin_2 (con string "chosen")] (delay (error))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #01) of + #00 -> trace "unselected" in 0 + #01 -> trace "chosen" in error + #02 -> trace "unselected" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #01)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in error +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_1_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_1_fallback_true.snap new file mode 100644 index 00000000..60478a13 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_1_fallback_true.snap @@ -0,0 +1,81 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #01) of + #00 -> trace "unselected" in 0 + #01 -> trace "chosen" in error + #02 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #01)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 (force [[builtin_2 (con string "chosen")] (delay (error))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #01) of + #00 -> trace "unselected" in 0 + #01 -> trace "chosen" in error + #02 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #01)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in error +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force [[(force (builtin trace)) (con string "chosen")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_2_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_2_fallback_false.snap new file mode 100644 index 00000000..41d00d2f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_2_fallback_false.snap @@ -0,0 +1,79 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #02) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "chosen" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #02)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 2))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #02) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "chosen" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #02)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 2 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 2) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_2_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_2_fallback_true.snap new file mode 100644 index 00000000..ee8a28ab --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_2_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #02) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "chosen" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #02)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "chosen" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "chosen")] (delay (con integer 2))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #02) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "chosen" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #02)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "chosen" in 2 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "chosen")] (delay (con integer 2))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 2) +--- logs +["before", "chosen"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_9_fallback_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_9_fallback_false.snap new file mode 100644 index 00000000..8fd6a5e6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_9_fallback_false.snap @@ -0,0 +1,110 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #09) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #09)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +case@Bytes (con bytestring #09) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_3 + [(lam partial_4 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force [partial_4 (delay (con integer 2))])) + (force [partial_4 (delay (error))])) + (force [partial_4 (delay (con integer 0))]))) + (con bytestring #09)]) + (force [[builtin_3 (con string "before")] (delay (con integer 7))])]) + [builtin_3 (con string "unselected")]]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #09) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #09)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #09) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 +--- uplc after +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (error) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #09)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +error: ExplicitErrorTerm +--- logs +["before"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_9_fallback_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_9_fallback_true.snap new file mode 100644 index 00000000..f1ae291b --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__bytes_true_value_9_fallback_true.snap @@ -0,0 +1,83 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #09) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #09)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- optimized Core +let strict#2 : int = trace "before" in 7 in +trace "fallback" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_2 + [(lam strict_1 + (force [[builtin_2 (con string "fallback")] (delay (con integer 42))])) + (force [[builtin_2 (con string "before")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +let strict#1 : int = trace "before" in 7 in +case@Bytes (con bytestring #09) of + #00 -> trace "unselected" in 0 + #01 -> trace "unselected" in error + #02 -> trace "unselected" in 2 + _ -> trace "fallback" in 42 +--- uplc before +(program 1.1.0 + [(lam strict_1 + [(lam generated_2 + (case + [[(builtin equalsByteString) generated_2] (con bytestring #00)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #01)] + (case + [[(builtin equalsByteString) generated_2] (con bytestring #02)] + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))]) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 2))])) + (force [[(force (builtin trace)) (con string "unselected")] (delay (error))])) + (force + [[(force (builtin trace)) (con string "unselected")] (delay (con integer 0))]))) + (con bytestring #09)]) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- core after +let strict#1 : int = trace "before" in 7 in +trace "fallback" in 42 +--- uplc after +(program 1.1.0 + [(lam strict_1 + (force + [[(force (builtin trace)) (con string "fallback")] (delay (con integer 42))])) + (force + [[(force (builtin trace)) (con string "before")] (delay (con integer 7))])]) +--- result +(con integer 42) +--- logs +["before", "fallback"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__effectful_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__effectful_subject.snap new file mode 100644 index 00000000..b3c42fbd --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__effectful_subject.snap @@ -0,0 +1,61 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Int (trace "subject" in 7) of + 7 -> 42 +--- unoptimized UPLC +(program 1.1.0 + [(lam generated_1 + (case + [[(builtin equalsInteger) generated_1] (con integer 7)] + (error) + (con integer 42))) + (force + [[(force (builtin trace)) (con string "subject")] (delay (con integer 7))])]) +--- optimized Core +let anf#1 : int = trace "subject" in 7 in +case@Int anf#1 of + 7 -> 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_4 + [(lam anf_2 + [(lam generated_3 + (case + [[(builtin equalsInteger) generated_3] (con integer 7)] + (error) + (con integer 42))) + anf_2]) + (force [[builtin_4 (con string "subject")] (delay (con integer 7))])]) + (force (builtin trace))]) +--- isolated pass +--- core before +case@Int (trace "subject" in 7) of + 7 -> 42 +--- uplc before +(program 1.1.0 + [(lam generated_1 + (case + [[(builtin equalsInteger) generated_1] (con integer 7)] + (error) + (con integer 42))) + (force + [[(force (builtin trace)) (con string "subject")] (delay (con integer 7))])]) +--- core after +case@Int (trace "subject" in 7) of + 7 -> 42 +--- uplc after +(program 1.1.0 + [(lam generated_1 + (case + [[(builtin equalsInteger) generated_1] (con integer 7)] + (error) + (con integer 42))) + (force + [[(force (builtin trace)) (con string "subject")] (delay (con integer 7))])]) +--- result +(con integer 42) +--- logs +["subject"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_empty_bytes_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_empty_bytes_false.snap new file mode 100644 index 00000000..c666f8a6 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_empty_bytes_false.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bytes (con bytestring #) of +--- unoptimized UPLC +(program 1.1.0 [(lam generated_1 (error)) (con bytestring #)]) +--- optimized Core +case@Bytes (con bytestring #) of +--- optimized UPLC +(program 1.1.0 [(lam generated_1 (error)) (con bytestring #)]) +--- isolated pass +--- core before +case@Bytes (con bytestring #) of +--- uplc before +(program 1.1.0 [(lam generated_1 (error)) (con bytestring #)]) +--- core after +case@Bytes (con bytestring #) of +--- uplc after +(program 1.1.0 [(lam generated_1 (error)) (con bytestring #)]) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_empty_bytes_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_empty_bytes_true.snap new file mode 100644 index 00000000..0d3970f3 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_empty_bytes_true.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Bytes (con bytestring #) of + _ -> 42 +--- unoptimized UPLC +(program 1.1.0 [(lam generated_1 (con integer 42)) (con bytestring #)]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- core before +case@Bytes (con bytestring #) of + _ -> 42 +--- uplc before +(program 1.1.0 [(lam generated_1 (con integer 42)) (con bytestring #)]) +--- core after +42 +--- uplc after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_negative_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_negative_false.snap new file mode 100644 index 00000000..5079fb85 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_negative_false.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Int -7 of +--- unoptimized UPLC +(program 1.1.0 [(lam generated_1 (error)) (con integer -7)]) +--- optimized Core +case@Int -7 of +--- optimized UPLC +(program 1.1.0 [(lam generated_1 (error)) (con integer -7)]) +--- isolated pass +--- core before +case@Int -7 of +--- uplc before +(program 1.1.0 [(lam generated_1 (error)) (con integer -7)]) +--- core after +case@Int -7 of +--- uplc after +(program 1.1.0 [(lam generated_1 (error)) (con integer -7)]) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_negative_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_negative_true.snap new file mode 100644 index 00000000..85e26c88 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_negative_true.snap @@ -0,0 +1,27 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Int -7 of + _ -> 42 +--- unoptimized UPLC +(program 1.1.0 [(lam generated_1 (con integer 42)) (con integer -7)]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- core before +case@Int -7 of + _ -> 42 +--- uplc before +(program 1.1.0 [(lam generated_1 (con integer 42)) (con integer -7)]) +--- core after +42 +--- uplc after +(program 1.1.0 (con integer 42)) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_wrong_runtime_kind_false.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_wrong_runtime_kind_false.snap new file mode 100644 index 00000000..2d13821e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_wrong_runtime_kind_false.snap @@ -0,0 +1,25 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Int true of +--- unoptimized UPLC +(program 1.1.0 [(lam generated_1 (error)) (con bool True)]) +--- optimized Core +case@Int true of +--- optimized UPLC +(program 1.1.0 [(lam generated_1 (error)) (con bool True)]) +--- isolated pass +--- core before +case@Int true of +--- uplc before +(program 1.1.0 [(lam generated_1 (error)) (con bool True)]) +--- core after +case@Int true of +--- uplc after +(program 1.1.0 [(lam generated_1 (error)) (con bool True)]) +--- result +error: ExplicitErrorTerm +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_wrong_runtime_kind_true.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_wrong_runtime_kind_true.snap new file mode 100644 index 00000000..aaec9661 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__empty_wrong_runtime_kind_true.snap @@ -0,0 +1,29 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +case@Int true of + _ -> 42 +--- unoptimized UPLC +(program 1.1.0 [(lam generated_1 (con integer 42)) (con bool True)]) +--- optimized Core +case@Int true of + _ -> 42 +--- optimized UPLC +(program 1.1.0 [(lam generated_1 (con integer 42)) (con bool True)]) +--- isolated pass +--- core before +case@Int true of + _ -> 42 +--- uplc before +(program 1.1.0 [(lam generated_1 (con integer 42)) (con bool True)]) +--- core after +case@Int true of + _ -> 42 +--- uplc after +(program 1.1.0 [(lam generated_1 (con integer 42)) (con bool True)]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_0.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_0.snap new file mode 100644 index 00000000..1703155e --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_0.snap @@ -0,0 +1,14 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n{left:?}\\n--- after\\n{}\\n{right:?}\", pretty(root),\npretty(after))" +--- +--- before +case@Int 7 of + True -> 42 + _ -> 0 +InvalidCase("literal test has wrong kind") +--- after +case@Int 7 of + True -> 42 + _ -> 0 +InvalidCase("literal test has wrong kind") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_1.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_1.snap new file mode 100644 index 00000000..c3c92975 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_1.snap @@ -0,0 +1,14 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n{left:?}\\n--- after\\n{}\\n{right:?}\", pretty(root),\npretty(after))" +--- +--- before +case@Int 7 of + 7 bad#1 -> 42 + _ -> 0 +InvalidCase("invalid literal branch") +--- after +case@Int 7 of + 7 bad#1 -> 42 + _ -> 0 +InvalidCase("invalid literal branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_2.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_2.snap new file mode 100644 index 00000000..3cbe8550 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__invalid_literal_2.snap @@ -0,0 +1,16 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "format!(\"--- before\\n{}\\n{left:?}\\n--- after\\n{}\\n{right:?}\", pretty(root),\npretty(after))" +--- +--- before +case@Int 7 of + 7 -> 42 + 7 -> 42 + _ -> 0 +InvalidCase("invalid literal branch") +--- after +case@Int 7 of + 7 -> 42 + 7 -> 42 + _ -> 0 +InvalidCase("invalid literal branch") diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__selected_delay.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__selected_delay.snap new file mode 100644 index 00000000..263dfcd9 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__selected_delay.snap @@ -0,0 +1,52 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +force (case@Int 7 of + 7 -> delay (trace "forced" in 42)) +--- unoptimized UPLC +(program 1.1.0 + (force + [(lam generated_1 + (case + [[(builtin equalsInteger) generated_1] (con integer 7)] + (error) + (delay + (force + [[(force (builtin trace)) (con string "forced")] (delay (con integer 42))])))) + (con integer 7)])) +--- optimized Core +trace "forced" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "forced")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- core before +force (case@Int 7 of + 7 -> delay (trace "forced" in 42)) +--- uplc before +(program 1.1.0 + (force + [(lam generated_1 + (case + [[(builtin equalsInteger) generated_1] (con integer 7)] + (error) + (delay + (force + [[(force (builtin trace)) (con string "forced")] (delay (con integer 42))])))) + (con integer 7)])) +--- core after +force (delay (trace "forced" in 42)) +--- uplc after +(program 1.1.0 + (force + (delay + (force + [[(force (builtin trace)) (con string "forced")] (delay (con integer 42))])))) +--- result +(con integer 42) +--- logs +["forced"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__unknown_subject.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__unknown_subject.snap new file mode 100644 index 00000000..8ae1309f --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__known_case__literal__unknown_subject.snap @@ -0,0 +1,55 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/known_case.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), left.uplc, pretty(after), right.uplc, right.result,\nright.logs))" +--- +--- unoptimized Core +(\subject#1 : int -> case@Int subject#1 of + 7 -> 42 + _ -> 0) 7 +--- unoptimized UPLC +(program 1.1.0 + [(lam subject_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 7)] + (con integer 0) + (con integer 42))) + subject_1]) + (con integer 7)]) +--- optimized Core +42 +--- optimized UPLC +(program 1.1.0 (con integer 42)) +--- isolated pass +--- core before +(\subject#1 : int -> case@Int subject#1 of + 7 -> 42 + _ -> 0) 7 +--- uplc before +(program 1.1.0 + [(lam subject_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 7)] + (con integer 0) + (con integer 42))) + subject_1]) + (con integer 7)]) +--- core after +(\subject#1 : int -> case@Int subject#1 of + 7 -> 42 + _ -> 0) 7 +--- uplc after +(program 1.1.0 + [(lam subject_1 + [(lam generated_2 + (case + [[(builtin equalsInteger) generated_2] (con integer 7)] + (con integer 0) + (con integer 42))) + subject_1]) + (con integer 7)]) +--- result +(con integer 42) +--- logs +[] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_cold.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_cold.snap index c5e674b3..f6ae7d55 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_cold.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_cold.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#2 : int -> int = \x#1 : int -> trace "body" in 21 in @@ -24,17 +23,22 @@ let helper#2 : int -> int = \x#1 : int -> trace "body" in 21 in case@Bool true of True -> 42 False -> helper#2 1 +--- core early +let helper#2 : @delay int = delay (trace "body" in 21) in +case@Bool true of + True -> 42 + False -> force helper#2 +--- core after ANF +let helper#2 : @delay int = delay (trace "body" in 21) in +case@Bool true of + True -> 42 + False -> force helper#2 --- uplc before (program 1.1.0 [(lam helper_2 (case (con bool True) [helper_2 (con integer 1)] (con integer 42))) (lam x_1 (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))]) ---- core after -let helper#2 : @delay int = delay (trace "body" in 21) in -case@Bool true of - True -> 42 - False -> force helper#2 --- uplc after (program 1.1.0 [(lam helper_2 (case (con bool True) (force helper_2) (con integer 42))) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_failure.snap index bf944dd6..1dea6e37 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_failure.snap @@ -1,14 +1,13 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core -let allUnused#6 : int -> int = \unused#1 : int -> trace "unreachable" in 42 in -allUnused#6 error +let allUnused#4 : int -> int = \unused#1 : int -> trace "unreachable" in 42 in +allUnused#4 error --- unoptimized UPLC (program 1.1.0 - [(lam allUnused_6 [allUnused_6 (error)]) + [(lam allUnused_4 [allUnused_4 (error)]) (lam unused_1 (force [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 42))]))]) @@ -24,22 +23,25 @@ trace "unreachable" in 42 (force (builtin trace))]) --- isolated pass --- core before -let allUnused#6 : int -> int = \unused#1 : int -> trace "unreachable" in 42 in -let anf#7 : int = error in -allUnused#6 anf#7 +let allUnused#4 : int -> int = \unused#1 : int -> trace "unreachable" in 42 in +allUnused#4 error +--- core early +let allUnused#4 : @delay int = delay (trace "unreachable" in 42) in +let arg#2 : int = error in +force allUnused#4 +--- core after ANF +let allUnused#4 : @delay int = delay (trace "unreachable" in 42) in +let arg#2 : int = error in +force allUnused#4 --- uplc before (program 1.1.0 - [(lam allUnused_6 [(lam anf_7 [allUnused_6 anf_7]) (error)]) + [(lam allUnused_4 [allUnused_4 (error)]) (lam unused_1 (force [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 42))]))]) ---- core after -let allUnused#6 : @delay int = delay (trace "unreachable" in 42) in -let anf#7 : int = error in -force allUnused#6 --- uplc after (program 1.1.0 - [(lam allUnused_6 [(lam anf_7 (force allUnused_6)) (error)]) + [(lam allUnused_4 [(lam arg_2 (force allUnused_4)) (error)]) (delay (force [[(force (builtin trace)) (con string "unreachable")] (delay (con integer 42))]))]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__all_unused_twice.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_traced_twice.snap similarity index 98% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__all_unused_twice.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_traced_twice.snap index 2d836002..39ffbd49 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__all_unused_twice.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_traced_twice.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_twice.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_twice.snap index c6af490d..0cc8587a 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_twice.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__all_unused_twice.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#2 : int -> int = \x#1 : int -> trace "body" in 21 in @@ -28,26 +27,25 @@ addInteger anf#5 anf#6 --- isolated pass --- core before let helper#2 : int -> int = \x#1 : int -> trace "body" in 21 in -let anf#3 : int = helper#2 1 in -let anf#4 : int = helper#2 2 in -addInteger anf#3 anf#4 +addInteger (helper#2 1) (helper#2 2) +--- core early +let helper#2 : @delay int = delay (trace "body" in 21) in +addInteger (force helper#2) (force helper#2) +--- core after ANF +let helper#2 : @delay int = delay (trace "body" in 21) in +let anf#1 : int = force helper#2 in +let anf#3 : int = force helper#2 in +addInteger anf#1 anf#3 --- uplc before (program 1.1.0 [(lam helper_2 - [(lam anf_3 - [(lam anf_4 [[(builtin addInteger) anf_3] anf_4]) [helper_2 (con integer 2)]]) - [helper_2 (con integer 1)]]) + [[(builtin addInteger) [helper_2 (con integer 1)]] [helper_2 (con integer 2)]]) (lam x_1 (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))]) ---- core after -let helper#2 : @delay int = delay (trace "body" in 21) in -let anf#3 : int = force helper#2 in -let anf#4 : int = force helper#2 in -addInteger anf#3 anf#4 --- uplc after (program 1.1.0 [(lam helper_2 - [(lam anf_3 [(lam anf_4 [[(builtin addInteger) anf_3] anf_4]) (force helper_2)]) + [(lam anf_1 [(lam anf_3 [[(builtin addInteger) anf_1] anf_3]) (force helper_2)]) (force helper_2)]) (delay (force [[(force (builtin trace)) (con string "body")] (delay (con integer 21))]))]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__captured_parameter.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__captured_parameter.snap index 0b62076b..98360bee 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__captured_parameter.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__captured_parameter.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#4 : int -> int -> int -> int = \same#1 : int same#2 : int -> \same#3 : int -> same#1 in @@ -17,21 +16,21 @@ helper#4 42 0 7 --- isolated pass --- core before let helper#4 : int -> int -> int -> int = \same#1 : int same#2 : int -> \same#3 : int -> same#1 in -let anf#5 : int -> int = helper#4 42 0 in -anf#5 7 +helper#4 42 0 7 +--- core early +let helper#4 : int -> int -> int = \same#1 : int -> \same#3 : int -> same#1 in +helper#4 42 7 +--- core after ANF +let helper#4 : int -> int -> int = \same#1 : int -> \same#3 : int -> same#1 in +let anf#2 : int -> int = helper#4 42 in +anf#2 7 --- uplc before (program 1.1.0 - [(lam helper_4 - [(lam anf_5 [anf_5 (con integer 7)]) - [[helper_4 (con integer 42)] (con integer 0)]]) + [(lam helper_4 [[[helper_4 (con integer 42)] (con integer 0)] (con integer 7)]) (lam same_1 (lam same_2 (lam same_3 same_1)))]) ---- core after -let helper#4 : int -> int -> int = \same#1 : int -> \same#3 : int -> same#1 in -let anf#5 : int -> int = helper#4 42 in -anf#5 7 --- uplc after (program 1.1.0 - [(lam helper_4 [(lam anf_5 [anf_5 (con integer 7)]) [helper_4 (con integer 42)]]) + [(lam helper_4 [(lam anf_2 [anf_2 (con integer 7)]) [helper_4 (con integer 42)]]) (lam same_1 (lam same_3 same_1))]) --- result (con integer 42) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__cold_arguments.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__cold_arguments.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__cold_arguments.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__cold_arguments.snap index f3aae812..c3e3ceac 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__cold_arguments.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__cold_arguments.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__divergent_argument.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__divergent_argument.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__divergent_argument.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__divergent_argument.snap index be836dea..d80a66e1 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__divergent_argument.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__divergent_argument.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 261 expression: "crate::harness::pass_snapshot(b.arena, root,\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\", pretty(root),\npretty(after)))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_first.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_first.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_first.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_first.snap index bb169f3c..3428bcfe 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_first.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_first.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_last.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_last.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_last.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_last.snap index dac99a6e..f6a89502 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_last.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_last.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_middle.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_middle.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_middle.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_middle.snap index 45f60c49..1b1a8e14 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__drop_middle.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__drop_middle.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__empty_lambda_argument.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__empty_lambda_argument.snap similarity index 96% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__empty_lambda_argument.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__empty_lambda_argument.snap index 943a0437..91d83e15 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__empty_lambda_argument.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__empty_lambda_argument.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__escaping_blocks_all_calls.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__escaping_blocks_all_calls.snap index 645b9e0d..bdaf77b3 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__escaping_blocks_all_calls.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__escaping_blocks_all_calls.snap @@ -1,63 +1,62 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -let alias#7 : int -> int -> int = helper#3 in -addInteger (helper#3 0 21) (alias#7 0 21) +let alias#4 : int -> int -> int = helper#3 in +addInteger (helper#3 0 21) (alias#4 0 21) --- unoptimized UPLC (program 1.1.0 [(lam helper_3 - [(lam alias_7 + [(lam alias_4 [[(builtin addInteger) [[helper_3 (con integer 0)] (con integer 21)]] - [[alias_7 (con integer 0)] (con integer 21)]]) + [[alias_4 (con integer 0)] (con integer 21)]]) helper_3]) (lam unused_1 (lam used_2 used_2))]) --- optimized Core -let helper#6 : int -> int -> int = \unused#4 : int used#5 : int -> used#5 in -let anf#9 : int = helper#6 0 21 in -let anf#10 : int = helper#6 0 21 in +let helper#7 : int -> int -> int = \unused#5 : int used#6 : int -> used#6 in +let anf#9 : int = helper#7 0 21 in +let anf#10 : int = helper#7 0 21 in addInteger anf#9 anf#10 --- optimized UPLC (program 1.1.0 [(lam helper_3 - [(lam anf_7 - [(lam anf_8 [[(builtin addInteger) anf_7] anf_8]) + [(lam anf_4 + [(lam anf_8 [[(builtin addInteger) anf_4] anf_8]) [[helper_3 (con integer 0)] (con integer 21)]]) [[helper_3 (con integer 0)] (con integer 21)]]) (lam unused_1 (lam used_2 used_2))]) --- isolated pass --- core before let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -let alias#7 : int -> int -> int = helper#3 in -let anf#8 : int = helper#3 0 21 in -let anf#9 : int = alias#7 0 21 in -addInteger anf#8 anf#9 +let alias#4 : int -> int -> int = helper#3 in +addInteger (helper#3 0 21) (alias#4 0 21) +--- core early +let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in +let alias#4 : int -> int -> int = helper#3 in +addInteger (helper#3 0 21) (alias#4 0 21) +--- core after ANF +let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in +let alias#4 : int -> int -> int = helper#3 in +let anf#5 : int = helper#3 0 21 in +let anf#6 : int = alias#4 0 21 in +addInteger anf#5 anf#6 --- uplc before (program 1.1.0 [(lam helper_3 - [(lam alias_7 - [(lam anf_8 - [(lam anf_9 [[(builtin addInteger) anf_8] anf_9]) - [[alias_7 (con integer 0)] (con integer 21)]]) - [[helper_3 (con integer 0)] (con integer 21)]]) + [(lam alias_4 + [[(builtin addInteger) [[helper_3 (con integer 0)] (con integer 21)]] + [[alias_4 (con integer 0)] (con integer 21)]]) helper_3]) (lam unused_1 (lam used_2 used_2))]) ---- core after -let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -let alias#7 : int -> int -> int = helper#3 in -let anf#8 : int = helper#3 0 21 in -let anf#9 : int = alias#7 0 21 in -addInteger anf#8 anf#9 --- uplc after (program 1.1.0 [(lam helper_3 - [(lam alias_7 - [(lam anf_8 - [(lam anf_9 [[(builtin addInteger) anf_8] anf_9]) - [[alias_7 (con integer 0)] (con integer 21)]]) + [(lam alias_4 + [(lam anf_5 + [(lam anf_6 [[(builtin addInteger) anf_5] anf_6]) + [[alias_4 (con integer 0)] (con integer 21)]]) [[helper_3 (con integer 0)] (con integer 21)]]) helper_3]) (lam unused_1 (lam used_2 used_2))]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_first.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_first.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_first.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_first.snap index 3556adbb..3c90adb0 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_first.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_first.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_last.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_last.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_last.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_last.snap index 8eb5b938..3fecf737 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_last.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_last.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_middle.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_middle.snap similarity index 97% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_middle.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_middle.snap index 94f9f0df..58a7da21 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__failure_middle.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__failure_middle.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 37 expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__first.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__first.snap index 40e805c0..1b60941a 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__first.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__first.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#4 : int -> int -> int -> int = \x#1 : int y#2 : int z#3 : int -> addInteger y#2 z#3 in @@ -27,27 +26,27 @@ addInteger anf#9 anf#10 --- isolated pass --- core before let helper#4 : int -> int -> int -> int = \x#1 : int y#2 : int z#3 : int -> addInteger y#2 z#3 in -let anf#5 : int = helper#4 10 20 30 in -let anf#6 : int = helper#4 10 20 30 in -addInteger anf#5 anf#6 +addInteger (helper#4 10 20 30) (helper#4 10 20 30) +--- core early +let helper#4 : int -> int -> int = \y#2 : int z#3 : int -> addInteger y#2 z#3 in +addInteger (helper#4 20 30) (helper#4 20 30) +--- core after ANF +let helper#4 : int -> int -> int = \y#2 : int z#3 : int -> addInteger y#2 z#3 in +let anf#1 : int = helper#4 20 30 in +let anf#5 : int = helper#4 20 30 in +addInteger anf#1 anf#5 --- uplc before (program 1.1.0 [(lam helper_4 - [(lam anf_5 - [(lam anf_6 [[(builtin addInteger) anf_5] anf_6]) - [[[helper_4 (con integer 10)] (con integer 20)] (con integer 30)]]) + [[(builtin addInteger) + [[[helper_4 (con integer 10)] (con integer 20)] (con integer 30)]] [[[helper_4 (con integer 10)] (con integer 20)] (con integer 30)]]) (lam x_1 (lam y_2 (lam z_3 [[(builtin addInteger) y_2] z_3])))]) ---- core after -let helper#4 : int -> int -> int = \y#2 : int z#3 : int -> addInteger y#2 z#3 in -let anf#5 : int = helper#4 20 30 in -let anf#6 : int = helper#4 20 30 in -addInteger anf#5 anf#6 --- uplc after (program 1.1.0 [(lam helper_4 - [(lam anf_5 - [(lam anf_6 [[(builtin addInteger) anf_5] anf_6]) + [(lam anf_1 + [(lam anf_5 [[(builtin addInteger) anf_1] anf_5]) [[helper_4 (con integer 20)] (con integer 30)]]) [[helper_4 (con integer 20)] (con integer 30)]]) (lam y_2 (lam z_3 [[(builtin addInteger) y_2] z_3]))]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__fresh_type_views.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__fresh_type_views.snap similarity index 94% rename from crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__fresh_type_views.snap rename to crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__fresh_type_views.snap index 16a29e67..f53d5487 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params_pre_anf__fresh_type_views.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__fresh_type_views.snap @@ -1,5 +1,5 @@ --- -source: crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs assertion_line: 220 expression: "crate::harness::pass_snapshot(b.arena, b.lam(&[external], root),\nformat!(\"--- core before\\n{}\\n--- core after\\n{}\", pretty(root),\npretty(after)))" --- diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__last.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__last.snap index 76a0f3b8..4fadcc6e 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__last.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__last.snap @@ -1,18 +1,17 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core -let helper#16 : int -> int -> int -> int = \x#13 : int y#14 : int z#15 : int -> addInteger x#13 y#14 in -addInteger (helper#16 10 20 30) (helper#16 10 20 30) +let helper#12 : int -> int -> int -> int = \x#9 : int y#10 : int z#11 : int -> addInteger x#9 y#10 in +addInteger (helper#12 10 20 30) (helper#12 10 20 30) --- unoptimized UPLC (program 1.1.0 - [(lam helper_16 + [(lam helper_12 [[(builtin addInteger) - [[[helper_16 (con integer 10)] (con integer 20)] (con integer 30)]] - [[[helper_16 (con integer 10)] (con integer 20)] (con integer 30)]]) - (lam x_13 (lam y_14 (lam z_15 [[(builtin addInteger) x_13] y_14])))]) + [[[helper_12 (con integer 10)] (con integer 20)] (con integer 30)]] + [[[helper_12 (con integer 10)] (con integer 20)] (con integer 30)]]) + (lam x_9 (lam y_10 (lam z_11 [[(builtin addInteger) x_9] y_10])))]) --- optimized Core let anf#5 : int = addInteger 10 20 in let anf#6 : int = addInteger 10 20 in @@ -26,31 +25,31 @@ addInteger anf#5 anf#6 [(builtin addInteger) (con integer 10)]]) --- isolated pass --- core before -let helper#16 : int -> int -> int -> int = \x#13 : int y#14 : int z#15 : int -> addInteger x#13 y#14 in -let anf#17 : int = helper#16 10 20 30 in -let anf#18 : int = helper#16 10 20 30 in -addInteger anf#17 anf#18 +let helper#12 : int -> int -> int -> int = \x#9 : int y#10 : int z#11 : int -> addInteger x#9 y#10 in +addInteger (helper#12 10 20 30) (helper#12 10 20 30) +--- core early +let helper#12 : int -> int -> int = \x#9 : int y#10 : int -> addInteger x#9 y#10 in +addInteger (helper#12 10 20) (helper#12 10 20) +--- core after ANF +let helper#12 : int -> int -> int = \x#9 : int y#10 : int -> addInteger x#9 y#10 in +let anf#1 : int = helper#12 10 20 in +let anf#2 : int = helper#12 10 20 in +addInteger anf#1 anf#2 --- uplc before (program 1.1.0 - [(lam helper_16 - [(lam anf_17 - [(lam anf_18 [[(builtin addInteger) anf_17] anf_18]) - [[[helper_16 (con integer 10)] (con integer 20)] (con integer 30)]]) - [[[helper_16 (con integer 10)] (con integer 20)] (con integer 30)]]) - (lam x_13 (lam y_14 (lam z_15 [[(builtin addInteger) x_13] y_14])))]) ---- core after -let helper#16 : int -> int -> int = \x#13 : int y#14 : int -> addInteger x#13 y#14 in -let anf#17 : int = helper#16 10 20 in -let anf#18 : int = helper#16 10 20 in -addInteger anf#17 anf#18 + [(lam helper_12 + [[(builtin addInteger) + [[[helper_12 (con integer 10)] (con integer 20)] (con integer 30)]] + [[[helper_12 (con integer 10)] (con integer 20)] (con integer 30)]]) + (lam x_9 (lam y_10 (lam z_11 [[(builtin addInteger) x_9] y_10])))]) --- uplc after (program 1.1.0 - [(lam helper_16 - [(lam anf_17 - [(lam anf_18 [[(builtin addInteger) anf_17] anf_18]) - [[helper_16 (con integer 10)] (con integer 20)]]) - [[helper_16 (con integer 10)] (con integer 20)]]) - (lam x_13 (lam y_14 [[(builtin addInteger) x_13] y_14]))]) + [(lam helper_12 + [(lam anf_1 + [(lam anf_2 [[(builtin addInteger) anf_1] anf_2]) + [[helper_12 (con integer 10)] (con integer 20)]]) + [[helper_12 (con integer 10)] (con integer 20)]]) + (lam x_9 (lam y_10 [[(builtin addInteger) x_9] y_10]))]) --- result (con integer 60) --- logs diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__later_argument_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__later_argument_trace.snap new file mode 100644 index 00000000..15cffd89 --- /dev/null +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__later_argument_trace.snap @@ -0,0 +1,54 @@ +--- +source: crates/nash-codegen/src/optimizer_tests/unused_params.rs +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" +--- +--- unoptimized Core +let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in +helper#3 0 (trace "later argument" in 42) +--- unoptimized UPLC +(program 1.1.0 + [(lam helper_3 + [[helper_3 (con integer 0)] + (force + [[(force (builtin trace)) (con string "later argument")] + (delay (con integer 42))])]) + (lam unused_1 (lam used_2 used_2))]) +--- optimized Core +trace "later argument" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "later argument")] (delay (con integer 42))])) + (force (builtin trace))]) +--- isolated pass +--- core before +let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in +helper#3 0 (trace "later argument" in 42) +--- core early +let helper#3 : int -> int = \used#2 : int -> used#2 in +let arg#4 : int = trace "later argument" in 42 in +helper#3 arg#4 +--- core after ANF +let helper#3 : int -> int = \used#2 : int -> used#2 in +let arg#4 : int = trace "later argument" in 42 in +helper#3 arg#4 +--- uplc before +(program 1.1.0 + [(lam helper_3 + [[helper_3 (con integer 0)] + (force + [[(force (builtin trace)) (con string "later argument")] + (delay (con integer 42))])]) + (lam unused_1 (lam used_2 used_2))]) +--- uplc after +(program 1.1.0 + [(lam helper_3 + [(lam arg_4 [helper_3 arg_4]) + (force + [[(force (builtin trace)) (con string "later argument")] + (delay (con integer 42))])]) + (lam used_2 used_2)]) +--- result +(con integer 42) +--- logs +["later argument"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__middle.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__middle.snap index 2e7dd534..05c580e0 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__middle.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__middle.snap @@ -1,18 +1,17 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core -let helper#10 : int -> int -> int -> int = \x#7 : int y#8 : int z#9 : int -> addInteger x#7 z#9 in -addInteger (helper#10 10 20 30) (helper#10 10 20 30) +let helper#8 : int -> int -> int -> int = \x#5 : int y#6 : int z#7 : int -> addInteger x#5 z#7 in +addInteger (helper#8 10 20 30) (helper#8 10 20 30) --- unoptimized UPLC (program 1.1.0 - [(lam helper_10 + [(lam helper_8 [[(builtin addInteger) - [[[helper_10 (con integer 10)] (con integer 20)] (con integer 30)]] - [[[helper_10 (con integer 10)] (con integer 20)] (con integer 30)]]) - (lam x_7 (lam y_8 (lam z_9 [[(builtin addInteger) x_7] z_9])))]) + [[[helper_8 (con integer 10)] (con integer 20)] (con integer 30)]] + [[[helper_8 (con integer 10)] (con integer 20)] (con integer 30)]]) + (lam x_5 (lam y_6 (lam z_7 [[(builtin addInteger) x_5] z_7])))]) --- optimized Core let anf#5 : int = addInteger 10 30 in let anf#6 : int = addInteger 10 30 in @@ -26,31 +25,31 @@ addInteger anf#5 anf#6 [(builtin addInteger) (con integer 10)]]) --- isolated pass --- core before -let helper#10 : int -> int -> int -> int = \x#7 : int y#8 : int z#9 : int -> addInteger x#7 z#9 in -let anf#11 : int = helper#10 10 20 30 in -let anf#12 : int = helper#10 10 20 30 in -addInteger anf#11 anf#12 +let helper#8 : int -> int -> int -> int = \x#5 : int y#6 : int z#7 : int -> addInteger x#5 z#7 in +addInteger (helper#8 10 20 30) (helper#8 10 20 30) +--- core early +let helper#8 : int -> int -> int = \x#5 : int z#7 : int -> addInteger x#5 z#7 in +addInteger (helper#8 10 30) (helper#8 10 30) +--- core after ANF +let helper#8 : int -> int -> int = \x#5 : int z#7 : int -> addInteger x#5 z#7 in +let anf#1 : int = helper#8 10 30 in +let anf#2 : int = helper#8 10 30 in +addInteger anf#1 anf#2 --- uplc before (program 1.1.0 - [(lam helper_10 - [(lam anf_11 - [(lam anf_12 [[(builtin addInteger) anf_11] anf_12]) - [[[helper_10 (con integer 10)] (con integer 20)] (con integer 30)]]) - [[[helper_10 (con integer 10)] (con integer 20)] (con integer 30)]]) - (lam x_7 (lam y_8 (lam z_9 [[(builtin addInteger) x_7] z_9])))]) ---- core after -let helper#10 : int -> int -> int = \x#7 : int z#9 : int -> addInteger x#7 z#9 in -let anf#11 : int = helper#10 10 30 in -let anf#12 : int = helper#10 10 30 in -addInteger anf#11 anf#12 + [(lam helper_8 + [[(builtin addInteger) + [[[helper_8 (con integer 10)] (con integer 20)] (con integer 30)]] + [[[helper_8 (con integer 10)] (con integer 20)] (con integer 30)]]) + (lam x_5 (lam y_6 (lam z_7 [[(builtin addInteger) x_5] z_7])))]) --- uplc after (program 1.1.0 - [(lam helper_10 - [(lam anf_11 - [(lam anf_12 [[(builtin addInteger) anf_11] anf_12]) - [[helper_10 (con integer 10)] (con integer 30)]]) - [[helper_10 (con integer 10)] (con integer 30)]]) - (lam x_7 (lam z_9 [[(builtin addInteger) x_7] z_9]))]) + [(lam helper_8 + [(lam anf_1 + [(lam anf_2 [[(builtin addInteger) anf_1] anf_2]) + [[helper_8 (con integer 10)] (con integer 30)]]) + [[helper_8 (con integer 10)] (con integer 30)]]) + (lam x_5 (lam z_7 [[(builtin addInteger) x_5] z_7]))]) --- result (con integer 80) --- logs diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__oversaturated.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__oversaturated.snap index a028fb64..360410e4 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__oversaturated.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__oversaturated.snap @@ -1,34 +1,36 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core -let returnsFunction#11 : int -> int -> int = \unused#1 : int -> \z#10 : int -> z#10 in -returnsFunction#11 0 42 +let returnsFunction#6 : int -> int -> int = \unused#1 : int -> \z#5 : int -> z#5 in +returnsFunction#6 0 42 --- unoptimized UPLC (program 1.1.0 - [(lam returnsFunction_11 [[returnsFunction_11 (con integer 0)] (con integer 42)]) - (lam unused_1 (lam z_10 z_10))]) + [(lam returnsFunction_6 [[returnsFunction_6 (con integer 0)] (con integer 42)]) + (lam unused_1 (lam z_5 z_5))]) --- optimized Core 42 --- optimized UPLC (program 1.1.0 (con integer 42)) --- isolated pass --- core before -let returnsFunction#11 : int -> int -> int = \unused#1 : int -> \z#10 : int -> z#10 in -returnsFunction#11 0 42 +let returnsFunction#6 : int -> int -> int = \unused#1 : int -> \z#5 : int -> z#5 in +returnsFunction#6 0 42 +--- core early +let returnsFunction#6 : int -> int -> int = \unused#1 : int -> \z#5 : int -> z#5 in +returnsFunction#6 0 42 +--- core after ANF +let returnsFunction#6 : int -> int -> int = \unused#1 : int -> \z#5 : int -> z#5 in +returnsFunction#6 0 42 --- uplc before (program 1.1.0 - [(lam returnsFunction_11 [[returnsFunction_11 (con integer 0)] (con integer 42)]) - (lam unused_1 (lam z_10 z_10))]) ---- core after -let returnsFunction#11 : int -> int -> int = \unused#1 : int -> \z#10 : int -> z#10 in -returnsFunction#11 0 42 + [(lam returnsFunction_6 [[returnsFunction_6 (con integer 0)] (con integer 42)]) + (lam unused_1 (lam z_5 z_5))]) --- uplc after (program 1.1.0 - [(lam returnsFunction_11 [[returnsFunction_11 (con integer 0)] (con integer 42)]) - (lam unused_1 (lam z_10 z_10))]) + [(lam returnsFunction_6 [[returnsFunction_6 (con integer 0)] (con integer 42)]) + (lam unused_1 (lam z_5 z_5))]) --- result (con integer 42) --- logs diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__partial.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__partial.snap index e998d7bb..8de5dac9 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__partial.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__partial.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in @@ -17,16 +16,18 @@ helper#3 0 42 --- isolated pass --- core before let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in +helper#3 0 42 +--- core early +let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in +helper#3 0 42 +--- core after ANF +let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in let anf#4 : int -> int = helper#3 0 in anf#4 42 --- uplc before (program 1.1.0 - [(lam helper_3 [(lam anf_4 [anf_4 (con integer 42)]) [helper_3 (con integer 0)]]) + [(lam helper_3 [[helper_3 (con integer 0)] (con integer 42)]) (lam unused_1 (lam used_2 used_2))]) ---- core after -let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -let anf#4 : int -> int = helper#3 0 in -anf#4 42 --- uplc after (program 1.1.0 [(lam helper_3 [(lam anf_4 [anf_4 (con integer 42)]) [helper_3 (con integer 0)]]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__recursive_unchanged.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__recursive_unchanged.snap index ce153007..235ca488 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__recursive_unchanged.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__recursive_unchanged.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core letrec @@ -27,15 +26,20 @@ letrec helper#3 : int -> int -> int [static []] = \unused#1 : int used#2 : int -> used#2 in helper#3 0 42 ---- uplc before -(program 1.1.0 - [(lam helper_3 [[helper_3 (con integer 0)] (con integer 42)]) - [(lam self_4 [self_4 self_4]) (lam self_4 (lam unused_1 (lam used_2 used_2)))]]) ---- core after +--- core early +letrec + helper#3 : int -> int -> int [static []] = \unused#1 : int used#2 : int -> used#2 +in +helper#3 0 42 +--- core after ANF letrec helper#3 : int -> int -> int [static []] = \unused#1 : int used#2 : int -> used#2 in helper#3 0 42 +--- uplc before +(program 1.1.0 + [(lam helper_3 [[helper_3 (con integer 0)] (con integer 42)]) + [(lam self_4 [self_4 self_4]) (lam self_4 (lam unused_1 (lam used_2 used_2)))]]) --- uplc after (program 1.1.0 [(lam helper_3 [[helper_3 (con integer 0)] (con integer 42)]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__staged_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__staged_trace.snap deleted file mode 100644 index 375fce44..00000000 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__staged_trace.snap +++ /dev/null @@ -1,58 +0,0 @@ ---- -source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" ---- ---- unoptimized Core -let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -helper#3 0 (trace "later argument" in 42) ---- unoptimized UPLC -(program 1.1.0 - [(lam helper_3 - [[helper_3 (con integer 0)] - (force - [[(force (builtin trace)) (con string "later argument")] - (delay (con integer 42))])]) - (lam unused_1 (lam used_2 used_2))]) ---- optimized Core -trace "later argument" in 42 ---- optimized UPLC -(program 1.1.0 - [(lam builtin_1 - (force [[builtin_1 (con string "later argument")] (delay (con integer 42))])) - (force (builtin trace))]) ---- isolated pass ---- core before -let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -let anf#5 : int -> int = helper#3 0 in -let anf#6 : int = trace "later argument" in 42 in -anf#5 anf#6 ---- uplc before -(program 1.1.0 - [(lam helper_3 - [(lam anf_5 - [(lam anf_6 [anf_5 anf_6]) - (force - [[(force (builtin trace)) (con string "later argument")] - (delay (con integer 42))])]) - [helper_3 (con integer 0)]]) - (lam unused_1 (lam used_2 used_2))]) ---- core after -let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> used#2 in -let anf#5 : int -> int = helper#3 0 in -let anf#6 : int = trace "later argument" in 42 in -anf#5 anf#6 ---- uplc after -(program 1.1.0 - [(lam helper_3 - [(lam anf_5 - [(lam anf_6 [anf_5 anf_6]) - (force - [[(force (builtin trace)) (con string "later argument")] - (delay (con integer 42))])]) - [helper_3 (con integer 0)]]) - (lam unused_1 (lam used_2 used_2))]) ---- result -(con integer 42) ---- logs -["later argument"] diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_failure.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_failure.snap index aa03ed5e..7b64de2e 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_failure.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_failure.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> trace "body" in used#2 in @@ -27,24 +26,28 @@ trace "body" in 42 --- isolated pass --- core before let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> trace "body" in used#2 in -let anf#5 : int = trace "argument" in error in -helper#3 anf#5 42 +helper#3 (trace "argument" in error) 42 +--- core early +let helper#3 : int -> int = \used#2 : int -> trace "body" in used#2 in +let arg#4 : int = trace "argument" in error in +helper#3 42 +--- core after ANF +let helper#3 : int -> int = \used#2 : int -> trace "body" in used#2 in +let arg#4 : int = trace "argument" in error in +helper#3 42 --- uplc before (program 1.1.0 [(lam helper_3 - [(lam anf_5 [[helper_3 anf_5] (con integer 42)]) - (force [[(force (builtin trace)) (con string "argument")] (delay (error))])]) + [[helper_3 + (force [[(force (builtin trace)) (con string "argument")] (delay (error))])] + (con integer 42)]) (lam unused_1 (lam used_2 (force [[(force (builtin trace)) (con string "body")] (delay used_2)])))]) ---- core after -let helper#3 : int -> int = \used#2 : int -> trace "body" in used#2 in -let anf#5 : int = trace "argument" in error in -helper#3 42 --- uplc after (program 1.1.0 [(lam helper_3 - [(lam anf_5 [helper_3 (con integer 42)]) + [(lam arg_4 [helper_3 (con integer 42)]) (force [[(force (builtin trace)) (con string "argument")] (delay (error))])]) (lam used_2 (force [[(force (builtin trace)) (con string "body")] (delay used_2)]))]) diff --git a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_trace.snap b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_trace.snap index 98c53170..5b0ad018 100644 --- a/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_trace.snap +++ b/crates/nash-codegen/src/optimizer_tests/snapshots/nash_codegen__optimizer_tests__unused_params__strict_trace.snap @@ -1,7 +1,6 @@ --- source: crates/nash-codegen/src/optimizer_tests/unused_params.rs -assertion_line: 40 -expression: "crate::harness::pass_snapshot(b.arena, core,\nformat!(\"--- core before\\n{}\\n--- uplc before\\n{}\\n--- core after\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), baseline.uplc, pretty(after), candidate.uplc,\ncandidate.result, candidate.logs))" +expression: "crate::harness::pass_snapshot(b.arena, before,\nformat!(\"--- core before\\n{}\\n--- core early\\n{}\\n--- core after ANF\\n{}\\n--- uplc before\\n{}\\n--- uplc after\\n{}\\n--- result\\n{}\\n--- logs\\n{:?}\",\npretty(before), pretty(early), pretty(after), baseline.uplc, candidate.uplc,\ncandidate.result, candidate.logs))" --- --- unoptimized Core let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> trace "body" in used#2 in @@ -28,25 +27,29 @@ trace "body" in 42 --- isolated pass --- core before let helper#3 : int -> int -> int = \unused#1 : int used#2 : int -> trace "body" in used#2 in -let anf#4 : int = trace "argument" in 7 in -helper#3 anf#4 42 +helper#3 (trace "argument" in 7) 42 +--- core early +let helper#3 : int -> int = \used#2 : int -> trace "body" in used#2 in +let arg#4 : int = trace "argument" in 7 in +helper#3 42 +--- core after ANF +let helper#3 : int -> int = \used#2 : int -> trace "body" in used#2 in +let arg#4 : int = trace "argument" in 7 in +helper#3 42 --- uplc before (program 1.1.0 [(lam helper_3 - [(lam anf_4 [[helper_3 anf_4] (con integer 42)]) + [[helper_3 (force - [[(force (builtin trace)) (con string "argument")] (delay (con integer 7))])]) + [[(force (builtin trace)) (con string "argument")] (delay (con integer 7))])] + (con integer 42)]) (lam unused_1 (lam used_2 (force [[(force (builtin trace)) (con string "body")] (delay used_2)])))]) ---- core after -let helper#3 : int -> int = \used#2 : int -> trace "body" in used#2 in -let anf#4 : int = trace "argument" in 7 in -helper#3 42 --- uplc after (program 1.1.0 [(lam helper_3 - [(lam anf_4 [helper_3 (con integer 42)]) + [(lam arg_4 [helper_3 (con integer 42)]) (force [[(force (builtin trace)) (con string "argument")] (delay (con integer 7))])]) (lam used_2 diff --git a/crates/nash-codegen/src/optimizer_tests/unused_params.rs b/crates/nash-codegen/src/optimizer_tests/unused_params.rs index 7d597fe8..b507686f 100644 --- a/crates/nash-codegen/src/optimizer_tests/unused_params.rs +++ b/crates/nash-codegen/src/optimizer_tests/unused_params.rs @@ -1,4 +1,4 @@ -//! Nonrecursive, exact-call-only unused-parameter trial. +//! Accepted nonrecursive unused-parameter removal, before ANF. use nash_ir::{ anf, build::Builder, @@ -22,15 +22,12 @@ fn trace<'a>(b: &Builder<'a>, name: &'a str, value: &'a Core<'a>) -> &'a Core<'a fn call<'a>(b: &Builder<'a>, f: Binder<'a>, args: &[&'a Core<'a>]) -> &'a Core<'a> { b.app(b.var(f.name, f.ty), args, INT) } -fn check(name: &str, b: &Builder<'_>, core: &Core<'_>, changed: bool, fails: bool) { - let before = anf::normalize(b, core); - let after = unused_params::reduce(b, before); - - for phase in [before, after] { - anf::validate(phase).unwrap(); - hygiene::validate(phase, &[]).unwrap(); - } +fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, changed: bool, fails: bool) { + // A foreign name supply must avoid every ID owned by the input. + let fresh = Builder::new(b.arena); + let early = unused_params::reduce(&fresh, before); + let after = anf::normalize(&fresh, early); let baseline = crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, before).unwrap()); let candidate = @@ -41,22 +38,26 @@ fn check(name: &str, b: &Builder<'_>, core: &Core<'_>, changed: bool, fails: boo name, crate::harness::pass_snapshot( b.arena, - core, + before, format!( - "--- core before\n{}\n--- uplc before\n{}\n--- core after\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", + "--- core before\n{}\n--- core early\n{}\n--- core after ANF\n{}\n--- uplc before\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", pretty(before), - baseline.uplc, + pretty(early), pretty(after), + baseline.uplc, candidate.uplc, candidate.result, candidate.logs ) ) ); + anf::validate(after).unwrap(); + hygiene::validate(after, &[]).unwrap(); + hygiene::validate(early, &[]).unwrap(); // Properties independent of the expected snapshot. - assert_eq!(!std::ptr::eq(before, after), changed); - assert!(std::ptr::eq(after, unused_params::reduce(b, after))); - assert_eq!(before.ty, after.ty); + assert_eq!(!std::ptr::eq(before, early), changed); + assert!(std::ptr::eq(early, unused_params::reduce(&fresh, early))); + assert_eq!(before.ty, early.ty); assert_eq!(baseline.observable, candidate.observable); assert_eq!(baseline.logs, candidate.logs); } @@ -149,7 +150,7 @@ fn strict_removed_arguments_keep_effects_and_failure() { ); } #[test] -fn partial_staged_escaping_and_oversaturated_uses_block_changes() { +fn partial_escaping_and_oversaturated_uses_block_changes() { let a = Arena::new(); let b = Builder::new(&a); let x = bind(&b, "unused", INT); @@ -165,17 +166,7 @@ fn partial_staged_escaping_and_oversaturated_uses_block_changes() { false, false, ); - check( - "staged_trace", - &b, - b.let_( - f, - value, - call(&b, f, &[b.int(0), trace(&b, "later argument", b.int(42))]), - ), - false, - false, - ); + let alias = bind(&b, "alias", f.ty); let escaped = b.let_( alias, @@ -248,6 +239,18 @@ fn explicit_function_views_keep_their_result_annotations() { Ty::Erased, ); let after = unused_params::reduce(&b, root); + insta::assert_snapshot!( + "type_views", + crate::harness::pass_snapshot( + b.arena, + root, + format!( + "--- core before\n{}\n--- core after\n{}", + pretty(root), + pretty(after) + ) + ) + ); assert_eq!(after.ty, Ty::Erased); let CoreKind::Let { binder, @@ -258,26 +261,13 @@ fn explicit_function_views_keep_their_result_annotations() { panic!("let"); }; assert_eq!(binder.ty, value.ty); - let CoreKind::App { func, args } = body.kind else { + let CoreKind::App { func, .. } = body.kind else { panic!("call"); }; - assert_eq!(args.len(), 1); assert_eq!(body.ty, bytes); assert_eq!(func.ty, Ty::Term(a.alloc(TermTy::Fun(&[INT], bytes)))); hygiene::validate(after, &[]).unwrap(); anf::validate(after).unwrap(); - insta::assert_snapshot!( - "type_views", - crate::harness::pass_snapshot( - b.arena, - root, - format!( - "--- core before\n{}\n--- core after\n{}", - pretty(root), - pretty(after) - ) - ) - ); } #[test] @@ -316,6 +306,18 @@ fn all_unused_preserves_independent_delayed_type_views() { let view = Ty::Term(a.alloc(TermTy::Fun(&[INT], bytes))); let root = b.let_(f, value, b.app(b.var(f.name, view), &[b.int(0)], bytes)); let after = unused_params::reduce(&b, root); + insta::assert_snapshot!( + "delayed_type_views", + crate::harness::pass_snapshot( + b.arena, + root, + format!( + "--- core before\n{}\n--- core after\n{}", + pretty(root), + pretty(after) + ) + ) + ); let CoreKind::Let { binder, value, @@ -336,8 +338,227 @@ fn all_unused_preserves_independent_delayed_type_views() { assert_eq!(body.ty, bytes); hygiene::validate(after, &[]).unwrap(); anf::validate(after).unwrap(); +} + +#[test] +fn exact_call_with_later_effectful_argument_is_reduced() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "unused", INT); + let y = bind(&b, "used", INT); + let value = b.lam(&[x, y], b.var(y.name, INT)); + let f = bind(&b, "helper", value.ty); + check( + "later_argument_trace", + &b, + b.let_( + f, + value, + call(&b, f, &[b.int(0), trace(&b, "later argument", b.int(42))]), + ), + true, + false, + ); +} +#[test] +fn retained_and_discarded_arguments_keep_source_order() { + let a = Arena::new(); + let b = Builder::new(&a); + for (drop, name) in ["drop_first", "drop_middle", "drop_last"] + .iter() + .enumerate() + { + let ps: Vec<_> = (0..3).map(|_| bind(&b, "p", INT)).collect(); + let args: Vec<_> = ps + .iter() + .enumerate() + .filter_map(|(i, p)| (i != drop).then_some(b.var(p.name, p.ty))) + .collect(); + let value = b.lam(&ps, trace(&b, "body", b.builtin(F::AddInteger, &args, INT))); + let f = bind(&b, "helper", value.ty); + let call = b.app( + b.var(f.name, f.ty), + &[ + trace(&b, "a", b.int(10)), + trace(&b, "b", b.int(20)), + trace(&b, "c", b.int(30)), + ], + INT, + ); + check(name, &b, b.let_(f, value, call), true, false); + } +} +#[test] +fn failure_at_every_argument_stops_later_work() { + let a = Arena::new(); + let b = Builder::new(&a); + for (fail_at, name) in ["failure_first", "failure_middle", "failure_last"] + .iter() + .enumerate() + { + let ps: Vec<_> = (0..3).map(|_| bind(&b, "p", INT)).collect(); + let value = b.lam(&ps, trace(&b, "body", b.var(ps[1].name, INT))); + let f = bind(&b, "helper", value.ty); + let labels = ["a", "b", "c"]; + let args: Vec<_> = labels + .iter() + .enumerate() + .map(|(i, label)| { + trace( + &b, + label, + if i == fail_at { + b.error(INT) + } else { + b.int(42) + }, + ) + }) + .collect(); + check( + name, + &b, + b.let_(f, value, b.app(b.var(f.name, f.ty), &args, INT)), + true, + true, + ); + } +} +#[test] +fn all_unused_arguments_are_strict_but_body_is_delayed_per_call() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "x", INT); + let y = bind(&b, "y", INT); + let value = b.lam(&[x, y], trace(&b, "body", b.int(21))); + let f = bind(&b, "helper", value.ty); + let invoke = || { + b.app( + b.var(f.name, f.ty), + &[trace(&b, "a", b.int(1)), trace(&b, "b", b.int(2))], + INT, + ) + }; + check( + "all_unused_traced_twice", + &b, + b.let_( + f, + value, + b.builtin(F::AddInteger, &[invoke(), invoke()], INT), + ), + true, + false, + ); + check( + "cold_arguments", + &b, + b.let_( + f, + value, + b.if_(b.lit(Constant::bool(&a, true)), b.int(42), invoke()), + ), + true, + false, + ); +} +#[test] +fn zero_parameter_lambda_argument_is_evaluated() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "unused", INT); + let value = b.lam(&[x], b.int(42)); + let f = bind(&b, "helper", value.ty); + let argument = b.lam(&[], trace(&b, "argument", b.int(7))); + check( + "empty_lambda_argument", + &b, + b.let_(f, value, b.app(b.var(f.name, f.ty), &[argument], INT)), + true, + false, + ); +} +#[test] +fn fresh_binders_avoid_free_ids_and_keep_argument_type_views() { + let a = Arena::new(); + let b = Builder::new(&a); + let x = bind(&b, "unused", INT); + let y = bind(&b, "used", INT); + let value = b.lam(&[x, y], b.var(y.name, INT)); + let f = bind(&b, "helper", value.ty); + let external = bind(&b, "external", INT); + let bytes = Ty::Const(&ConstTy::Bytes); + let argument = b.with_type( + b.builtin(F::AddInteger, &[b.var(external.name, INT), b.int(1)], INT), + bytes, + ); + let root = b.let_( + f, + value, + b.app( + b.var(f.name, f.ty), + &[trace(&b, "unused", b.int(0)), argument], + INT, + ), + ); + let after = unused_params::reduce(&Builder::new(&a), root); insta::assert_snapshot!( - "delayed_type_views", + "fresh_type_views", + crate::harness::pass_snapshot( + b.arena, + b.lam(&[external], root), + format!( + "--- core before\n{}\n--- core after\n{}", + pretty(root), + pretty(after) + ) + ) + ); + hygiene::validate(after, &[external.name]).unwrap(); + let CoreKind::Let { body, .. } = after.kind else { + panic!("helper binding") + }; + let CoreKind::Let { body, .. } = body.kind else { + panic!("first argument") + }; + let CoreKind::Let { + binder, + value, + body, + } = body.kind + else { + panic!("second argument") + }; + assert_eq!(binder.ty, bytes); + assert_eq!(value.ty, bytes); + assert_ne!(binder.name.unique, external.name.unique); + let CoreKind::App { args: [arg], .. } = body.kind else { + panic!("shortened call") + }; + assert_eq!(arg.ty, bytes); +} +#[test] +fn diverging_discarded_argument_is_still_a_strict_binding() { + let a = Arena::new(); + let b = Builder::new(&a); + let p = bind(&b, "p", INT); + let value = b.lam(&[p], b.int(42)); + let f = bind(&b, "helper", value.ty); + let n = bind(&b, "n", INT); + let loop_fn = bind(&b, "loop", value.ty); + let diverge = b.let_rec( + &[RecBinder { + binder: loop_fn, + params: a.alloc_slice_copy(&[n]), + static_params: &[], + body: b.app(b.var(loop_fn.name, loop_fn.ty), &[b.var(n.name, INT)], INT), + }], + b.app(b.var(loop_fn.name, loop_fn.ty), &[b.int(0)], INT), + ); + let root = b.let_(f, value, b.app(b.var(f.name, f.ty), &[diverge], INT)); + let after = unused_params::reduce(&b, root); + insta::assert_snapshot!( + "divergent_argument", crate::harness::pass_snapshot( b.arena, root, @@ -348,4 +569,12 @@ fn all_unused_preserves_independent_delayed_type_views() { ) ) ); + let CoreKind::Let { body, .. } = after.kind else { + panic!("helper") + }; + let CoreKind::Let { value, .. } = body.kind else { + panic!("strict argument") + }; + assert!(std::ptr::eq(value, diverge)); + hygiene::validate(after, &[]).unwrap(); } diff --git a/crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs b/crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs deleted file mode 100644 index a05f9b1d..00000000 --- a/crates/nash-codegen/src/optimizer_tests/unused_params_pre_anf.rs +++ /dev/null @@ -1,273 +0,0 @@ -//! Early unused-parameter trial: strict call arguments before ANF. -use nash_ir::{ - anf, - build::Builder, - core::*, - hygiene, - pretty::pretty, - ty::{ConstTy, Ty}, - unused_params, -}; -use nash_plutus::{arena::Arena, builtin::DefaultFunction as F, constant::Constant}; -const INT: Ty<'static> = Ty::Const(&ConstTy::Int); -fn bind<'a>(b: &Builder<'a>, text: &'a str, ty: Ty<'a>) -> Binder<'a> { - Binder { - name: b.fresh(text), - ty, - } -} -fn trace<'a>(b: &Builder<'a>, text: &'a str, core: &'a Core<'a>) -> &'a Core<'a> { - b.trace(b.lit(Constant::string(b.arena, text)), core) -} -fn check(name: &str, b: &Builder<'_>, before: &Core<'_>, fails: bool) { - // A foreign name supply must avoid every ID owned by the input. - let fresh = Builder::new(b.arena); - let early = unused_params::reduce(&fresh, before); - - hygiene::validate(early, &[]).unwrap(); - let after = anf::normalize(&fresh, early); - anf::validate(after).unwrap(); - hygiene::validate(after, &[]).unwrap(); - let baseline = - crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, before).unwrap()); - let candidate = - crate::harness::eval_core_raw(b.arena, crate::recursion::rewrite(b, after).unwrap()); - - assert_eq!(candidate.result.starts_with("error:"), fails); - insta::assert_snapshot!( - name, - crate::harness::pass_snapshot( - b.arena, - before, - format!( - "--- core before\n{}\n--- core early\n{}\n--- core after ANF\n{}\n--- uplc before\n{}\n--- uplc after\n{}\n--- result\n{}\n--- logs\n{:?}", - pretty(before), - pretty(early), - pretty(after), - baseline.uplc, - candidate.uplc, - candidate.result, - candidate.logs - ) - ) - ); - // Properties independent of the expected snapshot. - assert!(!std::ptr::eq(before, early)); - assert_eq!(before.ty, early.ty); - assert_eq!(baseline.observable, candidate.observable); - assert_eq!(baseline.logs, candidate.logs); -} -#[test] -fn retained_and_discarded_arguments_keep_source_order() { - let a = Arena::new(); - let b = Builder::new(&a); - for (drop, name) in ["drop_first", "drop_middle", "drop_last"] - .iter() - .enumerate() - { - let ps: Vec<_> = (0..3).map(|_| bind(&b, "p", INT)).collect(); - let args: Vec<_> = ps - .iter() - .enumerate() - .filter_map(|(i, p)| (i != drop).then_some(b.var(p.name, p.ty))) - .collect(); - let value = b.lam(&ps, trace(&b, "body", b.builtin(F::AddInteger, &args, INT))); - let f = bind(&b, "helper", value.ty); - let call = b.app( - b.var(f.name, f.ty), - &[ - trace(&b, "a", b.int(10)), - trace(&b, "b", b.int(20)), - trace(&b, "c", b.int(30)), - ], - INT, - ); - check(name, &b, b.let_(f, value, call), false); - } -} -#[test] -fn failure_at_every_argument_stops_later_work() { - let a = Arena::new(); - let b = Builder::new(&a); - for (fail_at, name) in ["failure_first", "failure_middle", "failure_last"] - .iter() - .enumerate() - { - let ps: Vec<_> = (0..3).map(|_| bind(&b, "p", INT)).collect(); - let value = b.lam(&ps, trace(&b, "body", b.var(ps[1].name, INT))); - let f = bind(&b, "helper", value.ty); - let labels = ["a", "b", "c"]; - let args: Vec<_> = labels - .iter() - .enumerate() - .map(|(i, label)| { - trace( - &b, - label, - if i == fail_at { - b.error(INT) - } else { - b.int(42) - }, - ) - }) - .collect(); - check( - name, - &b, - b.let_(f, value, b.app(b.var(f.name, f.ty), &args, INT)), - true, - ); - } -} -#[test] -fn all_unused_arguments_are_strict_but_body_is_delayed_per_call() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, "x", INT); - let y = bind(&b, "y", INT); - let value = b.lam(&[x, y], trace(&b, "body", b.int(21))); - let f = bind(&b, "helper", value.ty); - let invoke = || { - b.app( - b.var(f.name, f.ty), - &[trace(&b, "a", b.int(1)), trace(&b, "b", b.int(2))], - INT, - ) - }; - check( - "all_unused_twice", - &b, - b.let_( - f, - value, - b.builtin(F::AddInteger, &[invoke(), invoke()], INT), - ), - false, - ); - check( - "cold_arguments", - &b, - b.let_( - f, - value, - b.if_(b.lit(Constant::bool(&a, true)), b.int(42), invoke()), - ), - false, - ); -} -#[test] -fn zero_parameter_lambda_argument_is_evaluated() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, "unused", INT); - let value = b.lam(&[x], b.int(42)); - let f = bind(&b, "helper", value.ty); - let argument = b.lam(&[], trace(&b, "argument", b.int(7))); - check( - "empty_lambda_argument", - &b, - b.let_(f, value, b.app(b.var(f.name, f.ty), &[argument], INT)), - false, - ); -} -#[test] -fn fresh_binders_avoid_free_ids_and_keep_argument_type_views() { - let a = Arena::new(); - let b = Builder::new(&a); - let x = bind(&b, "unused", INT); - let y = bind(&b, "used", INT); - let value = b.lam(&[x, y], b.var(y.name, INT)); - let f = bind(&b, "helper", value.ty); - let external = bind(&b, "external", INT); - let bytes = Ty::Const(&ConstTy::Bytes); - let argument = b.with_type( - b.builtin(F::AddInteger, &[b.var(external.name, INT), b.int(1)], INT), - bytes, - ); - let root = b.let_( - f, - value, - b.app( - b.var(f.name, f.ty), - &[trace(&b, "unused", b.int(0)), argument], - INT, - ), - ); - let after = unused_params::reduce(&Builder::new(&a), root); - hygiene::validate(after, &[external.name]).unwrap(); - let CoreKind::Let { body, .. } = after.kind else { - panic!("helper binding") - }; - let CoreKind::Let { body, .. } = body.kind else { - panic!("first argument") - }; - let CoreKind::Let { - binder, - value, - body, - } = body.kind - else { - panic!("second argument") - }; - assert_eq!(binder.ty, bytes); - assert_eq!(value.ty, bytes); - assert_ne!(binder.name.unique, external.name.unique); - let CoreKind::App { args: [arg], .. } = body.kind else { - panic!("shortened call") - }; - assert_eq!(arg.ty, bytes); - insta::assert_snapshot!( - "fresh_type_views", - crate::harness::pass_snapshot( - b.arena, - b.lam(&[external], root), - format!( - "--- core before\n{}\n--- core after\n{}", - pretty(root), - pretty(after) - ) - ) - ); -} -#[test] -fn diverging_discarded_argument_is_still_a_strict_binding() { - let a = Arena::new(); - let b = Builder::new(&a); - let p = bind(&b, "p", INT); - let value = b.lam(&[p], b.int(42)); - let f = bind(&b, "helper", value.ty); - let n = bind(&b, "n", INT); - let loop_fn = bind(&b, "loop", value.ty); - let diverge = b.let_rec( - &[RecBinder { - binder: loop_fn, - params: a.alloc_slice_copy(&[n]), - static_params: &[], - body: b.app(b.var(loop_fn.name, loop_fn.ty), &[b.var(n.name, INT)], INT), - }], - b.app(b.var(loop_fn.name, loop_fn.ty), &[b.int(0)], INT), - ); - let root = b.let_(f, value, b.app(b.var(f.name, f.ty), &[diverge], INT)); - let after = unused_params::reduce(&b, root); - let CoreKind::Let { body, .. } = after.kind else { - panic!("helper") - }; - let CoreKind::Let { value, .. } = body.kind else { - panic!("strict argument") - }; - assert!(std::ptr::eq(value, diverge)); - hygiene::validate(after, &[]).unwrap(); - insta::assert_snapshot!( - "divergent_argument", - crate::harness::pass_snapshot( - b.arena, - root, - format!( - "--- core before\n{}\n--- core after\n{}", - pretty(root), - pretty(after) - ) - ) - ); -} diff --git a/crates/nash-codegen/src/program.rs b/crates/nash-codegen/src/program.rs index 95c510ac..ff874b76 100644 --- a/crates/nash-codegen/src/program.rs +++ b/crates/nash-codegen/src/program.rs @@ -57,8 +57,6 @@ pub fn assemble<'a>(arena: &'a Arena, module: &Module<'a>) -> Result(arena: &'a Arena, core: &'a Core<'a>) -> Result, Error<'a>> { assemble_core_for_version(arena, core, PlutusVersion::V3) } @@ -68,13 +66,33 @@ pub fn assemble_core_for_version<'a>( arena: &'a Arena, core: &'a Core<'a>, version: PlutusVersion, +) -> Result, Error<'a>> { + assemble_core_with_options(arena, core, version, nash_config::OptimizationLevel::O0) +} + +/// Assemble at the selected optimization level without changing trace policy. +pub fn assemble_core_with_options<'a>( + arena: &'a Arena, + core: &'a Core<'a>, + version: PlutusVersion, + optimize: nash_config::OptimizationLevel, ) -> Result, Error<'a>> { if let Some(name) = free_variables(core).first() { return Err(Error::NotClosed(*name)); } + let core = match optimize { + nash_config::OptimizationLevel::O0 => core, + nash_config::OptimizationLevel::O1 => crate::optimizer::optimize(arena, core), + }; let build = Builder::new(arena); let core = crate::recursion::rewrite(&build, core)?; - let named = crate::lower::lower(arena, core)?; + let named = match optimize { + nash_config::OptimizationLevel::O0 => crate::lower::lower(arena, core)?, + nash_config::OptimizationLevel::O1 => { + let core = nash_ir::hygiene::freshen(&build, core); + crate::lower::lower_with_constant_sharing(arena, core)? + } + }; let term = debruijn::to_debruijn(arena, named).map_err(Error::DeBruijn)?; let uplc_version = Version::plutus_v3(arena); let program = Program::new(arena, uplc_version, term); diff --git a/crates/nash-codegen/src/program/snapshots/nash_codegen__program__tests__o1_traces_failure_false.snap b/crates/nash-codegen/src/program/snapshots/nash_codegen__program__tests__o1_traces_failure_false.snap new file mode 100644 index 00000000..d388d4e5 --- /dev/null +++ b/crates/nash-codegen/src/program/snapshots/nash_codegen__program__tests__o1_traces_failure_false.snap @@ -0,0 +1,26 @@ +--- +source: crates/nash-codegen/src/program/tests.rs +expression: "format!(\"{}\\n--- O0 outcome\\n{:?}\\n--- O0 logs\\n{:?}\\n--- O1 outcome\\n{:?}\\n--- O1 logs\\n{:?}\",\nprepared.snapshot(), before.term.as_ref().map(|t| pretty::term(t)),\nbefore.info.logs, after.term.as_ref().map(|t| pretty::term(t)),\nafter.info.logs)" +--- +--- unoptimized Core +trace "before" in unIData (iData 42) +--- unoptimized UPLC +(program 1.1.0 + (force + [[(force (builtin trace)) (con string "before")] + (delay [(builtin unIData) [(builtin iData) (con integer 42)]])])) +--- optimized Core +trace "before" in 42 +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 + (force [[builtin_1 (con string "before")] (delay (con integer 42))])) + (force (builtin trace))]) +--- O0 outcome +Ok("(con integer 42)") +--- O0 logs +["before"] +--- O1 outcome +Ok("(con integer 42)") +--- O1 logs +["before"] diff --git a/crates/nash-codegen/src/program/snapshots/nash_codegen__program__tests__o1_traces_failure_true.snap b/crates/nash-codegen/src/program/snapshots/nash_codegen__program__tests__o1_traces_failure_true.snap new file mode 100644 index 00000000..77cab5ac --- /dev/null +++ b/crates/nash-codegen/src/program/snapshots/nash_codegen__program__tests__o1_traces_failure_true.snap @@ -0,0 +1,23 @@ +--- +source: crates/nash-codegen/src/program/tests.rs +expression: "format!(\"{}\\n--- O0 outcome\\n{:?}\\n--- O0 logs\\n{:?}\\n--- O1 outcome\\n{:?}\\n--- O1 logs\\n{:?}\",\nprepared.snapshot(), before.term.as_ref().map(|t| pretty::term(t)),\nbefore.info.logs, after.term.as_ref().map(|t| pretty::term(t)),\nafter.info.logs)" +--- +--- unoptimized Core +trace "before" in error +--- unoptimized UPLC +(program 1.1.0 + (force [[(force (builtin trace)) (con string "before")] (delay (error))])) +--- optimized Core +trace "before" in error +--- optimized UPLC +(program 1.1.0 + [(lam builtin_1 (force [[builtin_1 (con string "before")] (delay (error))])) + (force (builtin trace))]) +--- O0 outcome +Err(ExplicitErrorTerm) +--- O0 logs +["before"] +--- O1 outcome +Err(ExplicitErrorTerm) +--- O1 logs +["before"] diff --git a/crates/nash-codegen/src/program/tests.rs b/crates/nash-codegen/src/program/tests.rs index e9e91b3e..d2b60be8 100644 --- a/crates/nash-codegen/src/program/tests.rs +++ b/crates/nash-codegen/src/program/tests.rs @@ -493,3 +493,82 @@ fn assemble_selected_ledger_language() { assert!(assemble_core_for_version(&a, newer, version).is_ok()); } } + +#[test] +fn o1_assembly_matches_snapshot_pipeline_and_preserves_traces() { + use nash_config::OptimizationLevel; + let arena = Arena::new(); + let b = Builder::new(&arena); + let int = Ty::Const(&ConstTy::Int); + let data = Ty::Big(&BigTy::Data); + for fails in [false, true] { + let value = b.builtin(F::UnIData, &[b.builtin(F::IData, &[b.int(42)], data)], int); + let root = b.trace( + b.lit(Constant::string(&arena, "before")), + if fails { b.error(int) } else { value }, + ); + let prepared = crate::snapshot_optimizer::prepare(&arena, root); + let o1 = assemble_core_with_options(&arena, root, PlutusVersion::V3, OptimizationLevel::O1) + .unwrap(); + let before = prepared.before.program.eval(&arena); + let after = o1.program.eval(&arena); + insta::assert_snapshot!( + format!("o1_traces_failure_{fails}"), + format!( + "{}\n--- O0 outcome\n{:?}\n--- O0 logs\n{:?}\n--- O1 outcome\n{:?}\n--- O1 logs\n{:?}", + prepared.snapshot(), + before.term.as_ref().map(|t| pretty::term(t)), + before.info.logs, + after.term.as_ref().map(|t| pretty::term(t)), + after.info.logs + ) + ); + assert_eq!( + nash_plutus::flat::encode(prepared.after.program).unwrap(), + nash_plutus::flat::encode(o1.program).unwrap() + ); + assert_eq!( + before + .term + .as_ref() + .map(|t| pretty::term(t)) + .map_err(|e| format!("{e:?}")), + after + .term + .as_ref() + .map(|t| pretty::term(t)) + .map_err(|e| format!("{e:?}")) + ); + assert_eq!(before.info.logs, after.info.logs); + } +} + +#[test] +fn deep_assembly_uses_heap_work_lists() { + std::thread::Builder::new() + .stack_size(256 * 1024) + .spawn(|| { + let arena = Arena::new(); + let b = Builder::new(&arena); + let message = b.lit(Constant::string(&arena, "tick")); + let mut core = b.int(1); + for _ in 0..4096 { + core = b.trace(message, core); + } + let mut outcomes = Vec::new(); + for level in [ + nash_config::OptimizationLevel::O0, + nash_config::OptimizationLevel::O1, + ] { + let compiled = + assemble_core_with_options(&arena, core, PlutusVersion::V3, level).unwrap(); + nash_plutus::flat::encode(compiled.program).unwrap(); + let result = compiled.program.eval(&arena); + outcomes.push((pretty::term(result.term.unwrap()), result.info.logs)); + } + assert_eq!(outcomes[0], outcomes[1]); + }) + .unwrap() + .join() + .unwrap(); +} diff --git a/crates/nash-codegen/src/recursion.rs b/crates/nash-codegen/src/recursion.rs index 69fc9ceb..a7363579 100644 --- a/crates/nash-codegen/src/recursion.rs +++ b/crates/nash-codegen/src/recursion.rs @@ -78,6 +78,29 @@ struct Rewriter<'b, 'a> { used: HashSet, } +// Continuations retain unfinished work on the heap, including nested groups. +enum Task<'a> { + Visit(&'a Core<'a>, Environment<'a>), + Finish(Continuation<'a>), +} +type Continuation<'a> = Box< + dyn FnOnce( + &mut Rewriter<'_, 'a>, + &mut Vec>, + &mut Vec<&'a Core<'a>>, + ) -> Result>, Error> + + 'a, +>; +struct Mutual<'a> { + binders: &'a [RecBinder<'a>], + outer: Environment<'a>, + continuation: &'a Core<'a>, + arms: &'a [DispatchArm<'a>], + dispatcher: Binder<'a>, + request: Binder<'a>, + branches: Vec>, +} + impl<'a> Rewriter<'_, 'a> { fn fresh(&mut self, text: &'a str, ty: Ty<'a>) -> Binder<'a> { loop { @@ -102,23 +125,58 @@ impl<'a> Rewriter<'_, 'a> { self.build.lam(¶ms, self.build.app(func, &args, result)) } fn term(&mut self, core: &'a Core<'a>, env: &Environment<'a>) -> Result<&'a Core<'a>, Error> { + let mut tasks = vec![Task::Visit(core, env.clone())]; + let mut results = Vec::new(); + while let Some(task) = tasks.pop() { + match task { + Task::Visit(core, env) => self.schedule(core, env, &mut tasks, &mut results)?, + Task::Finish(finish) => { + if let Some(result) = finish(self, &mut tasks, &mut results)? { + results.push(result); + } + } + } + } + Ok(results.pop().unwrap()) + } + + fn schedule( + &mut self, + core: &'a Core<'a>, + env: Environment<'a>, + tasks: &mut Vec>, + results: &mut Vec<&'a Core<'a>>, + ) -> Result<(), Error> { let b = self.build; - let result = match &core.kind { - CoreKind::Var(n) => env.get(n).map_or(core, |r| r.value), - CoreKind::Lit(_) | CoreKind::Error => core, - CoreKind::Lam { params, body } => b.lam( - params, - self.term(body, &without(env, params.iter().map(|p| p.name)))?, - ), - CoreKind::App { func, args } => { - if let CoreKind::Var(n) = &func.kind - && let Some((dispatcher, tag, arms)) = env.get(n).and_then(|r| r.packet) - && args.len() >= arms[usize::from(tag)].params.len() - { - let args = args - .iter() - .map(|arg| self.term(arg, env)) - .collect::, _>>()?; + match core.kind { + CoreKind::Var(n) => { + results.push(b.with_type(env.get(&n).map_or(core, |r| r.value), core.ty)); + return Ok(()); + } + CoreKind::Lit(_) | CoreKind::Error => { + results.push(core); + return Ok(()); + } + CoreKind::LetRec { binders, body } => { + return self.group(core.ty, binders, body, env, tasks); + } + _ => {} + } + let start = results.len(); + if let CoreKind::App { + func: Core { + kind: CoreKind::Var(n), + .. + }, + args, + } = core.kind + { + if let Some((dispatcher, tag, arms)) = env.get(n).and_then(|r| r.packet) + && args.len() >= arms[usize::from(tag)].params.len() + { + tasks.push(Task::Finish(Box::new(move |this, _, results| { + let b = this.build; + let args: Vec<_> = results.drain(start..).collect(); let arm = &arms[usize::from(tag)]; let arity = arm.params.len(); let mut fields = vec![b.var(dispatcher.name, dispatcher.ty)]; @@ -129,117 +187,154 @@ impl<'a> Rewriter<'_, 'a> { &[b.constr(tag, &fields, packet_ty)], arm.result, ); - if args.len() == arity { + let result = if args.len() == arity { call } else { b.app(call, &args[arity..], core.ty) - } - } else if let CoreKind::Var(n) = &func.kind - && let Some(Replacement { - direct: Some((target, excluded)), - .. - }) = env.get(n) - { - let args = args - .iter() + }; + Ok(Some(b.with_type(result, core.ty))) + }))); + tasks.extend(args.iter().rev().map(|arg| Task::Visit(arg, env.clone()))); + return Ok(()); + } + if let Some(Replacement { + direct: Some((target, excluded)), + .. + }) = env.get(n) + { + let target = *target; + tasks.push(Task::Finish(Box::new(move |this, _, results| { + let args: Vec<_> = results.drain(start..).collect(); + Ok(Some(this.build.app(target, &args, core.ty))) + }))); + tasks.extend( + args.iter() .enumerate() + .rev() .filter(|(i, _)| !excluded.iter().any(|x| usize::from(*x) == *i)) - .map(|(_, arg)| self.term(arg, env)) - .collect::, _>>()?; - b.app(target, &args, core.ty) - } else { - let func = self.term(func, env)?; - let args = args + .map(|(_, arg)| Task::Visit(arg, env.clone())), + ); + return Ok(()); + } + } + tasks.push(Task::Finish(Box::new(move |this, _, results| { + let b = this.build; + let mut children = results.drain(start..); + let result = match core.kind { + CoreKind::Lam { params, .. } => b.lam(params, children.next().unwrap()), + CoreKind::App { .. } => { + let func = children.next().unwrap(); + b.app(func, &children.by_ref().collect::>(), core.ty) + } + CoreKind::Let { binder, .. } => { + b.let_(binder, children.next().unwrap(), children.next().unwrap()) + } + CoreKind::Case { + kind, + branches, + default, + .. + } => { + let scrutinee = children.next().unwrap(); + let branches: Vec<_> = branches .iter() - .map(|arg| self.term(arg, env)) - .collect::, _>>()?; - b.app(func, &args, core.ty) + .map(|branch| Branch { + body: children.next().unwrap(), + ..*branch + }) + .collect(); + let default = default.map(|_| children.next().unwrap()); + b.case(kind, scrutinee, &branches, default, core.ty) } - } + CoreKind::Constr { tag, .. } => { + b.constr(tag, &children.by_ref().collect::>(), core.ty) + } + CoreKind::Field { index, arity, .. } => b.alloc( + core.ty, + CoreKind::Field { + record: children.next().unwrap(), + index, + arity, + }, + ), + CoreKind::Builtin { func, .. } => b.alloc( + core.ty, + CoreKind::Builtin { + func, + args: b + .arena + .alloc_slice_copy(&children.by_ref().collect::>()), + }, + ), + CoreKind::Trace { .. } => { + b.trace(children.next().unwrap(), children.next().unwrap()) + } + CoreKind::Delay(_) => b.delay(children.next().unwrap()), + CoreKind::Force(_) => b.force(children.next().unwrap(), core.ty), + _ => unreachable!(), + }; + Ok(Some(b.with_type(result, core.ty))) + }))); + match core.kind { + CoreKind::Lam { params, body } => tasks.push(Task::Visit( + body, + without(&env, params.iter().map(|p| p.name)), + )), CoreKind::Let { binder, value, body, - } => b.let_( - *binder, - self.term(value, env)?, - self.term(body, &without(env, [binder.name]))?, - ), - CoreKind::LetRec { binders, body } => self.group(binders, body, env)?, + } => { + tasks.push(Task::Visit(body, without(&env, [binder.name]))); + tasks.push(Task::Visit(value, env)); + } CoreKind::Case { - kind, scrutinee, branches, default, + .. } => { - let scrutinee = self.term(scrutinee, env)?; - let branches = branches - .iter() - .map(|branch| { - Ok(Branch { - body: self.term( - branch.body, - &without(env, branch.binders.iter().map(|p| p.name)), - )?, - ..*branch - }) - }) - .collect::, Error>>()?; - let default = default.map(|d| self.term(d, env)).transpose()?; - b.case(*kind, scrutinee, &branches, default, core.ty) - } - CoreKind::Constr { tag, fields } => { - let fields = fields - .iter() - .map(|f| self.term(f, env)) - .collect::, _>>()?; - b.constr(*tag, &fields, core.ty) - } - CoreKind::Field { - record, - index, - arity, - } => b.alloc( - core.ty, - CoreKind::Field { - record: self.term(record, env)?, - index: *index, - arity: *arity, - }, - ), - CoreKind::Builtin { func, args } => { - let args = args - .iter() - .map(|a| self.term(a, env)) - .collect::, _>>()?; - b.alloc( - core.ty, - CoreKind::Builtin { - func: *func, - args: b.arena.alloc_slice_copy(&args), - }, - ) + if let Some(body) = default { + tasks.push(Task::Visit(body, env.clone())); + } + tasks.extend(branches.iter().rev().map(|branch| { + Task::Visit( + branch.body, + without(&env, branch.binders.iter().map(|p| p.name)), + ) + })); + tasks.push(Task::Visit(scrutinee, env)); } - CoreKind::Trace { message, body } => { - b.trace(self.term(message, env)?, self.term(body, env)?) + _ => { + let mut children = Vec::new(); + core.push_children_reversed(&mut children); + tasks.extend( + children + .into_iter() + .map(|child| Task::Visit(child, env.clone())), + ); } - CoreKind::Delay(body) => b.delay(self.term(body, env)?), - CoreKind::Force(body) => b.force(self.term(body, env)?, core.ty), - }; - Ok(b.with_type(result, core.ty)) + } + Ok(()) } + fn group( &mut self, + ty: Ty<'a>, binders: &'a [RecBinder<'a>], body: &'a Core<'a>, - env: &Environment<'a>, - ) -> Result<&'a Core<'a>, Error> { + env: Environment<'a>, + tasks: &mut Vec>, + ) -> Result<(), Error> { let b = self.build; + // Retain the original type view even for empty groups. + tasks.push(Task::Finish(Box::new(move |this, _, results| { + Ok(Some(this.build.with_type(results.pop().unwrap(), ty))) + }))); if binders.is_empty() { - return self.term(body, env); + tasks.push(Task::Visit(body, env)); + return Ok(()); } - // A fully static worker is an explicit delayed recursive value. Knot - // creation returns the delay; each original call still forces its body. if let [single] = binders && single.params.is_empty() && matches!(single.body.kind, CoreKind::Delay(_)) @@ -260,24 +355,50 @@ impl<'a> Rewriter<'_, 'a> { direct: None, }, ); - let inner_body = self.term(single.body, &inner_env)?; - let inner = b.with_type(b.lam(&[self_arg], inner_body), self_ty); - let knot = b.app(b.lam(&[self_arg], raw), &[inner], single.binder.ty); - let continuation = self.term(body, &without(env, [single.binder.name]))?; - return Ok(b.let_(single.binder, knot, continuation)); + tasks.push(Task::Finish(Box::new(move |this, tasks, results| { + let b = this.build; + let inner_body = results.pop().unwrap(); + let inner = b.with_type(b.lam(&[self_arg], inner_body), self_ty); + let knot = b.app(b.lam(&[self_arg], raw), &[inner], single.binder.ty); + tasks.push(Task::Finish(Box::new(move |this, _, results| { + Ok(Some(this.build.let_( + single.binder, + knot, + results.pop().unwrap(), + ))) + }))); + tasks.push(Task::Visit(body, without(&env, [single.binder.name]))); + Ok(None) + }))); + tasks.push(Task::Visit(single.body, inner_env)); + return Ok(()); } if binders.iter().any(|r| r.params.is_empty()) { return Err(Error::RecursiveValue); } - let names = binders - .iter() - .map(|r| r.binder.name) - .collect::>(); + let names: HashSet<_> = binders.iter().map(|r| r.binder.name).collect(); if names.len() != binders.len() { return Err(Error::DuplicateBinder); } - let outer = without(env, names.iter().copied()); - let continuation = self.term(body, &outer)?; + let outer = without(&env, names); + let outer_body = outer.clone(); + tasks.push(Task::Finish(Box::new(move |this, tasks, results| { + let continuation = results.pop().unwrap(); + this.group_after_continuation(binders, outer, continuation, tasks)?; + Ok(None) + }))); + tasks.push(Task::Visit(body, outer_body)); + Ok(()) + } + + fn group_after_continuation( + &mut self, + binders: &'a [RecBinder<'a>], + outer: Environment<'a>, + continuation: &'a Core<'a>, + tasks: &mut Vec>, + ) -> Result<(), Error> { + let b = self.build; if let [single] = binders { // Recheck metadata: a stale static annotation must never discard work. let proven = static_params(single.binder.name, single.params, single.body); @@ -330,41 +451,47 @@ impl<'a> Rewriter<'_, 'a> { direct: Some((self_call, statics.clone())), }, ); - let inner_body = self.term(single.body, &inner_env)?; - let mut inner_params = vec![self_arg]; - inner_params.extend_from_slice(&dynamic); - // If every parameter is static, delay the worker to keep knot creation lazy. - let inner = b.lam( - &inner_params, - if dynamic.is_empty() { - b.delay(inner_body) - } else { - inner_body - }, - ); - let inner = b.with_type(inner, self_ty); - let knot = b.app(b.lam(&[self_arg], raw_self_call), &[inner], worker_ty); - let definition = if statics.is_empty() { - knot - } else { - let applied = if dynamic.is_empty() { - b.force(knot, result_ty) + tasks.push(Task::Finish(Box::new(move |this, _, results| { + let b = this.build; + let inner_body = results.pop().unwrap(); + + let mut inner_params = vec![self_arg]; + inner_params.extend_from_slice(&dynamic); + // If every parameter is static, delay the worker to keep knot creation lazy. + let inner = b.lam( + &inner_params, + if dynamic.is_empty() { + b.delay(inner_body) + } else { + inner_body + }, + ); + let inner = b.with_type(inner, self_ty); + let knot = b.app(b.lam(&[self_arg], raw_self_call), &[inner], worker_ty); + let definition = if statics.is_empty() { + knot } else { - b.app( - knot, - &dynamic - .iter() - .map(|p| b.var(p.name, p.ty)) - .collect::>(), - result_ty, - ) + let applied = if dynamic.is_empty() { + b.force(knot, result_ty) + } else { + b.app( + knot, + &dynamic + .iter() + .map(|p| b.var(p.name, p.ty)) + .collect::>(), + result_ty, + ) + }; + b.lam(single.params, applied) }; - b.lam(single.params, applied) - }; - // Recursive calls into a fully static worker must force its delayed body. - // Such calls cannot terminate by changing an argument, but can occur in - // dead branches; represent them correctly without evaluating them early. - return Ok(b.let_(single.binder, definition, continuation)); + // Recursive calls into a fully static worker must force its delayed body. + // Such calls cannot terminate by changing an argument, but can occur in + // dead branches; represent them correctly without evaluating them early. + Ok(Some(b.let_(single.binder, definition, continuation))) + }))); + tasks.push(Task::Visit(single.body, inner_env)); + return Ok(()); } if binders.len() > usize::from(u16::MAX) + 1 { return Err(Error::TooManyFunctions); @@ -382,53 +509,75 @@ impl<'a> Rewriter<'_, 'a> { let arms = b.arena.alloc_slice_copy(&arms); let dispatcher_ty = Ty::Runtime(b.arena.alloc(RuntimeTy::Dispatcher(arms))); let request_ty = Ty::Runtime(b.arena.alloc(RuntimeTy::Request(arms))); - let results_ty = Ty::Runtime(b.arena.alloc(RuntimeTy::Results(arms))); let dispatcher = self.fresh("dispatch", dispatcher_ty); let request = self.fresh("request", request_ty); - let mut branches = Vec::new(); - for (index, rb) in binders.iter().enumerate() { - let self_arg = self.fresh("self", dispatcher_ty); - let mut recursive_env = outer.clone(); - for (target, callee) in binders.iter().enumerate() { - let alias = self.packet_alias(self_arg, target as u16, callee.params, arms); + self.mutual( + Mutual { + binders, + outer, + continuation, + arms, + dispatcher, + request, + branches: Vec::new(), + }, + tasks, + ) + } + + fn mutual(&mut self, mut state: Mutual<'a>, tasks: &mut Vec>) -> Result<(), Error> { + let b = self.build; + let index = state.branches.len(); + if let Some(rb) = state.binders.get(index) { + let self_arg = self.fresh("self", state.dispatcher.ty); + let mut recursive_env = state.outer.clone(); + for (target, callee) in state.binders.iter().enumerate() { + let alias = self.packet_alias(self_arg, target as u16, callee.params, state.arms); recursive_env.insert( callee.binder.name, Replacement { value: alias, - packet: Some((self_arg, target as u16, arms)), + packet: Some((self_arg, target as u16, state.arms)), direct: None, }, ); } - let body = self.term( - rb.body, - &without(&recursive_env, rb.params.iter().map(|p| p.name)), - )?; - let mut params = vec![self_arg]; - params.extend_from_slice(rb.params); - branches.push(Branch { - test: Test::Tag(index as u16), - binders: b.arena.alloc_slice_copy(¶ms), - body, - }); - } - let dispatch = b.lam( - &[request], - b.case( - CaseKind::Tag, - b.var(request.name, request.ty), - &branches, - None, - results_ty, - ), - ); - let dispatch = b.with_type(dispatch, dispatcher_ty); - let mut result = continuation; - for (index, rb) in binders.iter().enumerate().rev() { - let alias = self.packet_alias(dispatcher, index as u16, rb.params, arms); - result = b.let_(rb.binder, alias, result); + let env = without(&recursive_env, rb.params.iter().map(|p| p.name)); + tasks.push(Task::Finish(Box::new(move |this, tasks, results| { + let mut params = vec![self_arg]; + params.extend_from_slice(rb.params); + state.branches.push(Branch { + test: Test::Tag(index as u16), + binders: this.build.arena.alloc_slice_copy(¶ms), + body: results.pop().unwrap(), + }); + this.mutual(state, tasks)?; + Ok(None) + }))); + tasks.push(Task::Visit(rb.body, env)); + } else { + let results_ty = Ty::Runtime(b.arena.alloc(RuntimeTy::Results(state.arms))); + let dispatch = b.lam( + &[state.request], + b.case( + CaseKind::Tag, + b.var(state.request.name, state.request.ty), + &state.branches, + None, + results_ty, + ), + ); + let dispatch = b.with_type(dispatch, state.dispatcher.ty); + let mut result = state.continuation; + for (index, rb) in state.binders.iter().enumerate().rev() { + let alias = + self.packet_alias(state.dispatcher, index as u16, rb.params, state.arms); + result = b.let_(rb.binder, alias, result); + } + let result = b.let_(state.dispatcher, dispatch, result); + tasks.push(Task::Finish(Box::new(move |_, _, _| Ok(Some(result))))); } - Ok(b.let_(dispatcher, dispatch, result)) + Ok(()) } fn packet_alias( @@ -477,69 +626,59 @@ fn visit<'a>( scope: &HashSet>, f: &mut impl FnMut(&Core<'a>, &HashSet>), ) { - f(core, scope); - let extended = |names: Vec>| { - let mut s = scope.clone(); - s.extend(names); - s - }; - match &core.kind { - CoreKind::Lam { params, body } => { - visit(body, &extended(params.iter().map(|p| p.name).collect()), f) - } - CoreKind::App { func, args } => { - visit(func, scope, f); - for arg in *args { - visit(arg, scope, f); + let mut pending = vec![(core, scope.clone())]; + let mut children = Vec::new(); + while let Some((core, scope)) = pending.pop() { + f(core, &scope); + let extended = |names: Vec>| { + let mut inner = scope.clone(); + inner.extend(names); + inner + }; + match core.kind { + CoreKind::Lam { params, body } => { + pending.push((body, extended(params.iter().map(|p| p.name).collect()))) } - } - CoreKind::Let { - binder, - value, - body, - } => { - visit(value, scope, f); - visit(body, &extended(vec![binder.name]), f); - } - CoreKind::LetRec { binders, body } => { - let group = extended(binders.iter().map(|b| b.binder.name).collect()); - for rb in *binders { - let mut inner = group.clone(); - inner.extend(rb.params.iter().map(|p| p.name)); - visit(rb.body, &inner, f); + CoreKind::Let { + binder, + value, + body, + } => { + pending.push((body, extended(vec![binder.name]))); + pending.push((value, scope)); } - visit(body, &group, f); - } - CoreKind::Case { - scrutinee, - branches, - default, - .. - } => { - visit(scrutinee, scope, f); - for b in *branches { - visit( - b.body, - &extended(b.binders.iter().map(|p| p.name).collect()), - f, - ); + CoreKind::LetRec { binders, body } => { + let group = extended(binders.iter().map(|r| r.binder.name).collect()); + pending.push((body, group.clone())); + for rb in binders.iter().rev() { + let mut inner = group.clone(); + inner.extend(rb.params.iter().map(|p| p.name)); + pending.push((rb.body, inner)); + } } - if let Some(d) = default { - visit(d, scope, f); + CoreKind::Case { + scrutinee, + branches, + default, + .. + } => { + if let Some(body) = default { + pending.push((body, scope.clone())); + } + pending.extend(branches.iter().rev().map(|branch| { + ( + branch.body, + extended(branch.binders.iter().map(|p| p.name).collect()), + ) + })); + pending.push((scrutinee, scope)); } - } - CoreKind::Constr { fields: args, .. } | CoreKind::Builtin { args, .. } => { - for arg in *args { - visit(arg, scope, f); + _ => { + children.clear(); + core.push_children_reversed(&mut children); + pending.extend(children.iter().map(|child| (*child, scope.clone()))); } } - CoreKind::Field { record, .. } => visit(record, scope, f), - CoreKind::Trace { message, body } => { - visit(message, scope, f); - visit(body, scope, f); - } - CoreKind::Delay(body) | CoreKind::Force(body) => visit(body, scope, f), - CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error => {} } } diff --git a/crates/nash-codegen/src/tests.rs b/crates/nash-codegen/src/tests.rs index 69db3ba9..beee2eba 100644 --- a/crates/nash-codegen/src/tests.rs +++ b/crates/nash-codegen/src/tests.rs @@ -64,6 +64,31 @@ pub fn compile_tests_matching<'a>( path: &Path, version: nash_config::PlutusVersion, trace: TraceConfig, + include: impl FnMut(&nash_ast::Test<'a>) -> bool, +) -> Result, Error<'a>> { + compile_tests_matching_optimized( + arena, + build, + module, + source, + path, + version, + trace, + nash_config::OptimizationLevel::O0, + include, + ) +} + +#[allow(clippy::too_many_arguments)] +pub fn compile_tests_matching_optimized<'a>( + arena: &'a Arena, + build: &Build<'a, '_>, + module: ModuleName<'a>, + source: &str, + path: &Path, + version: nash_config::PlutusVersion, + trace: TraceConfig, + optimize: nash_config::OptimizationLevel, mut include: impl FnMut(&nash_ast::Test<'a>) -> bool, ) -> Result, Error<'a>> { let input = build @@ -81,12 +106,12 @@ pub fn compile_tests_matching<'a>( let programs = if test.binders.is_empty() { let root = engine.expr(test.body, &ctx)?; Programs::Unit { - run: encode(&mut engine, root, version)?, + run: encode(&mut engine, root, version, optimize)?, } } else { let prepare = engine.property(test, &ctx)?; Programs::Prop { - prepare: encode(&mut engine, prepare, version)?, + prepare: encode(&mut engine, prepare, version, optimize)?, } }; result.push(TestProgram { @@ -114,6 +139,7 @@ fn encode<'a>( engine: &mut Engine<'a, '_, '_>, root: &'a Core<'a>, version: nash_config::PlutusVersion, + optimize: nash_config::OptimizationLevel, ) -> Result, Error<'a>> { let core = engine.finish_root(root)?; let version = match version { @@ -121,7 +147,8 @@ fn encode<'a>( nash_config::PlutusVersion::V2 => nash_plutus::machine::PlutusVersion::V2, nash_config::PlutusVersion::V3 => nash_plutus::machine::PlutusVersion::V3, }; - let program = crate::program::assemble_core_for_version(engine.ir.arena, core, version)?; + let program = + crate::program::assemble_core_with_options(engine.ir.arena, core, version, optimize)?; flat::encode(program.program).map_err(|e| Error::Encoding(e.to_string())) } diff --git a/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V1_Silent.snap b/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V1_Silent.snap index adb8c652..97b10313 100644 --- a/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V1_Silent.snap +++ b/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V1_Silent.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/tests/integration.rs -assertion_line: 196 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Prop exposing (reject)\ntests\n test \"plain\" = do\n assert True\n prop \"invalid\" =\n let x via reject in\n do\n assert (Builtin.equalsInteger x x)\n" --- --- plain @@ -315,275 +314,9 @@ show#46) generated#44) (con (list string) [])) (con string "-")]) (con string "\0assert\0\48")]) --- optimized Core -let message#91 : string = "-" in -let assertAt#101 : string -> (unit -> unit) -> unit = \marker#99 : string (rest#100 : unit -> unit) -> let anf#179 : unit -> unit = trace marker#99 rest#100 in -anf#179 () in -let assertCapture#105 : string -> string -> (unit -> unit) -> unit = \prefix#102 : string value#103 : string (rest#104 : unit -> unit) -> let anf#181 : string = appendString prefix#102 value#103 in -assertAt#101 anf#181 rest#104 in -\state#109 : nash/base:Prop.prng -> let match#110 : nash/base:Option.option ('erased, nash/base:Prop.prng) = constr 1 in -case@Tag match#110 of - 0 field#111 -> case@Tag field#111 of - 0 field#112 field#113 -> let anf#182 : (nash/base:Prop.prng, unit -> unit, unit -> list string) = constr 0 field#113 (\arg#117 : unit -> let apply#128 : int -> bool = equalsInteger field#112 in - let anf#183 : bool = apply#128 field#112 in - case@Bool anf#183 of - True -> () - False -> assertAt#101 "\0assert\00" (\unit#130 : unit -> let applyForward#134 : 'erased -> ('erased -> 'erased) -> 'erased = \x#132 : 'erased (f#133 : 'erased -> 'erased) -> f#133 x#132 in - let anf#184 : string -> (unit -> unit) -> unit = assertCapture#105 "\0assert\00\01\0" in - letrec - decimal#139 : int -> bytes [static []] = \n#140 : int -> let anf#186 : bool = lessThanInteger n#140 10 in - case@Bool anf#186 of - True -> let anf#188 : int = addInteger 48 n#140 in - consByteString anf#188 (con bytestring #) - False -> let anf#191 : int = quotientInteger n#140 10 in - let anf#192 : bytes = decimal#139 anf#191 in - let anf#195 : int = remainderInteger n#140 10 in - let anf#196 : int = addInteger 48 anf#195 in - let anf#198 : bytes = consByteString anf#196 (con bytestring #) in - appendByteString anf#192 anf#198 - in - let anf#200 : bool = lessThanInteger field#112 0 in - let anf#211 : string = case@Bool anf#200 of - True -> let anf#201 : (int -> int) -> int = applyForward#134 field#112 in - let anf#203 : int -> int = subtractInteger 0 in - let anf#204 : int = anf#201 anf#203 in - let anf#205 : bytes = applyForward#134 anf#204 decimal#139 in - let anf#206 : string = applyForward#134 anf#205 decodeUtf8 in - let anf#207 : (string -> string) -> string = applyForward#134 anf#206 in - let anf#209 : string -> string = appendString message#91 in - anf#207 anf#209 - False -> let anf#210 : bytes = applyForward#134 field#112 decimal#139 in - applyForward#134 anf#210 decodeUtf8 in - anf#184 anf#211 (\unit#145 : unit -> let applyForward#149 : 'erased -> ('erased -> 'erased) -> 'erased = \x#147 : 'erased (f#148 : 'erased -> 'erased) -> f#148 x#147 in - let anf#212 : string -> (unit -> unit) -> unit = assertCapture#105 "\0assert\00\02\0" in - letrec - decimal#154 : int -> bytes [static []] = \n#155 : int -> let anf#214 : bool = lessThanInteger n#155 10 in - case@Bool anf#214 of - True -> let anf#216 : int = addInteger 48 n#155 in - consByteString anf#216 (con bytestring #) - False -> let anf#219 : int = quotientInteger n#155 10 in - let anf#220 : bytes = decimal#154 anf#219 in - let anf#223 : int = remainderInteger n#155 10 in - let anf#224 : int = addInteger 48 anf#223 in - let anf#226 : bytes = consByteString anf#224 (con bytestring #) in - appendByteString anf#220 anf#226 - in - let anf#228 : bool = lessThanInteger field#112 0 in - let anf#239 : string = case@Bool anf#228 of - True -> let anf#229 : (int -> int) -> int = applyForward#149 field#112 in - let anf#231 : int -> int = subtractInteger 0 in - let anf#232 : int = anf#229 anf#231 in - let anf#233 : bytes = applyForward#149 anf#232 decimal#154 in - let anf#234 : string = applyForward#149 anf#233 decodeUtf8 in - let anf#235 : (string -> string) -> string = applyForward#149 anf#234 in - let anf#237 : string -> string = appendString message#91 in - anf#235 anf#237 - False -> let anf#238 : bytes = applyForward#149 field#112 decimal#154 in - applyForward#149 anf#238 decodeUtf8 in - anf#212 anf#239 (\unit#160 : unit -> error)))) (\arg#119 : unit -> let applyForward#168 : 'erased -> ('erased -> 'erased) -> 'erased = \x#166 : 'erased (f#167 : 'erased -> 'erased) -> f#167 x#166 in - letrec - decimal#173 : int -> bytes [static []] = \n#174 : int -> let anf#241 : bool = lessThanInteger n#174 10 in - case@Bool anf#241 of - True -> let anf#243 : int = addInteger 48 n#174 in - consByteString anf#243 (con bytestring #) - False -> let anf#246 : int = quotientInteger n#174 10 in - let anf#247 : bytes = decimal#173 anf#246 in - let anf#250 : int = remainderInteger n#174 10 in - let anf#251 : int = addInteger 48 anf#250 in - let anf#253 : bytes = consByteString anf#251 (con bytestring #) in - appendByteString anf#247 anf#253 - in - let anf#255 : bool = lessThanInteger field#112 0 in - let anf#266 : string = case@Bool anf#255 of - True -> let anf#256 : (int -> int) -> int = applyForward#168 field#112 in - let anf#258 : int -> int = subtractInteger 0 in - let anf#259 : int = anf#256 anf#258 in - let anf#260 : bytes = applyForward#168 anf#259 decimal#173 in - let anf#261 : string = applyForward#168 anf#260 decodeUtf8 in - let anf#262 : (string -> string) -> string = applyForward#168 anf#261 in - let anf#264 : string -> string = appendString message#91 in - anf#262 anf#264 - False -> let anf#265 : bytes = applyForward#168 field#112 decimal#173 in - applyForward#168 anf#265 decodeUtf8 in - mkCons anf#266 (con (list string) [])) in - constr 0 anf#182 - 1 -> constr 1 +\state#109 : nash/base:Prop.prng -> constr 1 --- optimized UPLC -(program 1.1.0 - [(lam builtin_117 - [(lam builtin_118 - [(lam partial_119 - [(lam partial_120 - [(lam message_7 - [(lam assertAt_11 - [(lam assertCapture_16 - (lam state_17 - [(lam match_18 - (case - match_18 - (lam field_19 - (case - field_19 - (lam field_20 - (lam field_21 - [(lam anf_116 (constr 0 anf_116)) - (constr 0 - field_21 - (lam arg_22 - [(lam apply_23 - [(lam anf_24 - (case - anf_24 - [[assertAt_11 (con string "\0assert\0\48")] - (lam unit_25 - [(lam applyForward_28 - [(lam anf_29 - [(lam decimal_40 - [(lam anf_41 - [(lam anf_50 - [[anf_29 anf_50] - (lam unit_51 - [(lam applyForward_54 - [(lam anf_55 - [(lam decimal_66 - [(lam anf_67 - [(lam anf_76 [[anf_55 anf_76] (lam unit_77 (error))]) - (case - anf_67 - [(lam anf_75 [[applyForward_54 anf_75] (builtin decodeUtf8)]) - [[applyForward_54 field_20] decimal_66]] - [(lam anf_68 - [(lam anf_69 - [(lam anf_70 - [(lam anf_71 - [(lam anf_72 - [(lam anf_73 [(lam anf_74 [anf_73 anf_74]) [(builtin appendString) message_7]]) - [applyForward_54 anf_72]]) - [[applyForward_54 anf_71] (builtin decodeUtf8)]]) - [[applyForward_54 anf_70] decimal_66]]) - [anf_68 anf_69]]) - partial_119]) - [applyForward_54 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_56 [self_56 self_56]) - (lam self_57 - (lam n_58 - [(lam anf_59 - (case - anf_59 - [(lam anf_61 - [(lam anf_62 - [(lam anf_63 - [(lam anf_64 - [(lam anf_65 [[(builtin appendByteString) anf_62] anf_65]) - [[(builtin consByteString) anf_64] (con bytestring #)]]) - [partial_120 anf_63]]) - [[(builtin remainderInteger) n_58] (con integer 10)]]) - [[self_57 self_57] anf_61]]) - [[(builtin quotientInteger) n_58] (con integer 10)]] - [(lam anf_60 [[(builtin consByteString) anf_60] (con bytestring #)]) - [partial_120 n_58]])) - [[(builtin lessThanInteger) n_58] (con integer 10)]]))]]) - [assertCapture_16 (con string "\0assert\0\48\0\50\0")]]) - (lam x_52 (lam f_53 [f_53 x_52]))])]) - (case - anf_41 - [(lam anf_49 [[applyForward_28 anf_49] (builtin decodeUtf8)]) - [[applyForward_28 field_20] decimal_40]] - [(lam anf_42 - [(lam anf_43 - [(lam anf_44 - [(lam anf_45 - [(lam anf_46 - [(lam anf_47 [(lam anf_48 [anf_47 anf_48]) [(builtin appendString) message_7]]) - [applyForward_28 anf_46]]) - [[applyForward_28 anf_45] (builtin decodeUtf8)]]) - [[applyForward_28 anf_44] decimal_40]]) - [anf_42 anf_43]]) - partial_119]) - [applyForward_28 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_30 [self_30 self_30]) - (lam self_31 - (lam n_32 - [(lam anf_33 - (case - anf_33 - [(lam anf_35 - [(lam anf_36 - [(lam anf_37 - [(lam anf_38 - [(lam anf_39 [[(builtin appendByteString) anf_36] anf_39]) - [[(builtin consByteString) anf_38] (con bytestring #)]]) - [partial_120 anf_37]]) - [[(builtin remainderInteger) n_32] (con integer 10)]]) - [[self_31 self_31] anf_35]]) - [[(builtin quotientInteger) n_32] (con integer 10)]] - [(lam anf_34 [[(builtin consByteString) anf_34] (con bytestring #)]) - [partial_120 n_32]])) - [[(builtin lessThanInteger) n_32] (con integer 10)]]))]]) - [assertCapture_16 (con string "\0assert\0\48\0\49\0")]]) - (lam x_26 (lam f_27 [f_27 x_26]))])] - (con unit ()))) - [apply_23 field_20]]) - [(builtin equalsInteger) field_20]]) - (lam arg_78 - [(lam applyForward_81 - [(lam decimal_93 - [(lam anf_94 - [(lam anf_115 [[builtin_117 anf_115] (con (list string) [])]) - (case - anf_94 - [(lam anf_114 [[applyForward_81 anf_114] (builtin decodeUtf8)]) - [[applyForward_81 field_20] decimal_93]] - [(lam anf_95 - [(lam anf_96 - [(lam anf_97 - [(lam anf_98 - [(lam anf_106 - [(lam anf_107 - [(lam anf_108 [anf_107 anf_108]) [(builtin appendString) message_7]]) - [applyForward_81 anf_106]]) - [[applyForward_81 anf_98] (builtin decodeUtf8)]]) - [[applyForward_81 anf_97] decimal_93]]) - [anf_95 anf_96]]) - partial_119]) - [applyForward_81 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_82 [self_82 self_82]) - (lam self_83 - (lam n_84 - [(lam anf_85 - (case - anf_85 - [(lam anf_87 - [(lam anf_88 - [(lam anf_89 - [(lam anf_90 - [(lam anf_92 [[(builtin appendByteString) anf_88] anf_92]) - [[(builtin consByteString) anf_90] (con bytestring #)]]) - [partial_120 anf_89]]) - [[(builtin remainderInteger) n_84] (con integer 10)]]) - [[self_83 self_83] anf_87]]) - [[(builtin quotientInteger) n_84] (con integer 10)]] - [(lam anf_86 [[(builtin consByteString) anf_86] (con bytestring #)]) - [partial_120 n_84]])) - [[(builtin lessThanInteger) n_84] (con integer 10)]]))]]) - (lam x_79 (lam f_80 [f_80 x_79]))]))])))) - (constr 1))) - (constr 1)])) - (lam prefix_12 - (lam value_13 - (lam rest_14 - [(lam anf_15 [[assertAt_11 anf_15] rest_14]) - [[(builtin appendString) prefix_12] value_13]])))]) - (lam marker_8 - (lam rest_9 - [(lam anf_10 [anf_10 (con unit ())]) [[builtin_118 marker_8] rest_9]]))]) - (con string "-")]) - [(builtin addInteger) (con integer 48)]]) - [(builtin subtractInteger) (con integer 0)]]) - (force (builtin trace))]) - (force (builtin mkCons))]) +(program 1.1.0 (lam state_1 (constr 1))) --- encoded target UPLC --- prepare (program 1.1.0 diff --git a/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V2_Silent.snap b/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V2_Silent.snap index adb8c652..97b10313 100644 --- a/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V2_Silent.snap +++ b/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_2_V2_Silent.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/tests/integration.rs -assertion_line: 196 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Prop exposing (reject)\ntests\n test \"plain\" = do\n assert True\n prop \"invalid\" =\n let x via reject in\n do\n assert (Builtin.equalsInteger x x)\n" --- --- plain @@ -315,275 +314,9 @@ show#46) generated#44) (con (list string) [])) (con string "-")]) (con string "\0assert\0\48")]) --- optimized Core -let message#91 : string = "-" in -let assertAt#101 : string -> (unit -> unit) -> unit = \marker#99 : string (rest#100 : unit -> unit) -> let anf#179 : unit -> unit = trace marker#99 rest#100 in -anf#179 () in -let assertCapture#105 : string -> string -> (unit -> unit) -> unit = \prefix#102 : string value#103 : string (rest#104 : unit -> unit) -> let anf#181 : string = appendString prefix#102 value#103 in -assertAt#101 anf#181 rest#104 in -\state#109 : nash/base:Prop.prng -> let match#110 : nash/base:Option.option ('erased, nash/base:Prop.prng) = constr 1 in -case@Tag match#110 of - 0 field#111 -> case@Tag field#111 of - 0 field#112 field#113 -> let anf#182 : (nash/base:Prop.prng, unit -> unit, unit -> list string) = constr 0 field#113 (\arg#117 : unit -> let apply#128 : int -> bool = equalsInteger field#112 in - let anf#183 : bool = apply#128 field#112 in - case@Bool anf#183 of - True -> () - False -> assertAt#101 "\0assert\00" (\unit#130 : unit -> let applyForward#134 : 'erased -> ('erased -> 'erased) -> 'erased = \x#132 : 'erased (f#133 : 'erased -> 'erased) -> f#133 x#132 in - let anf#184 : string -> (unit -> unit) -> unit = assertCapture#105 "\0assert\00\01\0" in - letrec - decimal#139 : int -> bytes [static []] = \n#140 : int -> let anf#186 : bool = lessThanInteger n#140 10 in - case@Bool anf#186 of - True -> let anf#188 : int = addInteger 48 n#140 in - consByteString anf#188 (con bytestring #) - False -> let anf#191 : int = quotientInteger n#140 10 in - let anf#192 : bytes = decimal#139 anf#191 in - let anf#195 : int = remainderInteger n#140 10 in - let anf#196 : int = addInteger 48 anf#195 in - let anf#198 : bytes = consByteString anf#196 (con bytestring #) in - appendByteString anf#192 anf#198 - in - let anf#200 : bool = lessThanInteger field#112 0 in - let anf#211 : string = case@Bool anf#200 of - True -> let anf#201 : (int -> int) -> int = applyForward#134 field#112 in - let anf#203 : int -> int = subtractInteger 0 in - let anf#204 : int = anf#201 anf#203 in - let anf#205 : bytes = applyForward#134 anf#204 decimal#139 in - let anf#206 : string = applyForward#134 anf#205 decodeUtf8 in - let anf#207 : (string -> string) -> string = applyForward#134 anf#206 in - let anf#209 : string -> string = appendString message#91 in - anf#207 anf#209 - False -> let anf#210 : bytes = applyForward#134 field#112 decimal#139 in - applyForward#134 anf#210 decodeUtf8 in - anf#184 anf#211 (\unit#145 : unit -> let applyForward#149 : 'erased -> ('erased -> 'erased) -> 'erased = \x#147 : 'erased (f#148 : 'erased -> 'erased) -> f#148 x#147 in - let anf#212 : string -> (unit -> unit) -> unit = assertCapture#105 "\0assert\00\02\0" in - letrec - decimal#154 : int -> bytes [static []] = \n#155 : int -> let anf#214 : bool = lessThanInteger n#155 10 in - case@Bool anf#214 of - True -> let anf#216 : int = addInteger 48 n#155 in - consByteString anf#216 (con bytestring #) - False -> let anf#219 : int = quotientInteger n#155 10 in - let anf#220 : bytes = decimal#154 anf#219 in - let anf#223 : int = remainderInteger n#155 10 in - let anf#224 : int = addInteger 48 anf#223 in - let anf#226 : bytes = consByteString anf#224 (con bytestring #) in - appendByteString anf#220 anf#226 - in - let anf#228 : bool = lessThanInteger field#112 0 in - let anf#239 : string = case@Bool anf#228 of - True -> let anf#229 : (int -> int) -> int = applyForward#149 field#112 in - let anf#231 : int -> int = subtractInteger 0 in - let anf#232 : int = anf#229 anf#231 in - let anf#233 : bytes = applyForward#149 anf#232 decimal#154 in - let anf#234 : string = applyForward#149 anf#233 decodeUtf8 in - let anf#235 : (string -> string) -> string = applyForward#149 anf#234 in - let anf#237 : string -> string = appendString message#91 in - anf#235 anf#237 - False -> let anf#238 : bytes = applyForward#149 field#112 decimal#154 in - applyForward#149 anf#238 decodeUtf8 in - anf#212 anf#239 (\unit#160 : unit -> error)))) (\arg#119 : unit -> let applyForward#168 : 'erased -> ('erased -> 'erased) -> 'erased = \x#166 : 'erased (f#167 : 'erased -> 'erased) -> f#167 x#166 in - letrec - decimal#173 : int -> bytes [static []] = \n#174 : int -> let anf#241 : bool = lessThanInteger n#174 10 in - case@Bool anf#241 of - True -> let anf#243 : int = addInteger 48 n#174 in - consByteString anf#243 (con bytestring #) - False -> let anf#246 : int = quotientInteger n#174 10 in - let anf#247 : bytes = decimal#173 anf#246 in - let anf#250 : int = remainderInteger n#174 10 in - let anf#251 : int = addInteger 48 anf#250 in - let anf#253 : bytes = consByteString anf#251 (con bytestring #) in - appendByteString anf#247 anf#253 - in - let anf#255 : bool = lessThanInteger field#112 0 in - let anf#266 : string = case@Bool anf#255 of - True -> let anf#256 : (int -> int) -> int = applyForward#168 field#112 in - let anf#258 : int -> int = subtractInteger 0 in - let anf#259 : int = anf#256 anf#258 in - let anf#260 : bytes = applyForward#168 anf#259 decimal#173 in - let anf#261 : string = applyForward#168 anf#260 decodeUtf8 in - let anf#262 : (string -> string) -> string = applyForward#168 anf#261 in - let anf#264 : string -> string = appendString message#91 in - anf#262 anf#264 - False -> let anf#265 : bytes = applyForward#168 field#112 decimal#173 in - applyForward#168 anf#265 decodeUtf8 in - mkCons anf#266 (con (list string) [])) in - constr 0 anf#182 - 1 -> constr 1 +\state#109 : nash/base:Prop.prng -> constr 1 --- optimized UPLC -(program 1.1.0 - [(lam builtin_117 - [(lam builtin_118 - [(lam partial_119 - [(lam partial_120 - [(lam message_7 - [(lam assertAt_11 - [(lam assertCapture_16 - (lam state_17 - [(lam match_18 - (case - match_18 - (lam field_19 - (case - field_19 - (lam field_20 - (lam field_21 - [(lam anf_116 (constr 0 anf_116)) - (constr 0 - field_21 - (lam arg_22 - [(lam apply_23 - [(lam anf_24 - (case - anf_24 - [[assertAt_11 (con string "\0assert\0\48")] - (lam unit_25 - [(lam applyForward_28 - [(lam anf_29 - [(lam decimal_40 - [(lam anf_41 - [(lam anf_50 - [[anf_29 anf_50] - (lam unit_51 - [(lam applyForward_54 - [(lam anf_55 - [(lam decimal_66 - [(lam anf_67 - [(lam anf_76 [[anf_55 anf_76] (lam unit_77 (error))]) - (case - anf_67 - [(lam anf_75 [[applyForward_54 anf_75] (builtin decodeUtf8)]) - [[applyForward_54 field_20] decimal_66]] - [(lam anf_68 - [(lam anf_69 - [(lam anf_70 - [(lam anf_71 - [(lam anf_72 - [(lam anf_73 [(lam anf_74 [anf_73 anf_74]) [(builtin appendString) message_7]]) - [applyForward_54 anf_72]]) - [[applyForward_54 anf_71] (builtin decodeUtf8)]]) - [[applyForward_54 anf_70] decimal_66]]) - [anf_68 anf_69]]) - partial_119]) - [applyForward_54 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_56 [self_56 self_56]) - (lam self_57 - (lam n_58 - [(lam anf_59 - (case - anf_59 - [(lam anf_61 - [(lam anf_62 - [(lam anf_63 - [(lam anf_64 - [(lam anf_65 [[(builtin appendByteString) anf_62] anf_65]) - [[(builtin consByteString) anf_64] (con bytestring #)]]) - [partial_120 anf_63]]) - [[(builtin remainderInteger) n_58] (con integer 10)]]) - [[self_57 self_57] anf_61]]) - [[(builtin quotientInteger) n_58] (con integer 10)]] - [(lam anf_60 [[(builtin consByteString) anf_60] (con bytestring #)]) - [partial_120 n_58]])) - [[(builtin lessThanInteger) n_58] (con integer 10)]]))]]) - [assertCapture_16 (con string "\0assert\0\48\0\50\0")]]) - (lam x_52 (lam f_53 [f_53 x_52]))])]) - (case - anf_41 - [(lam anf_49 [[applyForward_28 anf_49] (builtin decodeUtf8)]) - [[applyForward_28 field_20] decimal_40]] - [(lam anf_42 - [(lam anf_43 - [(lam anf_44 - [(lam anf_45 - [(lam anf_46 - [(lam anf_47 [(lam anf_48 [anf_47 anf_48]) [(builtin appendString) message_7]]) - [applyForward_28 anf_46]]) - [[applyForward_28 anf_45] (builtin decodeUtf8)]]) - [[applyForward_28 anf_44] decimal_40]]) - [anf_42 anf_43]]) - partial_119]) - [applyForward_28 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_30 [self_30 self_30]) - (lam self_31 - (lam n_32 - [(lam anf_33 - (case - anf_33 - [(lam anf_35 - [(lam anf_36 - [(lam anf_37 - [(lam anf_38 - [(lam anf_39 [[(builtin appendByteString) anf_36] anf_39]) - [[(builtin consByteString) anf_38] (con bytestring #)]]) - [partial_120 anf_37]]) - [[(builtin remainderInteger) n_32] (con integer 10)]]) - [[self_31 self_31] anf_35]]) - [[(builtin quotientInteger) n_32] (con integer 10)]] - [(lam anf_34 [[(builtin consByteString) anf_34] (con bytestring #)]) - [partial_120 n_32]])) - [[(builtin lessThanInteger) n_32] (con integer 10)]]))]]) - [assertCapture_16 (con string "\0assert\0\48\0\49\0")]]) - (lam x_26 (lam f_27 [f_27 x_26]))])] - (con unit ()))) - [apply_23 field_20]]) - [(builtin equalsInteger) field_20]]) - (lam arg_78 - [(lam applyForward_81 - [(lam decimal_93 - [(lam anf_94 - [(lam anf_115 [[builtin_117 anf_115] (con (list string) [])]) - (case - anf_94 - [(lam anf_114 [[applyForward_81 anf_114] (builtin decodeUtf8)]) - [[applyForward_81 field_20] decimal_93]] - [(lam anf_95 - [(lam anf_96 - [(lam anf_97 - [(lam anf_98 - [(lam anf_106 - [(lam anf_107 - [(lam anf_108 [anf_107 anf_108]) [(builtin appendString) message_7]]) - [applyForward_81 anf_106]]) - [[applyForward_81 anf_98] (builtin decodeUtf8)]]) - [[applyForward_81 anf_97] decimal_93]]) - [anf_95 anf_96]]) - partial_119]) - [applyForward_81 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_82 [self_82 self_82]) - (lam self_83 - (lam n_84 - [(lam anf_85 - (case - anf_85 - [(lam anf_87 - [(lam anf_88 - [(lam anf_89 - [(lam anf_90 - [(lam anf_92 [[(builtin appendByteString) anf_88] anf_92]) - [[(builtin consByteString) anf_90] (con bytestring #)]]) - [partial_120 anf_89]]) - [[(builtin remainderInteger) n_84] (con integer 10)]]) - [[self_83 self_83] anf_87]]) - [[(builtin quotientInteger) n_84] (con integer 10)]] - [(lam anf_86 [[(builtin consByteString) anf_86] (con bytestring #)]) - [partial_120 n_84]])) - [[(builtin lessThanInteger) n_84] (con integer 10)]]))]]) - (lam x_79 (lam f_80 [f_80 x_79]))]))])))) - (constr 1))) - (constr 1)])) - (lam prefix_12 - (lam value_13 - (lam rest_14 - [(lam anf_15 [[assertAt_11 anf_15] rest_14]) - [[(builtin appendString) prefix_12] value_13]])))]) - (lam marker_8 - (lam rest_9 - [(lam anf_10 [anf_10 (con unit ())]) [[builtin_118 marker_8] rest_9]]))]) - (con string "-")]) - [(builtin addInteger) (con integer 48)]]) - [(builtin subtractInteger) (con integer 0)]]) - (force (builtin trace))]) - (force (builtin mkCons))]) +(program 1.1.0 (lam state_1 (constr 1))) --- encoded target UPLC --- prepare (program 1.1.0 diff --git a/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_3_V3_Silent.snap b/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_3_V3_Silent.snap index adb8c652..97b10313 100644 --- a/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_3_V3_Silent.snap +++ b/crates/nash-codegen/src/tests/snapshots/nash_codegen__tests__integration__rejected_generator_skips_body_and_selected_target_is_enforced_3_V3_Silent.snap @@ -1,6 +1,5 @@ --- source: crates/nash-codegen/src/tests/integration.rs -assertion_line: 196 description: "module Main exposing (..)\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Prop exposing (reject)\ntests\n test \"plain\" = do\n assert True\n prop \"invalid\" =\n let x via reject in\n do\n assert (Builtin.equalsInteger x x)\n" --- --- plain @@ -315,275 +314,9 @@ show#46) generated#44) (con (list string) [])) (con string "-")]) (con string "\0assert\0\48")]) --- optimized Core -let message#91 : string = "-" in -let assertAt#101 : string -> (unit -> unit) -> unit = \marker#99 : string (rest#100 : unit -> unit) -> let anf#179 : unit -> unit = trace marker#99 rest#100 in -anf#179 () in -let assertCapture#105 : string -> string -> (unit -> unit) -> unit = \prefix#102 : string value#103 : string (rest#104 : unit -> unit) -> let anf#181 : string = appendString prefix#102 value#103 in -assertAt#101 anf#181 rest#104 in -\state#109 : nash/base:Prop.prng -> let match#110 : nash/base:Option.option ('erased, nash/base:Prop.prng) = constr 1 in -case@Tag match#110 of - 0 field#111 -> case@Tag field#111 of - 0 field#112 field#113 -> let anf#182 : (nash/base:Prop.prng, unit -> unit, unit -> list string) = constr 0 field#113 (\arg#117 : unit -> let apply#128 : int -> bool = equalsInteger field#112 in - let anf#183 : bool = apply#128 field#112 in - case@Bool anf#183 of - True -> () - False -> assertAt#101 "\0assert\00" (\unit#130 : unit -> let applyForward#134 : 'erased -> ('erased -> 'erased) -> 'erased = \x#132 : 'erased (f#133 : 'erased -> 'erased) -> f#133 x#132 in - let anf#184 : string -> (unit -> unit) -> unit = assertCapture#105 "\0assert\00\01\0" in - letrec - decimal#139 : int -> bytes [static []] = \n#140 : int -> let anf#186 : bool = lessThanInteger n#140 10 in - case@Bool anf#186 of - True -> let anf#188 : int = addInteger 48 n#140 in - consByteString anf#188 (con bytestring #) - False -> let anf#191 : int = quotientInteger n#140 10 in - let anf#192 : bytes = decimal#139 anf#191 in - let anf#195 : int = remainderInteger n#140 10 in - let anf#196 : int = addInteger 48 anf#195 in - let anf#198 : bytes = consByteString anf#196 (con bytestring #) in - appendByteString anf#192 anf#198 - in - let anf#200 : bool = lessThanInteger field#112 0 in - let anf#211 : string = case@Bool anf#200 of - True -> let anf#201 : (int -> int) -> int = applyForward#134 field#112 in - let anf#203 : int -> int = subtractInteger 0 in - let anf#204 : int = anf#201 anf#203 in - let anf#205 : bytes = applyForward#134 anf#204 decimal#139 in - let anf#206 : string = applyForward#134 anf#205 decodeUtf8 in - let anf#207 : (string -> string) -> string = applyForward#134 anf#206 in - let anf#209 : string -> string = appendString message#91 in - anf#207 anf#209 - False -> let anf#210 : bytes = applyForward#134 field#112 decimal#139 in - applyForward#134 anf#210 decodeUtf8 in - anf#184 anf#211 (\unit#145 : unit -> let applyForward#149 : 'erased -> ('erased -> 'erased) -> 'erased = \x#147 : 'erased (f#148 : 'erased -> 'erased) -> f#148 x#147 in - let anf#212 : string -> (unit -> unit) -> unit = assertCapture#105 "\0assert\00\02\0" in - letrec - decimal#154 : int -> bytes [static []] = \n#155 : int -> let anf#214 : bool = lessThanInteger n#155 10 in - case@Bool anf#214 of - True -> let anf#216 : int = addInteger 48 n#155 in - consByteString anf#216 (con bytestring #) - False -> let anf#219 : int = quotientInteger n#155 10 in - let anf#220 : bytes = decimal#154 anf#219 in - let anf#223 : int = remainderInteger n#155 10 in - let anf#224 : int = addInteger 48 anf#223 in - let anf#226 : bytes = consByteString anf#224 (con bytestring #) in - appendByteString anf#220 anf#226 - in - let anf#228 : bool = lessThanInteger field#112 0 in - let anf#239 : string = case@Bool anf#228 of - True -> let anf#229 : (int -> int) -> int = applyForward#149 field#112 in - let anf#231 : int -> int = subtractInteger 0 in - let anf#232 : int = anf#229 anf#231 in - let anf#233 : bytes = applyForward#149 anf#232 decimal#154 in - let anf#234 : string = applyForward#149 anf#233 decodeUtf8 in - let anf#235 : (string -> string) -> string = applyForward#149 anf#234 in - let anf#237 : string -> string = appendString message#91 in - anf#235 anf#237 - False -> let anf#238 : bytes = applyForward#149 field#112 decimal#154 in - applyForward#149 anf#238 decodeUtf8 in - anf#212 anf#239 (\unit#160 : unit -> error)))) (\arg#119 : unit -> let applyForward#168 : 'erased -> ('erased -> 'erased) -> 'erased = \x#166 : 'erased (f#167 : 'erased -> 'erased) -> f#167 x#166 in - letrec - decimal#173 : int -> bytes [static []] = \n#174 : int -> let anf#241 : bool = lessThanInteger n#174 10 in - case@Bool anf#241 of - True -> let anf#243 : int = addInteger 48 n#174 in - consByteString anf#243 (con bytestring #) - False -> let anf#246 : int = quotientInteger n#174 10 in - let anf#247 : bytes = decimal#173 anf#246 in - let anf#250 : int = remainderInteger n#174 10 in - let anf#251 : int = addInteger 48 anf#250 in - let anf#253 : bytes = consByteString anf#251 (con bytestring #) in - appendByteString anf#247 anf#253 - in - let anf#255 : bool = lessThanInteger field#112 0 in - let anf#266 : string = case@Bool anf#255 of - True -> let anf#256 : (int -> int) -> int = applyForward#168 field#112 in - let anf#258 : int -> int = subtractInteger 0 in - let anf#259 : int = anf#256 anf#258 in - let anf#260 : bytes = applyForward#168 anf#259 decimal#173 in - let anf#261 : string = applyForward#168 anf#260 decodeUtf8 in - let anf#262 : (string -> string) -> string = applyForward#168 anf#261 in - let anf#264 : string -> string = appendString message#91 in - anf#262 anf#264 - False -> let anf#265 : bytes = applyForward#168 field#112 decimal#173 in - applyForward#168 anf#265 decodeUtf8 in - mkCons anf#266 (con (list string) [])) in - constr 0 anf#182 - 1 -> constr 1 +\state#109 : nash/base:Prop.prng -> constr 1 --- optimized UPLC -(program 1.1.0 - [(lam builtin_117 - [(lam builtin_118 - [(lam partial_119 - [(lam partial_120 - [(lam message_7 - [(lam assertAt_11 - [(lam assertCapture_16 - (lam state_17 - [(lam match_18 - (case - match_18 - (lam field_19 - (case - field_19 - (lam field_20 - (lam field_21 - [(lam anf_116 (constr 0 anf_116)) - (constr 0 - field_21 - (lam arg_22 - [(lam apply_23 - [(lam anf_24 - (case - anf_24 - [[assertAt_11 (con string "\0assert\0\48")] - (lam unit_25 - [(lam applyForward_28 - [(lam anf_29 - [(lam decimal_40 - [(lam anf_41 - [(lam anf_50 - [[anf_29 anf_50] - (lam unit_51 - [(lam applyForward_54 - [(lam anf_55 - [(lam decimal_66 - [(lam anf_67 - [(lam anf_76 [[anf_55 anf_76] (lam unit_77 (error))]) - (case - anf_67 - [(lam anf_75 [[applyForward_54 anf_75] (builtin decodeUtf8)]) - [[applyForward_54 field_20] decimal_66]] - [(lam anf_68 - [(lam anf_69 - [(lam anf_70 - [(lam anf_71 - [(lam anf_72 - [(lam anf_73 [(lam anf_74 [anf_73 anf_74]) [(builtin appendString) message_7]]) - [applyForward_54 anf_72]]) - [[applyForward_54 anf_71] (builtin decodeUtf8)]]) - [[applyForward_54 anf_70] decimal_66]]) - [anf_68 anf_69]]) - partial_119]) - [applyForward_54 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_56 [self_56 self_56]) - (lam self_57 - (lam n_58 - [(lam anf_59 - (case - anf_59 - [(lam anf_61 - [(lam anf_62 - [(lam anf_63 - [(lam anf_64 - [(lam anf_65 [[(builtin appendByteString) anf_62] anf_65]) - [[(builtin consByteString) anf_64] (con bytestring #)]]) - [partial_120 anf_63]]) - [[(builtin remainderInteger) n_58] (con integer 10)]]) - [[self_57 self_57] anf_61]]) - [[(builtin quotientInteger) n_58] (con integer 10)]] - [(lam anf_60 [[(builtin consByteString) anf_60] (con bytestring #)]) - [partial_120 n_58]])) - [[(builtin lessThanInteger) n_58] (con integer 10)]]))]]) - [assertCapture_16 (con string "\0assert\0\48\0\50\0")]]) - (lam x_52 (lam f_53 [f_53 x_52]))])]) - (case - anf_41 - [(lam anf_49 [[applyForward_28 anf_49] (builtin decodeUtf8)]) - [[applyForward_28 field_20] decimal_40]] - [(lam anf_42 - [(lam anf_43 - [(lam anf_44 - [(lam anf_45 - [(lam anf_46 - [(lam anf_47 [(lam anf_48 [anf_47 anf_48]) [(builtin appendString) message_7]]) - [applyForward_28 anf_46]]) - [[applyForward_28 anf_45] (builtin decodeUtf8)]]) - [[applyForward_28 anf_44] decimal_40]]) - [anf_42 anf_43]]) - partial_119]) - [applyForward_28 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_30 [self_30 self_30]) - (lam self_31 - (lam n_32 - [(lam anf_33 - (case - anf_33 - [(lam anf_35 - [(lam anf_36 - [(lam anf_37 - [(lam anf_38 - [(lam anf_39 [[(builtin appendByteString) anf_36] anf_39]) - [[(builtin consByteString) anf_38] (con bytestring #)]]) - [partial_120 anf_37]]) - [[(builtin remainderInteger) n_32] (con integer 10)]]) - [[self_31 self_31] anf_35]]) - [[(builtin quotientInteger) n_32] (con integer 10)]] - [(lam anf_34 [[(builtin consByteString) anf_34] (con bytestring #)]) - [partial_120 n_32]])) - [[(builtin lessThanInteger) n_32] (con integer 10)]]))]]) - [assertCapture_16 (con string "\0assert\0\48\0\49\0")]]) - (lam x_26 (lam f_27 [f_27 x_26]))])] - (con unit ()))) - [apply_23 field_20]]) - [(builtin equalsInteger) field_20]]) - (lam arg_78 - [(lam applyForward_81 - [(lam decimal_93 - [(lam anf_94 - [(lam anf_115 [[builtin_117 anf_115] (con (list string) [])]) - (case - anf_94 - [(lam anf_114 [[applyForward_81 anf_114] (builtin decodeUtf8)]) - [[applyForward_81 field_20] decimal_93]] - [(lam anf_95 - [(lam anf_96 - [(lam anf_97 - [(lam anf_98 - [(lam anf_106 - [(lam anf_107 - [(lam anf_108 [anf_107 anf_108]) [(builtin appendString) message_7]]) - [applyForward_81 anf_106]]) - [[applyForward_81 anf_98] (builtin decodeUtf8)]]) - [[applyForward_81 anf_97] decimal_93]]) - [anf_95 anf_96]]) - partial_119]) - [applyForward_81 field_20]])]) - [[(builtin lessThanInteger) field_20] (con integer 0)]]) - [(lam self_82 [self_82 self_82]) - (lam self_83 - (lam n_84 - [(lam anf_85 - (case - anf_85 - [(lam anf_87 - [(lam anf_88 - [(lam anf_89 - [(lam anf_90 - [(lam anf_92 [[(builtin appendByteString) anf_88] anf_92]) - [[(builtin consByteString) anf_90] (con bytestring #)]]) - [partial_120 anf_89]]) - [[(builtin remainderInteger) n_84] (con integer 10)]]) - [[self_83 self_83] anf_87]]) - [[(builtin quotientInteger) n_84] (con integer 10)]] - [(lam anf_86 [[(builtin consByteString) anf_86] (con bytestring #)]) - [partial_120 n_84]])) - [[(builtin lessThanInteger) n_84] (con integer 10)]]))]]) - (lam x_79 (lam f_80 [f_80 x_79]))]))])))) - (constr 1))) - (constr 1)])) - (lam prefix_12 - (lam value_13 - (lam rest_14 - [(lam anf_15 [[assertAt_11 anf_15] rest_14]) - [[(builtin appendString) prefix_12] value_13]])))]) - (lam marker_8 - (lam rest_9 - [(lam anf_10 [anf_10 (con unit ())]) [[builtin_118 marker_8] rest_9]]))]) - (con string "-")]) - [(builtin addInteger) (con integer 48)]]) - [(builtin subtractInteger) (con integer 0)]]) - (force (builtin trace))]) - (force (builtin mkCons))]) +(program 1.1.0 (lam state_1 (constr 1))) --- encoded target UPLC --- prepare (program 1.1.0 diff --git a/crates/nash-codegen/tests/support/inverse.rs b/crates/nash-codegen/tests/support/inverse.rs new file mode 100644 index 00000000..e492b9c5 --- /dev/null +++ b/crates/nash-codegen/tests/support/inverse.rs @@ -0,0 +1,342 @@ +//! Shared semantic and explicit performance inputs for representation cancellation. +use nash_ir::{ + build::Builder, + core::*, + ty::{ConstTy, Ty}, +}; +use nash_plutus::{ + builtin::DefaultFunction as F, constant::Constant, data::PlutusData as D, typ::Type, +}; + +pub fn cases<'a>(b: &Builder<'a>) -> Vec<(String, &'a Core<'a>, bool)> { + let a = b.arena; + let d = D::integer_from(a, 7); + let data = Constant::data(a, d); + let pair = Constant::proto_pair(a, &Type::Data, &Type::Data, data, data); + let list = Constant::proto_list(a, &Type::Data, a.alloc([data])); + let map = Constant::proto_list( + a, + a.alloc(Type::Pair(&Type::Data, &Type::Data)), + a.alloc([pair]), + ); + let mut cases = Vec::new(); + for (name, encode, decode, value, encoded) in [ + ("integer", F::IData, F::UnIData, b.int(7), b.lit(data)), + ( + "bytes", + F::BData, + F::UnBData, + b.lit(Constant::byte_string(a, b"hello")), + b.lit(Constant::data(a, D::byte_string(a, b"hello"))), + ), + ( + "list", + F::ListData, + F::UnListData, + b.lit(list), + b.lit(Constant::data(a, D::list(a, a.alloc([d])))), + ), + ( + "map", + F::MapData, + F::UnMapData, + b.lit(map), + b.lit(Constant::data(a, D::map(a, a.alloc([(d, d)])))), + ), + ( + "utf8", + F::EncodeUtf8, + F::DecodeUtf8, + b.lit(Constant::string(a, "héllo")), + b.lit(Constant::byte_string(a, "héllo".as_bytes())), + ), + ] { + let wrap = |x| b.builtin(decode, &[b.builtin(encode, &[x], encoded.ty)], value.ty); + let trace = |s, x| b.trace(b.lit(Constant::string(a, s)), x); + cases.push((format!("{name}_direct"), wrap(value), false)); + cases.push(( + format!("{name}_trace"), + wrap(trace("operand", value)), + false, + )); + cases.push(( + format!("{name}_decoded"), + wrap(b.builtin(decode, &[encoded], value.ty)), + false, + )); + cases.push(( + format!("{name}_decode_failure"), + wrap(b.builtin(decode, &[b.int(0)], value.ty)), + true, + )); + cases.push(( + format!("{name}_reverse"), + b.builtin( + encode, + &[b.builtin(decode, &[encoded], value.ty)], + encoded.ty, + ), + false, + )); + cases.push(( + format!("{name}_wrong_kind"), + wrap(b.with_type(b.lit(Constant::bool(a, false)), value.ty)), + true, + )); + cases.push(( + format!("{name}_cold"), + b.if_( + b.lit(Constant::bool(a, true)), + value, + wrap(trace("cold", value)), + ), + false, + )); + let x = Binder { + name: b.fresh("x"), + ty: value.ty, + }; + let y = Binder { + name: b.fresh("encoded"), + ty: encoded.ty, + }; + let z = Binder { + name: b.fresh("alias"), + ty: encoded.ty, + }; + let decoded = b.builtin(decode, &[b.var(z.name, z.ty)], value.ty); + let bindings = |body| { + b.let_( + x, + trace("once", value), + b.let_( + y, + b.builtin(encode, &[b.var(x.name, x.ty)], encoded.ty), + b.let_(z, b.var(y.name, y.ty), body), + ), + ) + }; + cases.push(( + format!("{name}_bound"), + bindings(trace("after encoding", decoded)), + false, + )); + cases.push(( + format!("{name}_captured"), + bindings(b.force(b.delay(decoded), decoded.ty)), + false, + )); + cases.push(( + format!("{name}_escaping"), + bindings(b.constr(0, &[b.var(y.name, y.ty), decoded, decoded], Ty::Erased)), + false, + )); + cases.push(( + format!("{name}_bound_invalid"), + b.let_( + x, + trace( + "operand", + b.with_type(b.lit(Constant::bool(a, false)), value.ty), + ), + b.let_( + y, + b.builtin(encode, &[b.var(x.name, x.ty)], encoded.ty), + trace( + "must not run", + b.builtin(decode, &[b.var(y.name, y.ty)], value.ty), + ), + ), + ), + true, + )); + cases.push(( + format!("{name}_reverse_bound_invalid"), + b.let_( + y, + b.with_type(b.int(0), encoded.ty), + b.let_( + x, + b.builtin(decode, &[b.var(y.name, y.ty)], value.ty), + trace( + "must not run", + b.builtin(encode, &[b.var(x.name, x.ty)], encoded.ty), + ), + ), + ), + true, + )); + cases.push(( + format!("{name}_oversaturated"), + b.app(wrap(value), &[b.int(1)], value.ty), + true, + )); + let unknown = Binder { + name: b.fresh("unknown"), + ty: value.ty, + }; + cases.push(( + format!("{name}_unknown_invalid"), + b.app( + b.lam(&[unknown], wrap(b.var(unknown.name, unknown.ty))), + &[b.lit(Constant::bool(a, false))], + value.ty, + ), + true, + )); + cases.push(( + format!("{name}_partial"), + b.app( + b.builtin(decode, &[], Ty::Erased), + &[b.builtin(encode, &[value], encoded.ty)], + value.ty, + ), + false, + )); + } + let bad_utf8 = b.lit(Constant::byte_string(a, &[255])); + cases.push(( + "utf8_reverse_invalid".into(), + b.builtin( + F::EncodeUtf8, + &[b.builtin(F::DecodeUtf8, &[bad_utf8], Ty::Const(&ConstTy::String))], + bad_utf8.ty, + ), + true, + )); + for (name, encode, decode, typ) in [ + ("list_wrong_tag", F::ListData, F::UnListData, &Type::Integer), + ("map_wrong_tag", F::MapData, F::UnMapData, &Type::Data), + ] { + let value = b.lit(Constant::proto_list(a, typ, &[])); + cases.push(( + name.into(), + b.builtin(decode, &[b.builtin(encode, &[value], Ty::Erased)], value.ty), + true, + )); + } + let data_ty = b.lit(data).ty; + let fields = Binder { + name: b.fresh("fields"), + ty: b.lit(list).ty, + }; + let tag = Binder { + name: b.fresh("tag"), + ty: b.int(0).ty, + }; + let encoded = Binder { + name: b.fresh("constructor"), + ty: data_ty, + }; + let payload = Binder { + name: b.fresh("payload"), + ty: Ty::Erased, + }; + let p = b.var(payload.name, payload.ty); + let fst = b.builtin(F::FstPair, &[p], tag.ty); + let snd = b.builtin(F::SndPair, &[p], fields.ty); + let constructor = b.builtin( + F::ConstrData, + &[b.var(tag.name, tag.ty), b.var(fields.name, fields.ty)], + data_ty, + ); + let bind = |body| { + b.let_( + tag, + b.int(0), + b.let_( + fields, + b.lit(list), + b.let_( + encoded, + constructor, + b.let_( + payload, + b.builtin( + F::UnConstrData, + &[b.var(encoded.name, encoded.ty)], + Ty::Erased, + ), + body, + ), + ), + ), + ) + }; + cases.push(("constructor_tag".into(), bind(fst), false)); + cases.push(("constructor_fields".into(), bind(snd), false)); + cases.push(( + "constructor_rebuild".into(), + bind(b.builtin(F::ConstrData, &[fst, snd], data_ty)), + false, + )); + for (name, subject, fails) in [ + ( + "constructor_known_reverse", + b.lit(Constant::data(a, D::constr(a, 3, a.alloc([d])))), + false, + ), + ("constructor_wrong_variant", b.lit(data), true), + ] { + cases.push(( + name.into(), + b.let_( + encoded, + subject, + b.let_( + payload, + b.builtin(F::UnConstrData, &[b.var(encoded.name, data_ty)], Ty::Erased), + b.trace( + b.lit(Constant::string(a, "after decoding")), + b.builtin(F::ConstrData, &[fst, snd], data_ty), + ), + ), + ), + fails, + )); + } + let bad_tag = b.with_type(b.lit(Constant::bool(a, false)), tag.ty); + cases.push(( + "constructor_bad_tag".into(), + b.let_( + tag, + bad_tag, + b.let_( + fields, + b.trace(b.lit(Constant::string(a, "fields evaluated")), b.lit(list)), + b.let_( + encoded, + constructor, + b.builtin( + F::FstPair, + &[b.builtin(F::UnConstrData, &[b.var(encoded.name, data_ty)], Ty::Erased)], + tag.ty, + ), + ), + ), + ), + true, + )); + cases.push(( + "constructor_bad_fields".into(), + b.let_( + tag, + b.int(0), + b.let_( + fields, + b.with_type(b.lit(Constant::bool(a, false)), fields.ty), + b.let_( + encoded, + constructor, + b.builtin( + F::SndPair, + &[b.builtin(F::UnConstrData, &[b.var(encoded.name, data_ty)], Ty::Erased)], + fields.ty, + ), + ), + ), + ), + true, + )); + cases +} diff --git a/crates/nash-codegen/tests/support/optimizer.rs b/crates/nash-codegen/tests/support/optimizer.rs index a90446d8..94150a57 100644 --- a/crates/nash-codegen/tests/support/optimizer.rs +++ b/crates/nash-codegen/tests/support/optimizer.rs @@ -1,5 +1,5 @@ //! Shared accepted optimizer pipeline for unit and integration snapshots. -//! Test-only: production assembly remains O0. +//! Rendering helpers reuse the production O1 Core pipeline. use crate::{lower, program, recursion}; use nash_ir::{anf, build::Builder, core::Core, hygiene, pretty::pretty}; use nash_plutus::{ @@ -9,27 +9,17 @@ use nash_plutus::{ }; /// Normalize once before optimization, then rewrite recursion and lower nested -/// Core directly. Used only by tests, never production assembly. +/// Core directly. Reuses the production O1 optimizer. pub fn optimize<'a>(arena: &'a Arena, core: &'a Core<'a>) -> &'a Core<'a> { optimize_with(&Builder::new(arena), core) } pub(crate) fn optimize_with<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { - let fresh = hygiene::freshen(b, core); - hygiene::validate(fresh, &[]).unwrap(); - let lifted = nash_ir::static_lift::lift(b, fresh); - hygiene::validate(lifted, &[]).unwrap(); - let shortened = nash_ir::unused_params::reduce(b, lifted); - hygiene::validate(shortened, &[]).unwrap(); - let folded = nash_ir::known_case::reduce_constr(b, shortened); - hygiene::validate(folded, &[]).unwrap(); - let normalized = anf::normalize(b, folded); - anf::validate(normalized).unwrap(); - hygiene::validate(normalized, &[]).unwrap(); - let propagated = nash_ir::small_inline::simplify(b, normalized); - anf::validate(propagated).unwrap(); - assert_eq!(core.ty, propagated.ty); - propagated + let optimized = crate::optimizer::optimize_with(b, core); + hygiene::validate(optimized, &[]).unwrap(); + anf::validate(optimized).unwrap(); + assert_eq!(core.ty, optimized.ty); + optimized } /// Prepared once; rendering and evaluation share these exact programs. diff --git a/crates/nash-codegen/tests/vesting.rs b/crates/nash-codegen/tests/vesting.rs index 5dbabfc0..33f025d7 100644 --- a/crates/nash-codegen/tests/vesting.rs +++ b/crates/nash-codegen/tests/vesting.rs @@ -8,6 +8,7 @@ use std::collections::BTreeMap; use nash_ast::{PackageName, QualifiedName, primitives}; use nash_can::{CanResult, Interface}; +use nash_codegen::optimizer; use nash_codegen::{ build::{Build, Input, TraceConfig}, lower, program, recursion, diff --git a/crates/nash-config/src/config.rs b/crates/nash-config/src/config.rs index af7aae69..9f0fcb45 100644 --- a/crates/nash-config/src/config.rs +++ b/crates/nash-config/src/config.rs @@ -38,10 +38,53 @@ pub enum TraceLevel { Verbose, } +/// Optimization is independent of user and compiler trace settings. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(try_from = "u8", into = "u8")] +pub enum OptimizationLevel { + O0, + #[default] + O1, +} +impl TryFrom for OptimizationLevel { + type Error = &'static str; + fn try_from(value: u8) -> Result { + match value { + 0 => Ok(Self::O0), + 1 => Ok(Self::O1), + _ => Err("expected optimization level 0 or 1"), + } + } +} +impl From for u8 { + fn from(value: OptimizationLevel) -> Self { + match value { + OptimizationLevel::O0 => 0, + OptimizationLevel::O1 => 1, + } + } +} +impl std::str::FromStr for OptimizationLevel { + type Err = &'static str; + fn from_str(value: &str) -> Result { + match value { + "0" => Ok(Self::O0), + "1" => Ok(Self::O1), + _ => Err("expected optimization level 0 or 1"), + } + } +} +impl OptimizationLevel { + fn is_default(&self) -> bool { + *self == Self::O1 + } +} + /// Project build settings, stored at the top level of `nash.jsonc`. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] #[serde(from = "BuildFields", into = "BuildFields")] pub struct Build { + pub optimize: OptimizationLevel, pub plutus_version: PlutusVersion, pub trace_level: TraceLevel, /// Distinguishes an explicit silent setting from the command-specific default. @@ -52,6 +95,8 @@ pub struct Build { #[derive(Serialize, Deserialize)] #[serde(rename_all = "camelCase")] struct BuildFields { + #[serde(default, skip_serializing_if = "OptimizationLevel::is_default")] + optimize: OptimizationLevel, #[serde(default)] plutus_version: PlutusVersion, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -63,6 +108,7 @@ struct BuildFields { impl From for Build { fn from(fields: BuildFields) -> Self { Self { + optimize: fields.optimize, plutus_version: fields.plutus_version, trace_level: fields.trace_level.unwrap_or_default(), trace_level_explicit: fields.trace_level.is_some(), @@ -74,6 +120,7 @@ impl From for Build { impl From for BuildFields { fn from(build: Build) -> Self { Self { + optimize: build.optimize, plutus_version: build.plutus_version, trace_level: (build.trace_level_explicit || build.trace_level != TraceLevel::Silent) .then_some(build.trace_level), diff --git a/crates/nash-config/src/error.rs b/crates/nash-config/src/error.rs index 0347ea4d..06dac117 100644 --- a/crates/nash-config/src/error.rs +++ b/crates/nash-config/src/error.rs @@ -98,8 +98,8 @@ pub enum ConfigError { expected: &'static str, }, - #[error("'{path}' at {pos}: 'optimize' is unavailable; optimizer support is not implemented")] - OptimizerUnavailable { path: PathBuf, pos: Position }, + #[error("'{path}' at {pos}: 'optimize' must be the integer 0 or 1")] + InvalidOptimization { path: PathBuf, pos: Position }, #[error( "'{path}' at {pos}: '{field}' must be set in workspace members, not the workspace config" diff --git a/crates/nash-config/src/lib.rs b/crates/nash-config/src/lib.rs index 27375370..273fe2da 100644 --- a/crates/nash-config/src/lib.rs +++ b/crates/nash-config/src/lib.rs @@ -74,7 +74,8 @@ mod parse; pub use config::{ Application, Build, CONFIG_FILE_NAME, Config, Dependency, DependencySource, ExposedModules, - GitDep, Package, PathDep, PlutusVersion, TraceLevel, Workspace, WorkspaceDep, + GitDep, OptimizationLevel, Package, PathDep, PlutusVersion, TraceLevel, Workspace, + WorkspaceDep, }; pub use error::{ConfigError, Position}; pub use name::{PackageName, PackageNameError}; diff --git a/crates/nash-config/src/parse.rs b/crates/nash-config/src/parse.rs index 011aa1f0..9a3d5ec1 100644 --- a/crates/nash-config/src/parse.rs +++ b/crates/nash-config/src/parse.rs @@ -48,13 +48,6 @@ pub fn parse(contents: &str, path: impl AsRef) -> Result Result { - if let Some(prop) = find_property(obj, "optimize") { - return Err(ConfigError::OptimizerUnavailable { - path: path.into(), - pos: position_of(contents, prop.name.range()), - }); - } - let type_prop = find_property(obj, "type").ok_or_else(|| { ConfigError::missing_field(path, "type", position_of(contents, obj.range)) })?; @@ -153,7 +146,19 @@ fn parse_build(contents: &str, path: &Path, obj: &Object) -> Result crate::OptimizationLevel::O1, + Some(prop) => prop + .value + .as_number_lit() + .and_then(|n| n.value.parse().ok()) + .ok_or_else(|| ConfigError::InvalidOptimization { + path: path.into(), + pos: position_of(contents, prop.value.range()), + })?, + }; Ok(Build { + optimize, plutus_version, trace_level, trace_level_explicit: find_property(obj, "traceLevel").is_some(), @@ -210,7 +215,7 @@ fn parse_package(contents: &str, path: &Path, obj: &Object) -> Result Result { - for field in ["plutusVersion", "traceLevel", "compilerTraces"] { + for field in ["plutusVersion", "traceLevel", "compilerTraces", "optimize"] { if let Some(prop) = find_property(obj, field) { return Err(ConfigError::WorkspaceBuildSetting { path: path.into(), @@ -849,6 +854,19 @@ mod build_tests { use super::*; use crate::{Build, PlutusVersion, TraceLevel}; + #[test] + fn optimization_levels_roundtrip() { + for level in [0, 1] { + let source = format!( + r#"{{"type":"application","optimize":{level},"traceLevel":"verbose","compilerTraces":true}}"# + ); + let config = parse(&source, "nash.jsonc").unwrap(); + assert_config_roundtrip_snapshot!(&source, config.clone()); + assert_eq!(serde_json::from_str::(&source).unwrap(), config); + assert_eq!(u8::from(config.build().optimize), level); + } + } + #[test] fn build_defaults() { for source in [ @@ -885,6 +903,7 @@ mod build_tests { assert_eq!( config.build(), Build { + optimize: crate::OptimizationLevel::O1, plutus_version: expected_version, trace_level: expected_trace, trace_level_explicit: true, @@ -904,6 +923,7 @@ mod build_tests { assert_eq!( config.build(), Build { + optimize: crate::OptimizationLevel::O1, plutus_version: PlutusVersion::V1, trace_level: TraceLevel::Verbose, trace_level_explicit: true, @@ -951,16 +971,13 @@ mod build_tests { compiler_traces_wrong_type, r#"{"type":"application","compilerTraces":"true"}"# ); + config_error_snapshot!(invalid_optimizer, r#"{"type":"application","optimize":2}"#); config_error_snapshot!( - optimizer_unavailable, - r#"{"type":"application","optimize":0}"# - ); - config_error_snapshot!( - workspace_optimizer_unavailable, + workspace_invalid_optimizer, r#"{"type":"workspace","members":[],"optimize":2}"# ); config_error_snapshot!( - package_optimizer_unavailable, - r#"{"type":"package","optimize":null}"# + package_invalid_optimizer, + r#"{"type":"package","name":"test/lib","version":"1.0.0","summary":"","license":"MIT","exposedModules":[],"optimize":null}"# ); } diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__invalid_optimizer.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__invalid_optimizer.snap new file mode 100644 index 00000000..9053a317 --- /dev/null +++ b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__invalid_optimizer.snap @@ -0,0 +1,6 @@ +--- +source: crates/nash-config/src/parse.rs +description: "{\"type\":\"application\",\"optimize\":2}" +info: diagnostic +--- + × 'nash.jsonc' at 1:34: 'optimize' must be the integer 0 or 1 diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimization_levels_roundtrip-2.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimization_levels_roundtrip-2.snap new file mode 100644 index 00000000..228f5698 --- /dev/null +++ b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimization_levels_roundtrip-2.snap @@ -0,0 +1,15 @@ +--- +source: crates/nash-config/src/parse.rs +description: "{\"type\":\"application\",\"optimize\":1,\"traceLevel\":\"verbose\",\"compilerTraces\":true}" +--- +{ + "type": "application", + "plutusVersion": "v3", + "traceLevel": "verbose", + "compilerTraces": true, + "sourceDirectories": [ + "src" + ], + "dependencies": {}, + "testDependencies": {} +} diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimization_levels_roundtrip.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimization_levels_roundtrip.snap new file mode 100644 index 00000000..aace171d --- /dev/null +++ b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimization_levels_roundtrip.snap @@ -0,0 +1,16 @@ +--- +source: crates/nash-config/src/parse.rs +description: "{\"type\":\"application\",\"optimize\":0,\"traceLevel\":\"verbose\",\"compilerTraces\":true}" +--- +{ + "type": "application", + "optimize": 0, + "plutusVersion": "v3", + "traceLevel": "verbose", + "compilerTraces": true, + "sourceDirectories": [ + "src" + ], + "dependencies": {}, + "testDependencies": {} +} diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimizer_unavailable.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimizer_unavailable.snap deleted file mode 100644 index b224d3bc..00000000 --- a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__optimizer_unavailable.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: crates/nash-config/src/parse.rs -description: "{\"type\":\"application\",\"optimize\":0}" -info: diagnostic ---- - × 'nash.jsonc' at 1:23: 'optimize' is unavailable; optimizer support is not - │ implemented diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__package_invalid_optimizer.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__package_invalid_optimizer.snap new file mode 100644 index 00000000..11877305 --- /dev/null +++ b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__package_invalid_optimizer.snap @@ -0,0 +1,6 @@ +--- +source: crates/nash-config/src/parse.rs +description: "{\"type\":\"package\",\"name\":\"test/lib\",\"version\":\"1.0.0\",\"summary\":\"\",\"license\":\"MIT\",\"exposedModules\":[],\"optimize\":null}" +info: diagnostic +--- + × 'nash.jsonc' at 1:115: 'optimize' must be the integer 0 or 1 diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__package_optimizer_unavailable.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__package_optimizer_unavailable.snap deleted file mode 100644 index 28dbda5f..00000000 --- a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__package_optimizer_unavailable.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: crates/nash-config/src/parse.rs -description: "{\"type\":\"package\",\"optimize\":null}" -info: diagnostic ---- - × 'nash.jsonc' at 1:19: 'optimize' is unavailable; optimizer support is not - │ implemented diff --git a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__workspace_optimizer_unavailable.snap b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__workspace_invalid_optimizer.snap similarity index 56% rename from crates/nash-config/src/snapshots/nash_config__parse__build_tests__workspace_optimizer_unavailable.snap rename to crates/nash-config/src/snapshots/nash_config__parse__build_tests__workspace_invalid_optimizer.snap index 0b013fce..27bd8eda 100644 --- a/crates/nash-config/src/snapshots/nash_config__parse__build_tests__workspace_optimizer_unavailable.snap +++ b/crates/nash-config/src/snapshots/nash_config__parse__build_tests__workspace_invalid_optimizer.snap @@ -3,5 +3,5 @@ source: crates/nash-config/src/parse.rs description: "{\"type\":\"workspace\",\"members\":[],\"optimize\":2}" info: diagnostic --- - × 'nash.jsonc' at 1:34: 'optimize' is unavailable; optimizer support is not - │ implemented + × 'nash.jsonc' at 1:34: 'optimize' must be set in workspace members, not the + │ workspace config diff --git a/crates/nash-driver/src/build.rs b/crates/nash-driver/src/build.rs index 3b71d6a1..3be571b7 100644 --- a/crates/nash-driver/src/build.rs +++ b/crates/nash-driver/src/build.rs @@ -100,8 +100,13 @@ pub fn build_validators_matching_with( trace, ) .map_err(|e| error(e.to_string()))?; - let compiled = nash_codegen::program::assemble_core_for_version(&arena, core.core, version) - .map_err(|e| error(e.to_string()))?; + let compiled = nash_codegen::program::assemble_core_with_options( + &arena, + core.core, + version, + config.optimize, + ) + .map_err(|e| error(e.to_string()))?; let uplc = pretty::program(Program::new( &arena, compiled.program.version, @@ -313,7 +318,7 @@ pub fn compile_tests_matching_with( .uri .to_file_path() .unwrap_or_else(|_| module.uri.path().into()); - let programs = nash_codegen::tests::compile_tests_matching( + let programs = nash_codegen::tests::compile_tests_matching_optimized( &arena, &build, module.module.name, @@ -321,6 +326,7 @@ pub fn compile_tests_matching_with( &path, config.plutus_version, trace, + config.optimize, |test| include(module.module.name.name, test.name.value), ) .map_err(|error| BuildError { diff --git a/crates/nash-driver/tests/base_traits.rs b/crates/nash-driver/tests/base_traits.rs index af318671..e824ed7d 100644 --- a/crates/nash-driver/tests/base_traits.rs +++ b/crates/nash-driver/tests/base_traits.rs @@ -133,3 +133,81 @@ base_snapshot!(cardano_helpers, "fixtures/base-traits/Cardano.nash"); base_snapshot!(integer_math, "fixtures/base-traits/IntegerMath.nash"); base_snapshot!(rational_math, "fixtures/base-traits/Rational.nash"); base_snapshot!(crypto_helpers, "fixtures/base-traits/Crypto.nash"); + +#[tokio::test] +async fn optimization_levels_preserve_test_and_property_traces() { + let memory = InMemorySource::new(); + let mut modules = bundled_base::modules(); + let mut roots = Vec::new(); + for name in ["Baseline", "Optimized"] { + let uri = Url::parse(&format!("file:///app/src/{name}.nash")).unwrap(); + memory.insert( + uri.clone(), + format!( + r#"module {name} exposing (..) +import Prop exposing (constant) +coldFailure : unit -> bool +coldFailure _ = fail +tests + test "pass" = do + trace "before" () + assert (True || coldFailure ()) + test "failure" fail = do + trace "before failure" () + assert False + prop "property" = + let + x via trace "generator" (constant 7) + in + do + trace "body" () + assert (x == 7) +"# + ), + ); + modules.insert(uri.clone(), None); + roots.push(uri); + } + let db = Arc::new(Mutex::new(Database::new(memory))); + let graph = build_graph_with_tests( + db.clone(), + &modules.keys().cloned().collect::>(), + &roots, + ) + .await + .unwrap(); + let (report, programs) = test_with(db, &graph, &modules, move |solved| { + nash_driver::build::compile_tests_with(solved, |uri| { + roots.contains(uri).then_some(nash_config::Build { + optimize: if uri.path().ends_with("Baseline.nash") { + nash_config::OptimizationLevel::O0 + } else { + nash_config::OptimizationLevel::O1 + }, + trace_level: nash_config::TraceLevel::Verbose, + trace_level_explicit: true, + ..Default::default() + }) + }) + }) + .await; + assert!(report.is_success(), "{report:?}"); + let results = nash_test::run_all(programs.unwrap().unwrap(), &nash_test::Config::default()); + let render = |module: &str| { + results + .iter() + .filter(|o| o.test.module == module) + .map(|o| { + format!( + "{}: {:?}; traces: {:?}; counterexample: {:?}", + o.test.name, o.status, o.traces, o.counterexample + ) + }) + .collect::>() + .join("\n") + }; + let before = render("Baseline"); + let after = render("Optimized"); + insta::assert_snapshot!(format!("--- O0\n{before}\n--- O1\n{after}")); + assert_eq!(before, after); +} diff --git a/crates/nash-driver/tests/build.rs b/crates/nash-driver/tests/build.rs index c2adabf4..1aae9220 100644 --- a/crates/nash-driver/tests/build.rs +++ b/crates/nash-driver/tests/build.rs @@ -343,3 +343,52 @@ async fn case_alias_outputs_and_renames_preserve_existing_artifacts() { assert!(write_outputs(&directory.0, &[]).await.is_err()); assert_eq!(directory_contents(&directory.0), before); } + +#[tokio::test] +async fn roots_select_o0_and_o1_with_the_same_traces() { + let bodies: Vec<_> = ["Baseline", "Optimized"].into_iter().map(|name| format!( + "validator module {name} exposing (main)\nidentity x = x\nmain : Data -> unit\nmain _ = trace \"before\" (identity ())\n" + )).collect(); + let files = [ + ("Baseline", bodies[0].as_str()), + ("Optimized", bodies[1].as_str()), + ]; + let outputs = outputs_with(&files, |uri| nash_config::Build { + optimize: if uri.path().ends_with("Optimized.nash") { + nash_config::OptimizationLevel::O1 + } else { + nash_config::OptimizationLevel::O0 + }, + trace_level: nash_config::TraceLevel::Verbose, + ..Default::default() + }) + .await; + let arena = Arena::new(); + let mut observations = Vec::new(); + let mut rendered = String::new(); + for output in &outputs { + let program = syn::parse_program(&arena, &output.uplc).unwrap(); + let result = program + .apply( + &arena, + nash_plutus::term::Term::data( + &arena, + nash_plutus::data::PlutusData::integer_from(&arena, 0), + ), + ) + .eval(&arena); + let outcome = result + .term + .as_ref() + .map(|t| nash_plutus::pretty::term(t)) + .map_err(|e| format!("{e:?}")); + rendered.push_str(&format!( + "--- {}\n{}\n--- outcome\n{outcome:?}\n--- logs\n{:?}\n", + output.module, output.uplc, result.info.logs + )); + observations.push((outcome, result.info.logs)); + } + insta::assert_snapshot!(rendered); + assert_eq!(observations[0], observations[1]); + assert_ne!(outputs[0].flat, outputs[1].flat); +} diff --git a/crates/nash-driver/tests/snapshots/base_traits__optimization_levels_preserve_test_and_property_traces.snap b/crates/nash-driver/tests/snapshots/base_traits__optimization_levels_preserve_test_and_property_traces.snap new file mode 100644 index 00000000..9efd9e8b --- /dev/null +++ b/crates/nash-driver/tests/snapshots/base_traits__optimization_levels_preserve_test_and_property_traces.snap @@ -0,0 +1,12 @@ +--- +source: crates/nash-driver/tests/base_traits.rs +expression: "format!(\"--- O0\\n{before}\\n--- O1\\n{after}\")" +--- +--- O0 +pass: Pass; traces: ["before"]; counterexample: None +failure: Pass; traces: ["before failure"]; counterexample: None +property: Pass; traces: ["generator", "body"]; counterexample: None +--- O1 +pass: Pass; traces: ["before"]; counterexample: None +failure: Pass; traces: ["before failure"]; counterexample: None +property: Pass; traces: ["generator", "body"]; counterexample: None diff --git a/crates/nash-driver/tests/snapshots/build__roots_select_o0_and_o1_with_the_same_traces.snap b/crates/nash-driver/tests/snapshots/build__roots_select_o0_and_o1_with_the_same_traces.snap new file mode 100644 index 00000000..70ae71b7 --- /dev/null +++ b/crates/nash-driver/tests/snapshots/build__roots_select_o0_and_o1_with_the_same_traces.snap @@ -0,0 +1,34 @@ +--- +source: crates/nash-driver/tests/build.rs +expression: rendered +--- +--- Baseline +(program 1.1.0 + [(lam message_10 + [(lam identity_3 + [(lam fromUnit_4 + [(lam fromString_5 + [(lam main_1 main_1) + (lam arg_2 + [(lam match_6 + (force + [[(force (builtin trace)) [fromString_5 message_10]] + (delay [identity_3 [fromUnit_4 (con unit ())]])])) + arg_2])]) + (lam value_9 value_9)]) + (lam value_8 value_8)]) + (lam x_7 x_7)]) + (con string "before")]) +--- outcome +Ok("(con unit ())") +--- logs +["before"] +--- Optimized +(program 1.1.0 + [(lam builtin_2 + (lam arg_1 (force [[builtin_2 (con string "before")] (delay (con unit ()))]))) + (force (builtin trace))]) +--- outcome +Ok("(con unit ())") +--- logs +["before"] diff --git a/crates/nash-driver/tests/snapshots/build__roots_use_their_own_target_settings_and_hashes.snap b/crates/nash-driver/tests/snapshots/build__roots_use_their_own_target_settings_and_hashes.snap index ccff954e..488b85bf 100644 --- a/crates/nash-driver/tests/snapshots/build__roots_use_their_own_target_settings_and_hashes.snap +++ b/crates/nash-driver/tests/snapshots/build__roots_use_their_own_target_settings_and_hashes.snap @@ -3,16 +3,8 @@ source: crates/nash-driver/tests/build.rs description: "validator module First exposing (main)\nmain : 'a -> unit\nmain _ = ()\n\nvalidator module Second exposing (main)\nmain : 'a -> unit\nmain _ = ()\n" --- First -(program 1.1.0 - [(lam fromUnit_3 - [(lam main_1 main_1) - (lam arg_2 [(lam match_4 [fromUnit_3 (con unit ())]) arg_2])]) - (lam value_5 value_5)]) -hash: 4b49f99338dd1b89803563083e44b028db2f0ff616a422a6c391d6a8 +(program 1.1.0 (lam arg_1 (con unit ()))) +hash: 5224b11324c206181841f0dba49fffc3cb24ad95f9c4180dcdda89b3 Second -(program 1.1.0 - [(lam fromUnit_3 - [(lam main_1 main_1) - (lam arg_2 [(lam match_4 [fromUnit_3 (con unit ())]) arg_2])]) - (lam value_5 value_5)]) -hash: 8bb518b53c5d1bbc8c352c36a71bc423e1dbe7307db5f984939c158b +(program 1.1.0 (lam arg_1 (con unit ()))) +hash: 186e32faa80a26810392fda6d559c7ed4721a65ce1c9d4ef3e1c87b4 diff --git a/crates/nash-driver/tests/snapshots/build__source_dependency_compiles_to_roundtrippable_script.snap b/crates/nash-driver/tests/snapshots/build__source_dependency_compiles_to_roundtrippable_script.snap index 3b43e6dd..c51dbc46 100644 --- a/crates/nash-driver/tests/snapshots/build__source_dependency_compiles_to_roundtrippable_script.snap +++ b/crates/nash-driver/tests/snapshots/build__source_dependency_compiles_to_roundtrippable_script.snap @@ -2,10 +2,4 @@ source: crates/nash-driver/tests/build.rs description: "module Helper exposing (identity)\nidentity x = x\n\nvalidator module Main exposing (main)\nimport Helper\nmain : Data -> unit\nmain _ = Helper.identity ()\n" --- -(program 1.1.0 - [(lam identity_3 - [(lam fromUnit_4 - [(lam main_1 main_1) - (lam arg_2 [(lam match_5 [identity_3 [fromUnit_4 (con unit ())]]) arg_2])]) - (lam value_7 value_7)]) - (lam x_6 x_6)]) +(program 1.1.0 (lam arg_1 (con unit ()))) diff --git a/crates/nash-driver/tests/snapshots/build__unconstrained_validator_input_uses_data.snap b/crates/nash-driver/tests/snapshots/build__unconstrained_validator_input_uses_data.snap index 32f92c02..fefcabfc 100644 --- a/crates/nash-driver/tests/snapshots/build__unconstrained_validator_input_uses_data.snap +++ b/crates/nash-driver/tests/snapshots/build__unconstrained_validator_input_uses_data.snap @@ -2,8 +2,4 @@ source: crates/nash-driver/tests/build.rs description: "validator module Main exposing (main)\nmain : 'a -> unit\nmain _ = ()\n" --- -(program 1.1.0 - [(lam fromUnit_3 - [(lam main_1 main_1) - (lam arg_2 [(lam match_4 [fromUnit_3 (con unit ())]) arg_2])]) - (lam value_5 value_5)]) +(program 1.1.0 (lam arg_1 (con unit ()))) diff --git a/crates/nash-driver/tests/snapshots/production__dependency_validators_are_not_emitted_and_selected_roots_keep_their_target.snap b/crates/nash-driver/tests/snapshots/production__dependency_validators_are_not_emitted_and_selected_roots_keep_their_target.snap index 250822ac..1ed938d3 100644 --- a/crates/nash-driver/tests/snapshots/production__dependency_validators_are_not_emitted_and_selected_roots_keep_their_target.snap +++ b/crates/nash-driver/tests/snapshots/production__dependency_validators_are_not_emitted_and_selected_roots_keep_their_target.snap @@ -2,8 +2,4 @@ source: crates/nash-driver/tests/production.rs description: "validator module Main exposing (main)\nimport Dependency\nmain : Data -> unit\nmain value = Dependency.main value\n\nvalidator module Dependency exposing (main)\nmain : Data -> unit\nmain _ = ()\n" --- -(program 1.1.0 - [(lam fromUnit_5 - [(lam main_3 [(lam main_1 main_1) (lam value_2 [main_3 value_2])]) - (lam arg_4 [(lam match_6 [fromUnit_5 (con unit ())]) arg_4])]) - (lam value_7 value_7)]) +(program 1.1.0 (lam value_1 (con unit ()))) diff --git a/crates/nash-driver/tests/snapshots/production__production_excludes_test_blocks_and_their_imports.snap b/crates/nash-driver/tests/snapshots/production__production_excludes_test_blocks_and_their_imports.snap index cbc16db2..dfe07951 100644 --- a/crates/nash-driver/tests/snapshots/production__production_excludes_test_blocks_and_their_imports.snap +++ b/crates/nash-driver/tests/snapshots/production__production_excludes_test_blocks_and_their_imports.snap @@ -2,10 +2,4 @@ source: crates/nash-driver/tests/production.rs description: "module Helper exposing (identity)\nidentity x = x\ntests\n import TestOnlyMissing\n test \"helper\" = do\n assert undefinedTestName\n\nvalidator module Main exposing (main)\nimport Helper\nmain : Data -> unit\nmain _ = Helper.identity ()\ntests\n import MissingGenerator\n test \"main\" = do\n assert anotherUndefinedName\n" --- -(program 1.1.0 - [(lam identity_3 - [(lam fromUnit_4 - [(lam main_1 main_1) - (lam arg_2 [(lam match_5 [identity_3 [fromUnit_4 (con unit ())]]) arg_2])]) - (lam value_7 value_7)]) - (lam x_6 x_6)]) +(program 1.1.0 (lam arg_1 (con unit ()))) diff --git a/crates/nash-ir/src/analysis.rs b/crates/nash-ir/src/analysis.rs index de556fb1..fc8b482f 100644 --- a/crates/nash-ir/src/analysis.rs +++ b/crates/nash-ir/src/analysis.rs @@ -71,114 +71,117 @@ impl<'a> Collector<'a> { self.scope.push(id); } - fn within(&mut self, boundary: Boundary, body: &Core<'a>) { - self.boundaries.push(boundary); - self.visit(body); - self.boundaries.pop(); - } - fn visit(&mut self, core: &Core<'a>) { - let node = self.next_node; - self.next_node += 1; - let depth = self.scope.len(); - match &core.kind { - CoreKind::Var(name) => { - let binding = self - .scope - .iter() - .rev() - .copied() - .find(|&id| self.report.bindings[id].name.unique == name.unique); - self.report.uses.push(Occurrence { - name: *name, - binding, - node, - scope: self.scope.clone(), - execution_scope: self.boundaries.clone(), - }); - } - CoreKind::Lam { params, body } => { - if params.is_empty() { - self.visit(body); - } else { - self.boundaries.push(Boundary::Lambda(node)); - for p in *params { - self.bind(*p); - } - self.visit(body); - self.boundaries.pop(); + enum Task<'t, 'a> { + Visit(&'t Core<'a>), + Bind(Binder<'a>), + Boundary(Boundary), + Restore(usize, usize), + } + let mut pending = vec![Task::Visit(core)]; + let mut children = Vec::new(); + while let Some(task) = pending.pop() { + let core = match task { + Task::Visit(core) => core, + Task::Bind(binder) => { + self.bind(binder); + continue; } - } - CoreKind::Let { - binder, - value, - body, - } => { - self.visit(value); - self.bind(*binder); - self.visit(body); - } - CoreKind::LetRec { binders, body } => { - for rb in *binders { - self.bind(rb.binder); + Task::Boundary(boundary) => { + self.boundaries.push(boundary); + continue; } - let group_depth = self.scope.len(); - for (index, rb) in binders.iter().enumerate() { - self.boundaries - .push(Boundary::RecursiveBody { node, index }); - for p in rb.params { - self.bind(*p); - } - self.visit(rb.body); - self.boundaries.pop(); - self.scope.truncate(group_depth); + Task::Restore(scope, boundaries) => { + self.scope.truncate(scope); + self.boundaries.truncate(boundaries); + continue; } - self.visit(body); - } - CoreKind::Case { - scrutinee, - branches, - default, - .. - } => { - self.visit(scrutinee); - for (index, branch) in branches.iter().enumerate() { - self.boundaries.push(Boundary::Branch { + }; + let node = self.next_node; + self.next_node += 1; + let depth = self.scope.len(); + let boundaries = self.boundaries.len(); + pending.push(Task::Restore(depth, boundaries)); + match &core.kind { + CoreKind::Var(name) => { + let binding = self + .scope + .iter() + .rev() + .copied() + .find(|&id| self.report.bindings[id].name.unique == name.unique); + self.report.uses.push(Occurrence { + name: *name, + binding, node, - index: Some(index), + scope: self.scope.clone(), + execution_scope: self.boundaries.clone(), }); - for p in branch.binders { - self.bind(*p); + } + CoreKind::Lam { params, body } => { + if !params.is_empty() { + self.boundaries.push(Boundary::Lambda(node)); + } + for param in *params { + self.bind(*param); } - self.visit(branch.body); - self.boundaries.pop(); - self.scope.truncate(depth); + pending.push(Task::Visit(body)); } - if let Some(body) = default { - self.within(Boundary::Branch { node, index: None }, body); + CoreKind::Let { + binder, + value, + body, + } => { + pending.push(Task::Visit(body)); + pending.push(Task::Bind(*binder)); + pending.push(Task::Visit(value)); } - } - CoreKind::App { func, args } => { - self.visit(func); - for arg in *args { - self.visit(arg); + CoreKind::LetRec { binders, body } => { + for rb in *binders { + self.bind(rb.binder); + } + let group_depth = self.scope.len(); + pending.push(Task::Visit(body)); + for (index, rb) in binders.iter().enumerate().rev() { + pending.push(Task::Restore(group_depth, boundaries)); + pending.push(Task::Visit(rb.body)); + pending.extend(rb.params.iter().rev().map(|p| Task::Bind(*p))); + pending.push(Task::Boundary(Boundary::RecursiveBody { node, index })); + } } - } - CoreKind::Constr { fields: args, .. } | CoreKind::Builtin { args, .. } => { - for arg in *args { - self.visit(arg); + CoreKind::Case { + scrutinee, + branches, + default, + .. + } => { + if let Some(body) = default { + pending.push(Task::Restore(depth, boundaries)); + pending.push(Task::Visit(body)); + pending.push(Task::Boundary(Boundary::Branch { node, index: None })); + } + for (index, branch) in branches.iter().enumerate().rev() { + pending.push(Task::Restore(depth, boundaries)); + pending.push(Task::Visit(branch.body)); + pending.extend(branch.binders.iter().rev().map(|p| Task::Bind(*p))); + pending.push(Task::Boundary(Boundary::Branch { + node, + index: Some(index), + })); + } + pending.push(Task::Visit(scrutinee)); + } + CoreKind::Delay(body) => { + self.boundaries.push(Boundary::Delay(node)); + pending.push(Task::Visit(body)); + } + _ => { + children.clear(); + core.push_children_reversed(&mut children); + pending.extend(children.iter().map(|child| Task::Visit(child))); } } - CoreKind::Field { record, .. } => self.visit(record), - CoreKind::Trace { message, body } => { - self.visit(message); - self.visit(body); - } - CoreKind::Delay(body) => self.within(Boundary::Delay(node), body), - CoreKind::Force(body) => self.visit(body), - CoreKind::Lit(_) | CoreKind::Error => {} } - self.scope.truncate(depth); } } @@ -187,22 +190,27 @@ impl<'a> Collector<'a> { /// in the surrounding environment. Does not prove duplication or motion safe. /// Saturated builtins and arbitrary calls are deliberately not evaluated here. pub fn safe_to_discard(core: &Core<'_>) -> bool { - match &core.kind { - CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Delay(_) => true, - CoreKind::Lam { params, body } => !params.is_empty() || safe_to_discard(body), - CoreKind::Builtin { func, args } => { - args.len() < func.arity() && args.iter().all(|a| safe_to_discard(a)) + let mut pending = vec![core]; + while let Some(core) = pending.pop() { + match &core.kind { + CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Delay(_) => {} + CoreKind::Lam { params, body } => { + if params.is_empty() { + pending.push(body); + } + } + CoreKind::Builtin { func, args } if args.len() < func.arity() => { + pending.extend(args.iter().rev().copied()) + } + CoreKind::Constr { fields, .. } => pending.extend(fields.iter().rev().copied()), + CoreKind::Let { value, body, .. } => { + pending.push(body); + pending.push(value); + } + _ => return false, } - CoreKind::Constr { fields, .. } => fields.iter().all(|a| safe_to_discard(a)), - CoreKind::Let { value, body, .. } => safe_to_discard(value) && safe_to_discard(body), - CoreKind::App { .. } - | CoreKind::LetRec { .. } - | CoreKind::Case { .. } - | CoreKind::Field { .. } - | CoreKind::Trace { .. } - | CoreKind::Error - | CoreKind::Force(_) => false, } + true } /// Structural size only. Counts repeated subtree occurrences, includes LetRec, @@ -232,87 +240,89 @@ pub fn size_estimate(core: &Core<'_>) -> CoreSize { /// Free runtime names in deterministic source traversal order. Name identity /// follows the unique number, exactly as UPLC De Bruijn conversion does. pub fn free_variables<'a>(core: &Core<'a>) -> Vec> { + enum Task<'t, 'a> { + Visit(&'t Core<'a>), + Bind(u32), + Restore(usize), + } + let mut pending = vec![Task::Visit(core)]; + let mut scope = Vec::new(); + let mut seen = HashSet::new(); let mut result = Vec::new(); - free(core, &mut Vec::new(), &mut HashSet::new(), &mut result); - result -} -fn free<'a>( - core: &Core<'a>, - scope: &mut Vec, - seen: &mut HashSet, - out: &mut Vec>, -) { - let depth = scope.len(); - match &core.kind { - CoreKind::Var(name) => { - if !scope.contains(&name.unique) && seen.insert(name.unique) { - out.push(*name); + let mut children = Vec::new(); + while let Some(task) = pending.pop() { + let core = match task { + Task::Visit(core) => core, + Task::Bind(id) => { + scope.push(id); + continue; } - } - CoreKind::Lam { params, body } => { - scope.extend(params.iter().map(|p| p.name.unique)); - free(body, scope, seen, out); - } - CoreKind::App { func, args } => { - free(func, scope, seen, out); - for arg in *args { - free(arg, scope, seen, out); + Task::Restore(depth) => { + scope.truncate(depth); + continue; } - } - CoreKind::Let { - binder, - value, - body, - } => { - free(value, scope, seen, out); - scope.push(binder.name.unique); - free(body, scope, seen, out); - } - CoreKind::LetRec { binders, body } => { - scope.extend(binders.iter().map(|rb| rb.binder.name.unique)); - let group_depth = scope.len(); - for rb in *binders { - scope.extend(rb.params.iter().map(|p| p.name.unique)); - free(rb.body, scope, seen, out); - scope.truncate(group_depth); + }; + let depth = scope.len(); + pending.push(Task::Restore(depth)); + match &core.kind { + CoreKind::Var(name) => { + if !scope.contains(&name.unique) && seen.insert(name.unique) { + result.push(*name); + } } - free(body, scope, seen, out); - } - CoreKind::Case { - scrutinee, - branches, - default, - .. - } => { - free(scrutinee, scope, seen, out); - for branch in *branches { - scope.extend(branch.binders.iter().map(|p| p.name.unique)); - free(branch.body, scope, seen, out); - scope.truncate(depth); + CoreKind::Lam { params, body } => { + scope.extend(params.iter().map(|p| p.name.unique)); + pending.push(Task::Visit(body)); + } + CoreKind::Let { + binder, + value, + body, + } => { + pending.push(Task::Visit(body)); + pending.push(Task::Bind(binder.name.unique)); + pending.push(Task::Visit(value)); } - if let Some(body) = default { - free(body, scope, seen, out); + CoreKind::LetRec { binders, body } => { + scope.extend(binders.iter().map(|b| b.binder.name.unique)); + let group_depth = scope.len(); + pending.push(Task::Visit(body)); + for rb in binders.iter().rev() { + pending.push(Task::Restore(group_depth)); + pending.push(Task::Visit(rb.body)); + pending.extend(rb.params.iter().rev().map(|p| Task::Bind(p.name.unique))); + } } - } - CoreKind::Constr { fields, .. } => { - for field in *fields { - free(field, scope, seen, out); + CoreKind::Case { + scrutinee, + branches, + default, + .. + } => { + if let Some(body) = default { + pending.push(Task::Visit(body)); + } + for branch in branches.iter().rev() { + pending.push(Task::Restore(depth)); + pending.push(Task::Visit(branch.body)); + pending.extend( + branch + .binders + .iter() + .rev() + .map(|p| Task::Bind(p.name.unique)), + ); + } + pending.push(Task::Visit(scrutinee)); } - } - CoreKind::Builtin { args, .. } => { - for arg in *args { - free(arg, scope, seen, out); + _ => { + children.clear(); + core.push_children_reversed(&mut children); + pending.extend(children.iter().map(|child| Task::Visit(child))); } } - CoreKind::Field { record, .. } => free(record, scope, seen, out), - CoreKind::Trace { message, body } => { - free(message, scope, seen, out); - free(body, scope, seen, out); - } - CoreKind::Delay(body) | CoreKind::Force(body) => free(body, scope, seen, out), - CoreKind::Lit(_) | CoreKind::Error => {} } - scope.truncate(depth); + result } #[cfg(test)] diff --git a/crates/nash-ir/src/anf.rs b/crates/nash-ir/src/anf.rs index 6a4507fb..2b5d9d6b 100644 --- a/crates/nash-ir/src/anf.rs +++ b/crates/nash-ir/src/anf.rs @@ -131,7 +131,6 @@ impl<'a> Normalizer<'_, 'a> { } } fn atom(&mut self, value: &'a Core<'a>, prefix: &mut Vec>) -> &'a Core<'a> { - let value = self.term(value); let value = self.peel(value, prefix); if is_atom(value) { return value; @@ -166,120 +165,109 @@ impl<'a> Normalizer<'_, 'a> { } } fn term(&mut self, core: &'a Core<'a>) -> &'a Core<'a> { + struct State<'a> { + core: &'a Core<'a>, + inputs: Vec<&'a Core<'a>>, + index: usize, + values: Vec<&'a Core<'a>>, + prefix: Vec>, + } + enum Task<'a> { + Visit(&'a Core<'a>), + Step(State<'a>), + Resume(State<'a>, bool), + } let b = self.build; - let mut prefix = Vec::new(); - let kind = match core.kind { - CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error => return core, - CoreKind::Lam { params, body } => { - let body = self.term(body); - if params.is_empty() { - return b.with_type(body, core.ty); + let mut pending = vec![Task::Visit(core)]; + let mut results = Vec::new(); + while let Some(task) = pending.pop() { + match task { + Task::Visit(core) => { + if matches!( + core.kind, + CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error + ) { + results.push(core); + continue; + } + let mut inputs = Vec::new(); + core.push_children_reversed(&mut inputs); + inputs.reverse(); + pending.push(Task::Step(State { + core, + inputs, + index: 0, + values: Vec::new(), + prefix: Vec::new(), + })); } - CoreKind::Lam { params, body } - } - CoreKind::Delay(body) => CoreKind::Delay(self.term(body)), - CoreKind::Force(body) => CoreKind::Force(self.atom(body, &mut prefix)), - CoreKind::App { func, args } => { - if args.is_empty() { - return b.with_type(self.term(func), core.ty); + Task::Resume(mut state, atom) => { + let mut value = results.pop().unwrap(); + if atom { + value = self.atom(value, &mut state.prefix); + } + if let CoreKind::Let { binder, .. } = state.core.kind + && state.index == 0 + { + value = self.peel(value, &mut state.prefix); + state.prefix.push(Prefix::Let(binder, value)); + } + state.values.push(value); + state.index += 1; + pending.push(Task::Step(state)); } - let mut func = self.atom(func, &mut prefix); - let mut pending: Vec<&'a Core<'a>> = Vec::new(); - for arg in args { - // Applying the prefix may fail, trace or diverge. It must - // run before evaluating the next non-value argument. - if !is_atom(arg) && !pending.is_empty() { - let mut ty = func.ty; - for previous in &pending { - ty = self.applied_type(ty, previous); + Task::Step(mut state) => { + if let Some(&input) = state.inputs.get(state.index) { + let atom = match state.core.kind { + CoreKind::App { args, .. } => !args.is_empty(), + CoreKind::Builtin { .. } + | CoreKind::Constr { .. } + | CoreKind::Field { .. } + | CoreKind::Force(_) => true, + CoreKind::Case { .. } | CoreKind::Trace { .. } => state.index == 0, + _ => false, + }; + if matches!(state.core.kind, CoreKind::App { .. }) + && state.index > 1 + && !is_atom(input) + && state.values.len() > 1 + { + let mut ty = state.values[0].ty; + for arg in &state.values[1..] { + ty = self.applied_type(ty, arg); + } + let func = self.atom( + b.app(state.values[0], &state.values[1..], ty), + &mut state.prefix, + ); + state.values.clear(); + state.values.push(func); } - func = self.atom(b.app(func, &pending, ty), &mut prefix); - pending.clear(); + pending.push(Task::Resume(state, atom)); + pending.push(Task::Visit(input)); + } else { + let core = state.core; + let result = match core.kind { + CoreKind::Lam { params: [], .. } | CoreKind::App { args: [], .. } => { + b.with_type(state.values[0], core.ty) + } + CoreKind::App { .. } => { + b.app(state.values[0], &state.values[1..], core.ty) + } + CoreKind::Let { .. } => b.with_type(state.values[1], core.ty), + _ => crate::traverse::rebuild( + b, + core, + &mut state.values.into_iter(), + &mut |_| None, + ), + }; + results.push(self.finish(state.prefix, result)); } - pending.push(self.atom(arg, &mut prefix)); - } - return self.finish(prefix, b.app(func, &pending, core.ty)); - } - CoreKind::Let { - binder, - value, - body, - } => { - let value = self.term(value); - let value = self.peel(value, &mut prefix); - prefix.push(Prefix::Let(binder, value)); - let body = b.with_type(self.term(body), core.ty); - return self.finish(prefix, body); - } - CoreKind::LetRec { binders, body } => { - let binders: Vec<_> = binders - .iter() - .map(|rec| RecBinder { - body: self.term(rec.body), - ..*rec - }) - .collect(); - CoreKind::LetRec { - binders: b.arena.alloc_slice_copy(&binders), - body: self.term(body), - } - } - CoreKind::Builtin { func, args } => { - // A known builtin cannot execute until saturation. Earlier - // applications only collect arguments, so operands can be named - // left-to-right without introducing partial builtin bindings. - let args: Vec<_> = args.iter().map(|arg| self.atom(arg, &mut prefix)).collect(); - CoreKind::Builtin { - func, - args: b.arena.alloc_slice_copy(&args), - } - } - CoreKind::Constr { tag, fields } => { - let fields: Vec<_> = fields - .iter() - .map(|field| self.atom(field, &mut prefix)) - .collect(); - CoreKind::Constr { - tag, - fields: b.arena.alloc_slice_copy(&fields), - } - } - CoreKind::Field { - record, - index, - arity, - } => CoreKind::Field { - record: self.atom(record, &mut prefix), - index, - arity, - }, - CoreKind::Case { - kind, - scrutinee, - branches, - default, - } => { - let scrutinee = self.atom(scrutinee, &mut prefix); - let branches: Vec<_> = branches - .iter() - .map(|branch| Branch { - body: self.term(branch.body), - ..*branch - }) - .collect(); - CoreKind::Case { - kind, - scrutinee, - branches: b.arena.alloc_slice_copy(&branches), - default: default.map(|body| self.term(body)), } } - CoreKind::Trace { message, body } => CoreKind::Trace { - message: self.atom(message, &mut prefix), - body: self.term(body), - }, - }; - self.finish(prefix, b.alloc(core.ty, kind)) + } + results.pop().unwrap() } } diff --git a/crates/nash-ir/src/beta.rs b/crates/nash-ir/src/beta.rs index 64caf87e..bec43893 100644 --- a/crates/nash-ir/src/beta.rs +++ b/crates/nash-ir/src/beta.rs @@ -86,17 +86,21 @@ fn splice<'a>( value: &'a Core<'a>, finish: &mut impl FnMut(&'a Core<'a>) -> &'a Core<'a>, ) -> &'a Core<'a> { - match value.kind { - CoreKind::Let { - binder, - value: rhs, - body, - } => b.let_(binder, rhs, splice(b, b.with_type(body, value.ty), finish)), - CoreKind::LetRec { binders, body } => { - b.let_rec(binders, splice(b, b.with_type(body, value.ty), finish)) - } - _ => finish(value), + let mut frames = Vec::new(); + let mut value = value; + while let CoreKind::Let { body, .. } | CoreKind::LetRec { body, .. } = value.kind { + frames.push(value); + value = b.with_type(body, value.ty); + } + let mut result = finish(value); + for frame in frames.into_iter().rev() { + result = match frame.kind { + CoreKind::Let { binder, value, .. } => b.let_(binder, value, result), + CoreKind::LetRec { binders, .. } => b.let_rec(binders, result), + _ => unreachable!(), + }; } + result } #[cfg(test)] diff --git a/crates/nash-ir/src/beta/tests.rs b/crates/nash-ir/src/beta/tests.rs index a4a48ac7..0b7445d5 100644 --- a/crates/nash-ir/src/beta/tests.rs +++ b/crates/nash-ir/src/beta/tests.rs @@ -74,8 +74,8 @@ fn oversaturation_exposes_more_than_one_round() { let core = b.app(f, &[b.int(1), b.int(2), b.int(42)], INT); let first = reduce(&b, crate::propagate::propagate(&b, core)); let second = reduce(&b, crate::propagate::propagate(&b, first)); - assert_ne!(pretty(second), pretty(simplify(&b, core))); assert_optimization_snapshot!(&b, core); + assert_ne!(pretty(second), pretty(simplify(&b, core))); } #[test] fn beta_splices_nested_rhs_and_preserves_strict_computation() { diff --git a/crates/nash-ir/src/core.rs b/crates/nash-ir/src/core.rs index 44fd76c1..db1e73fa 100644 --- a/crates/nash-ir/src/core.rs +++ b/crates/nash-ir/src/core.rs @@ -137,27 +137,31 @@ impl<'a> Core<'a> { /// arguments, binding values then continuation, scrutinee then branches /// then default. Shared subtrees are visited once per occurrence. pub fn walk<'tree>(&'tree self, f: &mut impl FnMut(&'tree Core<'a>)) { - f(self); + let mut pending = vec![self]; + while let Some(node) = pending.pop() { + f(node); + node.push_children_reversed(&mut pending); + } + } + + /// Schedule children for a LIFO work list in the same order as `walk`. + pub fn push_children_reversed<'tree>(&'tree self, pending: &mut Vec<&'tree Core<'a>>) { match &self.kind { CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error => {} CoreKind::Lam { body, .. } | CoreKind::Delay(body) | CoreKind::Force(body) => { - body.walk(f) + pending.push(body) } CoreKind::App { func, args } => { - func.walk(f); - for arg in *args { - arg.walk(f); - } + pending.extend(args.iter().rev().copied()); + pending.push(func); } CoreKind::Let { value, body, .. } => { - value.walk(f); - body.walk(f); + pending.push(body); + pending.push(value); } CoreKind::LetRec { binders, body } => { - for binder in *binders { - binder.body.walk(f); - } - body.walk(f); + pending.push(body); + pending.extend(binders.iter().rev().map(|b| b.body)); } CoreKind::Case { scrutinee, @@ -165,28 +169,16 @@ impl<'a> Core<'a> { default, .. } => { - scrutinee.walk(f); - for branch in *branches { - branch.body.walk(f); - } - if let Some(body) = default { - body.walk(f); - } - } - CoreKind::Constr { fields, .. } => { - for field in *fields { - field.walk(f); - } - } - CoreKind::Builtin { args, .. } => { - for arg in *args { - arg.walk(f); - } + pending.extend(*default); + pending.extend(branches.iter().rev().map(|b| b.body)); + pending.push(scrutinee); } - CoreKind::Field { record, .. } => record.walk(f), + CoreKind::Constr { fields, .. } => pending.extend(fields.iter().rev().copied()), + CoreKind::Builtin { args, .. } => pending.extend(args.iter().rev().copied()), + CoreKind::Field { record, .. } => pending.push(record), CoreKind::Trace { message, body } => { - message.walk(f); - body.walk(f); + pending.push(body); + pending.push(message); } } } diff --git a/crates/nash-ir/src/hygiene.rs b/crates/nash-ir/src/hygiene.rs index 541eecbc..bc247003 100644 --- a/crates/nash-ir/src/hygiene.rs +++ b/crates/nash-ir/src/hygiene.rs @@ -49,7 +49,7 @@ pub fn validate<'a>(core: &Core<'a>, external: &[Name<'a>]) -> Result<(), Vec(build: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { - Rewriter::new(build, &[core]).term(core, &HashMap::new(), None) + Rewriter::new(build, &[core]).term(core, None) } /// Replace free occurrences of `target` with `replacement`. Binders in both the @@ -69,11 +69,7 @@ pub fn substitute<'a>( target: u32, replacement: &'a Core<'a>, ) -> &'a Core<'a> { - Rewriter::new(build, &[core, replacement]).term( - core, - &HashMap::new(), - Some((target, replacement)), - ) + Rewriter::new(build, &[core, replacement]).term(core, Some((target, replacement))) } struct Rewriter<'b, 'a> { @@ -130,139 +126,288 @@ impl<'b, 'a> Rewriter<'b, 'a> { self.build.arena.alloc_slice_copy(&binders) } - fn terms( - &mut self, - terms: &[&'a Core<'a>], - scope: &HashMap>, - substitution: Option<(u32, &'a Core<'a>)>, - ) -> Vec<&'a Core<'a>> { - terms - .iter() - .map(|t| self.term(t, scope, substitution)) - .collect() - } - fn term( &mut self, - core: &'a Core<'a>, - scope: &HashMap>, + root: &'a Core<'a>, substitution: Option<(u32, &'a Core<'a>)>, ) -> &'a Core<'a> { + enum Task<'a> { + Visit(&'a Core<'a>, Option<(u32, &'a Core<'a>)>), + Finish(&'a Core<'a>, usize), + LetBody(&'a Core<'a>, usize, Option<(u32, &'a Core<'a>)>), + Restore(HashMap>), + Retype(crate::ty::Ty<'a>), + RecNext { + core: &'a Core<'a>, + names: Vec>, + recs: Vec>, + sub: Option<(u32, &'a Core<'a>)>, + }, + RecBody { + core: &'a Core<'a>, + names: Vec>, + recs: Vec>, + params: &'a [Binder<'a>], + sub: Option<(u32, &'a Core<'a>)>, + }, + RecFinish { + core: &'a Core<'a>, + recs: Vec>, + }, + CaseNext { + core: &'a Core<'a>, + scrutinee: Option<&'a Core<'a>>, + branches: Vec>, + sub: Option<(u32, &'a Core<'a>)>, + }, + CaseBody { + core: &'a Core<'a>, + scrutinee: &'a Core<'a>, + branches: Vec>, + binders: &'a [Binder<'a>], + sub: Option<(u32, &'a Core<'a>)>, + }, + CaseFinish { + core: &'a Core<'a>, + scrutinee: &'a Core<'a>, + branches: Vec>, + }, + } let b = self.build; - let rewritten = match &core.kind { - CoreKind::Var(name) => { - if let Some(renamed) = scope.get(&name.unique) { - return b.var(*renamed, core.ty); + let mut scope = HashMap::new(); + let mut pending = vec![Task::Visit(root, substitution)]; + let mut results = Vec::new(); + let mut children = Vec::new(); + while let Some(task) = pending.pop() { + match task { + Task::Restore(previous) => scope = previous, + Task::Retype(ty) => { + let value = results.pop().unwrap(); + results.push(b.with_type(value, ty)); } - if let Some((target, replacement)) = substitution - && name.unique == target - { - let replacement = self.term(replacement, &HashMap::new(), None); - return b.with_type(replacement, core.ty); + Task::Finish(core, start) => { + let rebuilt = + crate::traverse::rebuild(b, core, &mut results.drain(start..), &mut |_| { + None + }); + results.push(rebuilt); } - core - } - CoreKind::Lit(_) | CoreKind::Error => core, - CoreKind::Lam { params, body } => { - let mut inner = scope.clone(); - let params = self.binders(params, &mut inner); - let body = self.term(body, &inner, substitution); - b.lam(params, body) - } - CoreKind::Let { - binder, - value, - body, - } => { - let value = self.term(value, scope, substitution); - let mut inner = scope.clone(); - let binder = self.binder(*binder, &mut inner); - let body = self.term(body, &inner, substitution); - b.let_(binder, value, body) - } - CoreKind::LetRec { binders, body } => { - let mut group = scope.clone(); - let names: Vec<_> = binders - .iter() - .map(|r| self.binder(r.binder, &mut group)) - .collect(); - let recs: Vec<_> = binders - .iter() - .zip(names) - .map(|(rec, binder)| { - let mut inner = group.clone(); - let params = self.binders(rec.params, &mut inner); - let body = self.term(rec.body, &inner, substitution); - RecBinder { - binder, + Task::LetBody(core, start, sub) => { + let CoreKind::Let { + binder, + value, + body, + } = core.kind + else { + unreachable!() + }; + let previous = scope.clone(); + let binder = self.binder(binder, &mut scope); + pending.push(Task::Restore(previous)); + pending.push(Task::Finish( + b.alloc( + core.ty, + CoreKind::Let { + binder, + value, + body, + }, + ), + start, + )); + pending.push(Task::Visit(body, sub)); + } + Task::RecNext { + core, + names, + recs, + sub, + } => { + let CoreKind::LetRec { binders, body } = core.kind else { + unreachable!() + }; + if recs.len() == binders.len() { + pending.push(Task::RecFinish { core, recs }); + pending.push(Task::Visit(body, sub)); + } else { + let rec = binders[recs.len()]; + let previous = scope.clone(); + let params = self.binders(rec.params, &mut scope); + pending.push(Task::RecBody { + core, + names, + recs, params, - body, - ..*rec + sub, + }); + pending.push(Task::Restore(previous)); + pending.push(Task::Visit(rec.body, sub)); + } + } + Task::RecBody { + core, + names, + mut recs, + params, + sub, + } => { + let CoreKind::LetRec { binders, .. } = core.kind else { + unreachable!() + }; + recs.push(RecBinder { + binder: names[recs.len()], + params, + body: results.pop().unwrap(), + ..binders[recs.len()] + }); + pending.push(Task::RecNext { + core, + names, + recs, + sub, + }); + } + Task::RecFinish { core, recs } => { + let body = results.pop().unwrap(); + results.push(b.with_type(b.let_rec(&recs, body), core.ty)); + } + Task::CaseNext { + core, + scrutinee, + branches, + sub, + } => { + let scrutinee = scrutinee.unwrap_or_else(|| results.pop().unwrap()); + let CoreKind::Case { + branches: original, + default, + .. + } = core.kind + else { + unreachable!() + }; + if branches.len() == original.len() { + pending.push(Task::CaseFinish { + core, + scrutinee, + branches, + }); + if let Some(body) = default { + pending.push(Task::Visit(body, sub)); } - }) - .collect(); - let body = self.term(body, &group, substitution); - b.let_rec(&recs, body) - } - CoreKind::Case { - kind, - scrutinee, - branches, - default, - } => { - let scrutinee = self.term(scrutinee, scope, substitution); - let branches: Vec<_> = branches - .iter() - .map(|branch| { - let mut inner = scope.clone(); - let binders = self.binders(branch.binders, &mut inner); - let body = self.term(branch.body, &inner, substitution); - Branch { + } else { + let branch = original[branches.len()]; + let previous = scope.clone(); + let binders = self.binders(branch.binders, &mut scope); + pending.push(Task::CaseBody { + core, + scrutinee, + branches, binders, - body, - ..*branch + sub, + }); + pending.push(Task::Restore(previous)); + pending.push(Task::Visit(branch.body, sub)); + } + } + Task::CaseBody { + core, + scrutinee, + mut branches, + binders, + sub, + } => { + let CoreKind::Case { + branches: original, .. + } = core.kind + else { + unreachable!() + }; + branches.push(Branch { + binders, + body: results.pop().unwrap(), + ..original[branches.len()] + }); + pending.push(Task::CaseNext { + core, + scrutinee: Some(scrutinee), + branches, + sub, + }); + } + Task::CaseFinish { + core, + scrutinee, + branches, + } => { + let CoreKind::Case { kind, default, .. } = core.kind else { + unreachable!() + }; + let default = default.map(|_| results.pop().unwrap()); + results.push(b.case(kind, scrutinee, &branches, default, core.ty)); + } + Task::Visit(core, sub) => match core.kind { + CoreKind::Var(name) => { + if let Some(renamed) = scope.get(&name.unique) { + results.push(b.var(*renamed, core.ty)); + } else if let Some((target, replacement)) = sub + && name.unique == target + { + pending.push(Task::Restore(std::mem::take(&mut scope))); + pending.push(Task::Retype(core.ty)); + pending.push(Task::Visit(replacement, None)); + } else { + results.push(core); } - }) - .collect(); - let default = default.map(|d| self.term(d, scope, substitution)); - b.case(*kind, scrutinee, &branches, default, core.ty) - } - CoreKind::App { func, args } => { - let func = self.term(func, scope, substitution); - let args = self.terms(args, scope, substitution); - b.app(func, &args, core.ty) - } - CoreKind::Constr { tag, fields } => { - let fields = self.terms(fields, scope, substitution); - b.constr(*tag, &fields, core.ty) - } - CoreKind::Builtin { func, args } => { - let args = self.terms(args, scope, substitution); - b.builtin(*func, &args, core.ty) - } - CoreKind::Field { - record, - index, - arity, - } => { - let record = self.term(record, scope, substitution); - b.field(record, *index, *arity, core.ty) - } - CoreKind::Trace { message, body } => { - let message = self.term(message, scope, substitution); - let body = self.term(body, scope, substitution); - b.trace(message, body) - } - CoreKind::Delay(body) => { - let body = self.term(body, scope, substitution); - b.delay(body) - } - CoreKind::Force(body) => { - let body = self.term(body, scope, substitution); - b.force(body, core.ty) + } + CoreKind::Lit(_) | CoreKind::Error => results.push(core), + CoreKind::Lam { params, body } => { + let previous = scope.clone(); + let params = self.binders(params, &mut scope); + pending.push(Task::Restore(previous)); + pending.push(Task::Finish( + b.alloc(core.ty, CoreKind::Lam { params, body }), + results.len(), + )); + pending.push(Task::Visit(body, sub)); + } + CoreKind::Let { value, .. } => { + pending.push(Task::LetBody(core, results.len(), sub)); + pending.push(Task::Visit(value, sub)); + } + CoreKind::LetRec { binders, .. } => { + let previous = scope.clone(); + let names = binders + .iter() + .map(|rec| self.binder(rec.binder, &mut scope)) + .collect(); + pending.push(Task::Restore(previous)); + pending.push(Task::RecNext { + core, + names, + recs: Vec::new(), + sub, + }); + } + CoreKind::Case { scrutinee, .. } => { + pending.push(Task::CaseNext { + core, + scrutinee: None, + branches: Vec::new(), + sub, + }); + pending.push(Task::Visit(scrutinee, sub)); + } + _ => { + pending.push(Task::Finish(core, results.len())); + children.clear(); + core.push_children_reversed(&mut children); + pending.extend(children.iter().map(|child| Task::Visit(child, sub))); + } + }, } - }; - b.with_type(rewritten, core.ty) + } + results.pop().unwrap() } } diff --git a/crates/nash-ir/src/inverse.rs b/crates/nash-ir/src/inverse.rs new file mode 100644 index 00000000..b04c5b95 --- /dev/null +++ b/crates/nash-ir/src/inverse.rs @@ -0,0 +1,248 @@ +//! Representation cancellation with runtime-shape evidence, independent of metadata. +use crate::{ + build::Builder, + core::{Core, CoreKind}, +}; +use nash_plutus::{ + builtin::DefaultFunction as F, constant::Constant as C, data::PlutusData as D, typ::Type, +}; +use std::collections::HashMap; + +type Bindings<'a> = HashMap>; + +#[derive(Clone, Copy)] +enum Shape { + Integer, + Bytes, + DataList, + DataMap, + String, + Utf8, + IData, + BData, + ListData, + MapData, +} + +// Evidence describes successful evaluation only. The expression itself is retained, +// including any failure, trace, or divergence. Type annotations are never evidence. +fn proves<'a>(mut core: &'a Core<'a>, shape: Shape, bindings: &Bindings<'a>) -> bool { + loop { + match core.kind { + CoreKind::Trace { body, .. } => core = body, + CoreKind::Var(name) => match bindings.get(&name.unique) { + Some(value) => core = value, + None => return false, + }, + _ => break, + } + } + match core.kind { + CoreKind::Lit(c) => match (shape, c) { + (Shape::Integer, C::Integer(_)) + | (Shape::Bytes, C::ByteString(_)) + | (Shape::String, C::String(_)) => true, + (Shape::Utf8, C::ByteString(bytes)) => std::str::from_utf8(bytes).is_ok(), + (Shape::DataList, C::ProtoList(Type::Data, items)) => { + items.iter().all(|item| matches!(item, C::Data(_))) + } + (Shape::DataMap, C::ProtoList(Type::Pair(Type::Data, Type::Data), items)) => { + items.iter().all(|item| { + matches!( + item, + C::ProtoPair(Type::Data, Type::Data, C::Data(_), C::Data(_)) + ) + }) + } + (Shape::IData, C::Data(D::Integer(_))) + | (Shape::BData, C::Data(D::ByteString(_))) + | (Shape::ListData, C::Data(D::List(_))) + | (Shape::MapData, C::Data(D::Map(_))) => true, + _ => false, + }, + CoreKind::Builtin { func, args } if args.len() == func.arity() => matches!( + (shape, func), + (Shape::Integer, F::UnIData) + | (Shape::Bytes, F::UnBData | F::EncodeUtf8) + | (Shape::DataList, F::UnListData) + | (Shape::DataMap, F::UnMapData) + | (Shape::String, F::DecodeUtf8) + | (Shape::Utf8, F::EncodeUtf8) + | (Shape::IData, F::IData) + | (Shape::BData, F::BData) + | (Shape::ListData, F::ListData) + | (Shape::MapData, F::MapData) + ), + _ => false, + } +} + +fn required(outer: F, inner: F) -> Option { + Some(match (outer, inner) { + (F::UnIData, F::IData) => Shape::Integer, + (F::UnBData, F::BData) => Shape::Bytes, + (F::UnListData, F::ListData) => Shape::DataList, + (F::UnMapData, F::MapData) => Shape::DataMap, + (F::DecodeUtf8, F::EncodeUtf8) => Shape::String, + (F::EncodeUtf8, F::DecodeUtf8) => Shape::Utf8, + (F::IData, F::UnIData) => Shape::IData, + (F::BData, F::UnBData) => Shape::BData, + (F::ListData, F::UnListData) => Shape::ListData, + (F::MapData, F::UnMapData) => Shape::MapData, + _ => return None, + }) +} + +fn resolve<'a>(mut core: &'a Core<'a>, bindings: &Bindings<'a>) -> &'a Core<'a> { + while let CoreKind::Var(name) = core.kind { + let Some(value) = bindings.get(&name.unique) else { + break; + }; + core = value; + } + core +} + +fn projection<'a>(core: &'a Core<'a>, func: F) -> Option<&'a Core<'a>> { + match core.kind { + CoreKind::Builtin { + func: actual, + args: [pair], + } if actual == func => Some(pair), + _ => None, + } +} + +// ConstrData has two operands, not a unary inverse. Only reuse already evaluated +// variables through retained producer bindings. Those bindings preserve tag-range, +// list-shape, and Data-variant checks, including when the selected field is unused. +fn constructor<'a>(core: &'a Core<'a>, bindings: &Bindings<'a>) -> Option<&'a Core<'a>> { + if let CoreKind::Builtin { + func: F::ConstrData, + args: [tag, fields], + } = core.kind + { + let left = projection(resolve(tag, bindings), F::FstPair)?; + let right = projection(resolve(fields, bindings), F::SndPair)?; + // Keep the decoder's strict binding; never discard two direct calls. + if !matches!(left.kind, CoreKind::Var(_)) + || !matches!(right.kind, CoreKind::Var(_)) + || !std::ptr::eq(resolve(left, bindings), resolve(right, bindings)) + { + return None; + } + let CoreKind::Builtin { + func: F::UnConstrData, + args: [data], + } = resolve(left, bindings).kind + else { + return None; + }; + return matches!(data.kind, CoreKind::Var(_)).then_some(data); + } + let CoreKind::Builtin { func, args: [pair] } = core.kind else { + return None; + }; + let index = match func { + F::FstPair => 0, + F::SndPair => 1, + _ => return None, + }; + let CoreKind::Builtin { + func: F::UnConstrData, + args: [data], + } = resolve(pair, bindings).kind + else { + return None; + }; + if !matches!(data.kind, CoreKind::Var(_)) { + return None; + } + let CoreKind::Builtin { + func: F::ConstrData, + args: [tag, fields], + } = resolve(data, bindings).kind + else { + return None; + }; + let value = [*tag, *fields][index]; + matches!(value.kind, CoreKind::Var(_)).then_some(value) +} + +/// Cancel representation round trips. Requires globally unique, scoped names. +/// Bound producers are reused only when their operand is a variable: no duplication, +/// new bindings, or movement of computations/literals across evaluation points. +/// Unary operands also require shape evidence. Keeping unknown operands unchanged +/// avoids extending their lifetimes and increasing Flat size on failing programs. +pub fn reduce<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let mut bindings = Bindings::new(); + core.walk(&mut |node| { + if let CoreKind::Let { binder, value, .. } = node.kind { + bindings.insert(binder.name.unique, value); + } + }); + core.map(b, &mut |node| { + if let Some(value) = constructor(node, &bindings) { + return Some(b.with_type(value, node.ty)); + } + let CoreKind::Builtin { + func: outer, + args: [wrapped], + } = node.kind + else { + return None; + }; + let producer = *wrapped; + let bound = matches!(producer.kind, CoreKind::Var(_)); + let producer = resolve(producer, &bindings); + let CoreKind::Builtin { + func: inner, + args: [value], + } = producer.kind + else { + return None; + }; + if bound && !matches!(value.kind, CoreKind::Var(_)) { + return None; + } + let shape = required(outer, inner)?; + proves(value, shape, &bindings).then(|| b.with_type(value, node.ty)) + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ty::Ty; + use nash_plutus::arena::Arena; + + #[test] + fn inconsistent_container_payloads_are_not_shape_evidence() { + let arena = Arena::new(); + let b = Builder::new(&arena); + let boolean = C::bool(&arena, false); + let wrong_pair = C::proto_pair(&arena, &Type::Data, &Type::Data, boolean, boolean); + for (encode, decode, constant) in [ + ( + F::ListData, + F::UnListData, + C::proto_list(&arena, &Type::Data, arena.alloc([boolean])), + ), + ( + F::MapData, + F::UnMapData, + C::proto_list( + &arena, + arena.alloc(Type::Pair(&Type::Data, &Type::Data)), + arena.alloc([wrong_pair]), + ), + ), + ] { + // These deliberately inconsistent constants can panic in the runtime. + // Check pass noninterference without executing malformed payloads. + let value = b.lit(constant); + let core = b.builtin(decode, &[b.builtin(encode, &[value], Ty::Erased)], value.ty); + assert!(std::ptr::eq(core, reduce(&b, core))); + } + } +} diff --git a/crates/nash-ir/src/known_case.rs b/crates/nash-ir/src/known_case.rs index 8a19f5a1..65c9534e 100644 --- a/crates/nash-ir/src/known_case.rs +++ b/crates/nash-ir/src/known_case.rs @@ -1,9 +1,10 @@ -//! Known-subject case folding: Boolean cleanup and pre-ANF native constructors. +//! Known-subject case and field folding with strict evaluation preserved. use crate::{ build::Builder, - core::{CaseKind, Core, CoreKind, Test}, + core::{Binder, Branch, CaseKind, Core, CoreKind, Test}, }; -use nash_plutus::constant::Constant; +use nash_plutus::{builtin::DefaultFunction, constant::Constant}; +use std::collections::{HashMap, HashSet}; /// No evaluation or substitution: the literal subject is already a value. /// Preserve malformed tables and missing matches for the lowerer/runtime. @@ -42,6 +43,46 @@ pub fn reduce_bool<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { }) } +/// Select native integer/byte literal branches without bypassing source Eq calls. +/// Validate the whole table before folding, including unselected branches. +pub fn reduce_literals<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + core.map(b, &mut |node| { + let CoreKind::Case { + kind, + scrutinee, + branches, + default, + } = node.kind + else { + return None; + }; + let subject = match (kind, scrutinee.kind) { + (CaseKind::Int, CoreKind::Lit(Constant::Integer(i))) => Test::Int(i), + (CaseKind::Bytes, CoreKind::Lit(Constant::ByteString(bs))) => Test::Bytes(bs), + _ => return None, + }; + let mut seen = Vec::new(); + let mut selected = None; + for branch in branches { + if !branch.binders.is_empty() || seen.contains(&branch.test) { + return None; + } + if !matches!( + (kind, branch.test), + (CaseKind::Int, Test::Int(_)) | (CaseKind::Bytes, Test::Bytes(_)) + ) { + return None; + } + seen.push(branch.test); + if branch.test == subject { + selected = Some(branch.body); + } + } + // A missing branch without a default retains the runtime failure. + Some(b.with_type(selected.or(default)?, node.ty)) + }) +} + /// Input binders must be globally unique and well scoped, as for beta reduction. /// Keep every field strict, in source order, even when its binder is unused. /// Leave invalid tables, absent tags and application arity mismatches untouched. @@ -59,23 +100,82 @@ pub fn reduce_constr<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { let CoreKind::Constr { tag, fields } = scrutinee.kind else { return None; }; - let mut seen = vec![false; branches.len()]; - for branch in branches { - let Test::Tag(tag) = branch.test else { - return None; - }; - let slot = seen.get_mut(usize::from(tag))?; - if *slot { - return None; - } - *slot = true; + let selected = select_constr(branches, tag, fields.len())?; + let mut body = selected.body; + for (&binder, &field) in selected.binders.iter().zip(fields).rev() { + body = b.let_(binder, field, body); + } + Some(b.with_type(body, node.ty)) + }) +} + +/// Fold matches and field accesses on let-bound constructors without moving field evaluation. +/// Requires ANF with globally unique, well-scoped binders and the same name supply. +/// Keep constructor bindings for escaping uses; ordinary cleanup removes dead ones. +/// Run binding-splice cleanup afterwards: a selected branch can contain lets. +/// Newly exposed aliases can enable another iteration with that cleanup. +pub fn reduce_bound_constr<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let facts = constructor_bindings(core); + let mut matched = HashSet::new(); + core.walk(&mut |node| { + if let Some((root, _, _)) = bound_match(node, &facts) { + matched.insert(root); + } + if let Some((root, _)) = bound_field(node, &facts) { + matched.insert(root); + } + }); + if matched.is_empty() { + return core; + } + // Give each field a stable reference at the original construction site. + // In particular, copying an ANF lambda/delay would duplicate its binders. + // Naming literals also leaves the existing propagation size policy in charge. + let named = core.map(b, &mut |node| { + let CoreKind::Let { + binder, + value, + body, + } = node.kind + else { + return None; + }; + if !matched.contains(&binder.name.unique) { + return None; } - let selected = branches + let CoreKind::Constr { tag, fields } = value.kind else { + return None; + }; + let mut bindings = Vec::new(); + let refs: Vec<_> = fields .iter() - .find(|branch| branch.test == Test::Tag(tag))?; - if selected.binders.len() != fields.len() { + .map(|&field| { + if matches!(field.kind, CoreKind::Var(_)) { + return field; + } + let binder = Binder { + name: b.fresh("field"), + ty: field.ty, + }; + bindings.push((binder, field)); + b.var(binder.name, binder.ty) + }) + .collect(); + if bindings.is_empty() { return None; } + let mut result = b.let_(binder, b.constr(tag, &refs, value.ty), body); + for (binder, field) in bindings.into_iter().rev() { + result = b.let_(binder, field, result); + } + Some(b.with_type(result, node.ty)) + }); + let facts = constructor_bindings(named); + named.map(b, &mut |node| { + if let Some((_, field)) = bound_field(node, &facts) { + return Some(b.with_type(field, node.ty)); + } + let (_, fields, selected) = bound_match(node, &facts)?; let mut body = selected.body; for (&binder, &field) in selected.binders.iter().zip(fields).rev() { body = b.let_(binder, field, body); @@ -83,3 +183,662 @@ pub fn reduce_constr<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { Some(b.with_type(body, node.ty)) }) } + +/// Fold known bindings and clean up newly exposed aliases to a fixed point. +/// Input has already passed the ordinary ANF cleanup; no normalization is repeated. +pub fn simplify_bound_constr<'a>(b: &Builder<'a>, mut core: &'a Core<'a>) -> &'a Core<'a> { + loop { + let next = crate::small_inline::simplify(b, reduce_bound_constr(b, core)); + if std::ptr::eq(core, next) { + return next; + } + core = next; + } +} + +type ConstructorBindings<'a> = HashMap)>; + +fn constructor_bindings<'a>(core: &'a Core<'a>) -> ConstructorBindings<'a> { + let mut facts = HashMap::new(); + // Preorder sees a lexical binding before its uses. Unique names let this + // table include captured values without a separate environment per scope. + core.walk(&mut |node| { + let CoreKind::Let { binder, value, .. } = node.kind else { + return; + }; + let fact = match value.kind { + CoreKind::Constr { .. } => Some((binder.name.unique, value)), + CoreKind::Var(name) => facts.get(&name.unique).copied(), + _ => None, + }; + if let Some(fact) = fact { + facts.insert(binder.name.unique, fact); + } + }); + facts +} + +fn bound_field<'a>( + node: &'a Core<'a>, + facts: &ConstructorBindings<'a>, +) -> Option<(u32, &'a Core<'a>)> { + let CoreKind::Field { + record, + index, + arity, + } = node.kind + else { + return None; + }; + let CoreKind::Var(name) = record.kind else { + return None; + }; + let &(root, value) = facts.get(&name.unique)?; + let CoreKind::Constr { tag: 0, fields } = value.kind else { + return None; + }; + // Field lowers to a single tag-zero branch with exactly `arity` lambdas. + // Too few fields leave a function; extra fields apply the selected value. + if index >= arity || fields.len() != usize::from(arity) { + return None; + } + Some((root, fields[usize::from(index)])) +} + +fn bound_match<'a>( + node: &'a Core<'a>, + facts: &ConstructorBindings<'a>, +) -> Option<(u32, &'a [&'a Core<'a>], &'a Branch<'a>)> { + let CoreKind::Case { + kind: CaseKind::Tag, + scrutinee, + branches, + default: None, + } = node.kind + else { + return None; + }; + let CoreKind::Var(name) = scrutinee.kind else { + return None; + }; + let &(root, value) = facts.get(&name.unique)?; + let CoreKind::Constr { tag, fields } = value.kind else { + return None; + }; + Some((root, fields, select_constr(branches, tag, fields.len())?)) +} + +fn select_constr<'a>(branches: &'a [Branch<'a>], tag: u16, arity: usize) -> Option<&'a Branch<'a>> { + let mut seen = vec![false; branches.len()]; + for branch in branches { + let Test::Tag(tag) = branch.test else { + return None; + }; + let slot = seen.get_mut(usize::from(tag))?; + if *slot { + return None; + } + *slot = true; + } + let selected = branches + .iter() + .find(|branch| branch.test == Test::Tag(tag))?; + (selected.binders.len() == arity).then_some(selected) +} + +/// Native-list folding on hygienic ANF. A successful MkCons proves Cons, +/// but its runtime operand checks must still run at the original construction. +/// Branch selection can expose lets; run ordinary cleanup before another pass. +pub fn reduce_list<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let facts = list_bindings(core); + let mut matched = HashSet::new(); + core.walk(&mut |node| { + if let Some((Some(root), _)) = list_subject(node, &facts) { + matched.insert(root); + } + }); + // Share derived literal fields as well as MkCons operands. This avoids + // serializing the same literal tail again for every match on one binding. + // Never copy operand subtrees: ANF lambdas/delays still contain binders. + let mut named_fields = HashMap::new(); + let named = core.map(b, &mut |node| { + let CoreKind::Let { + binder, + value, + body, + } = node.kind + else { + return None; + }; + if !matched.contains(&binder.name.unique) { + return None; + } + let fields = list_fields(b, value)?; + let mut bindings = Vec::new(); + let refs = fields.map(|field| { + if matches!(field.kind, CoreKind::Var(_)) { + return field; + } + let field_binder = Binder { + name: b.fresh("list_field"), + ty: field.ty, + }; + bindings.push((field_binder, field)); + b.var(field_binder.name, field_binder.ty) + }); + named_fields.insert(binder.name.unique, refs); + if bindings.is_empty() { + return None; + } + let value = if matches!(value.kind, CoreKind::Builtin { .. }) { + b.builtin(DefaultFunction::MkCons, &refs, value.ty) + } else { + value + }; + let mut result = b.let_(binder, value, body); + for (binder, value) in bindings.into_iter().rev() { + result = b.let_(binder, value, result); + } + Some(b.with_type(result, node.ty)) + }); + let facts = list_bindings(named); + named.map(b, &mut |node| { + let (root, value) = list_subject(node, &facts)?; + let CoreKind::Case { + branches, default, .. + } = node.kind + else { + return None; + }; + let (nil, cons) = list_arms(branches)?; + let fields = root + .and_then(|id| named_fields.get(&id).copied()) + .or_else(|| list_fields(b, value)); + let selected = if fields.is_some() { cons } else { nil }; + let fields = fields.as_ref().map_or(&[][..], |fields| fields.as_slice()); + let body = match selected { + Some(branch) => { + let mut body = branch.body; + for (&binder, &field) in branch.binders.iter().zip(fields).rev() { + body = b.let_(binder, field, body); + } + body + } + None => default.unwrap_or_else(|| b.error(node.ty)), + }; + Some(b.with_type(body, node.ty)) + }) +} + +fn list_fields<'a>(b: &Builder<'a>, value: &'a Core<'a>) -> Option<[&'a Core<'a>; 2]> { + match value.kind { + CoreKind::Lit(Constant::ProtoList(inner, values)) => { + let (head, tail) = values.split_first()?; + Some([ + b.lit(head), + b.lit(Constant::proto_list(b.arena, inner, tail)), + ]) + } + CoreKind::Builtin { + func: DefaultFunction::MkCons, + args: [head, tail], + } => Some([*head, *tail]), + _ => None, + } +} + +/// Fold known lists and constructors with cleanup; normalize only once upstream. +pub fn simplify_list<'a>(b: &Builder<'a>, mut core: &'a Core<'a>) -> &'a Core<'a> { + loop { + let next = crate::small_inline::simplify(b, reduce_list(b, core)); + let next = simplify_bound_constr(b, next); + if std::ptr::eq(core, next) { + return next; + } + core = next; + } +} + +type ListBindings<'a> = HashMap)>; +fn list_bindings<'a>(core: &'a Core<'a>) -> ListBindings<'a> { + let mut facts = HashMap::new(); + core.walk(&mut |node| { + let CoreKind::Let { binder, value, .. } = node.kind else { + return; + }; + let fact = match value.kind { + CoreKind::Lit(Constant::ProtoList(..)) + | CoreKind::Builtin { + func: DefaultFunction::MkCons, + args: [_, _], + } => Some((binder.name.unique, value)), + CoreKind::Var(name) => facts.get(&name.unique).copied(), + _ => None, + }; + if let Some(fact) = fact { + facts.insert(binder.name.unique, fact); + } + }); + facts +} +fn list_subject<'a>( + node: &'a Core<'a>, + facts: &ListBindings<'a>, +) -> Option<(Option, &'a Core<'a>)> { + let CoreKind::Case { + kind: CaseKind::List, + scrutinee, + branches, + .. + } = node.kind + else { + return None; + }; + list_arms(branches)?; + match scrutinee.kind { + CoreKind::Lit(Constant::ProtoList(..)) => Some((None, scrutinee)), + CoreKind::Var(name) => facts + .get(&name.unique) + .map(|&(root, value)| (Some(root), value)), + _ => None, + } +} +fn list_arms<'a>( + branches: &'a [Branch<'a>], +) -> Option<(Option<&'a Branch<'a>>, Option<&'a Branch<'a>>)> { + let (mut nil, mut cons) = (None, None); + for branch in branches { + match branch.test { + Test::Nil if nil.is_none() && branch.binders.is_empty() => nil = Some(branch), + Test::Cons if cons.is_none() && branch.binders.len() == 2 => cons = Some(branch), + _ => return None, + } + } + Some((nil, cons)) +} + +/// Literal Data folding on hygienic ANF. Constructor builtins are not facts. +/// Share unwrapped payloads at their original literal binding, as for list fields. +pub fn reduce_data<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let facts = data_bindings(core); + let mut matched = HashSet::new(); + core.walk(&mut |node| { + if let Some((Some(root), _)) = data_subject(node, &facts) { + matched.insert(root); + } + }); + let mut payloads = HashMap::new(); + let named = core.map(b, &mut |node| { + let CoreKind::Let { + binder, + value, + body, + } = node.kind + else { + return None; + }; + if !matched.contains(&binder.name.unique) { + return None; + } + let CoreKind::Lit(Constant::Data(data)) = value.kind else { + return None; + }; + let payload = b.lit(data_payload(b, data)); + let field = Binder { + name: b.fresh("data_payload"), + ty: payload.ty, + }; + payloads.insert(binder.name.unique, b.var(field.name, field.ty)); + Some(b.with_type(b.let_(field, payload, b.let_(binder, value, body)), node.ty)) + }); + let facts = data_bindings(named); + named.map(b, &mut |node| { + let (root, data) = data_subject(node, &facts)?; + let CoreKind::Case { + branches, default, .. + } = node.kind + else { + return None; + }; + let test = data_test(data); + let body = match branches.iter().find(|branch| branch.test == test) { + Some(branch) => { + let payload = root + .and_then(|id| payloads.get(&id).copied()) + .unwrap_or_else(|| b.lit(data_payload(b, data))); + b.let_(branch.binders[0], payload, branch.body) + } + None => default.unwrap_or_else(|| b.error(node.ty)), + }; + Some(b.with_type(body, node.ty)) + }) +} + +/// Fold known Data, lists and constructors with cleanup; normalize once upstream. +pub fn simplify_data<'a>(b: &Builder<'a>, mut core: &'a Core<'a>) -> &'a Core<'a> { + loop { + let next = simplify_list(b, reduce_data(b, core)); + if std::ptr::eq(core, next) { + return next; + } + core = next; + } +} + +type DataBindings<'a> = HashMap)>; +fn data_bindings<'a>(core: &'a Core<'a>) -> DataBindings<'a> { + let mut facts = HashMap::new(); + core.walk(&mut |node| { + let CoreKind::Let { binder, value, .. } = node.kind else { + return; + }; + let fact = match value.kind { + CoreKind::Lit(Constant::Data(data)) => Some((binder.name.unique, *data)), + CoreKind::Var(name) => facts.get(&name.unique).copied(), + _ => None, + }; + if let Some(fact) = fact { + facts.insert(binder.name.unique, fact); + } + }); + facts +} +fn data_subject<'a>( + node: &'a Core<'a>, + facts: &DataBindings<'a>, +) -> Option<(Option, &'a nash_plutus::data::PlutusData<'a>)> { + let CoreKind::Case { + kind: CaseKind::Data, + scrutinee, + branches, + .. + } = node.kind + else { + return None; + }; + if !valid_data_branches(branches) { + return None; + } + match scrutinee.kind { + CoreKind::Lit(Constant::Data(data)) => Some((None, data)), + CoreKind::Var(name) => facts + .get(&name.unique) + .map(|&(root, data)| (Some(root), data)), + _ => None, + } +} +fn data_test(data: &nash_plutus::data::PlutusData<'_>) -> Test<'static> { + use nash_plutus::data::PlutusData; + match data { + PlutusData::Constr { .. } => Test::DataConstr, + PlutusData::Map(_) => Test::DataMap, + PlutusData::List(_) => Test::DataList, + PlutusData::Integer(_) => Test::DataI, + PlutusData::ByteString(_) => Test::DataB, + } +} +fn data_payload<'a>( + b: &Builder<'a>, + data: &'a nash_plutus::data::PlutusData<'a>, +) -> &'a Constant<'a> { + use nash_plutus::{data::PlutusData, typ::Type}; + let a = b.arena; + let list = |items: &'a [&'a PlutusData<'a>]| { + let values = a.alloc_slice_fill_iter(items.iter().map(|item| Constant::data(a, item))); + Constant::proto_list(a, &Type::Data, values) + }; + match data { + PlutusData::Integer(i) => Constant::integer(a, i), + PlutusData::ByteString(bytes) => Constant::byte_string(a, bytes), + PlutusData::List(items) => list(items), + PlutusData::Map(entries) => { + let values = a.alloc_slice_fill_iter(entries.iter().map(|(key, value)| { + Constant::proto_pair( + a, + &Type::Data, + &Type::Data, + Constant::data(a, key), + Constant::data(a, value), + ) + })); + Constant::proto_list(a, Type::pair(a, &Type::Data, &Type::Data), values) + } + PlutusData::Constr { tag, fields } => Constant::proto_pair( + a, + &Type::Integer, + Type::list(a, &Type::Data), + Constant::integer_from(a, i128::from(*tag)), + list(fields), + ), + } +} + +fn valid_data_branches(branches: &[Branch<'_>]) -> bool { + let mut seen = [false; 5]; + for branch in branches { + let index = match branch.test { + Test::DataConstr => 0, + Test::DataMap => 1, + Test::DataList => 2, + Test::DataI => 3, + Test::DataB => 4, + _ => return false, + }; + if seen[index] || branch.binders.len() != 1 { + return false; + } + seen[index] = true; + } + true +} + +/// IData/BData/ListData/MapData case folding on hygienic ANF with the same name supply. +/// Keep the saturated producer strict: its runtime operand check can still fail. +pub fn reduce_data_wrappers<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let facts = wrapper_bindings(core); + let mut matched = HashSet::new(); + core.walk(&mut |node| { + if let Some((root, _, _)) = wrapper_subject(node, &facts) { + matched.insert(root); + } + }); + if matched.is_empty() { + return core; + } + // Refer to one operand value. Copying an ANF lambda or delay duplicates binders. + let named = core.map(b, &mut |node| { + let CoreKind::Let { + binder, + value, + body, + } = node.kind + else { + return None; + }; + if !matched.contains(&binder.name.unique) { + return None; + } + let (_, operand) = data_wrapper(value)?; + if matches!(operand.kind, CoreKind::Var(_)) { + return None; + } + let CoreKind::Builtin { func, .. } = value.kind else { + return None; + }; + let field = Binder { + name: b.fresh("data_operand"), + ty: operand.ty, + }; + let producer = b.builtin(func, &[b.var(field.name, field.ty)], value.ty); + Some(b.with_type( + b.let_(field, operand, b.let_(binder, producer, body)), + node.ty, + )) + }); + let facts = wrapper_bindings(named); + named.map(b, &mut |node| { + let (_, test, operand) = wrapper_subject(node, &facts)?; + let CoreKind::Case { + branches, default, .. + } = node.kind + else { + return None; + }; + let body = match branches.iter().find(|branch| branch.test == test) { + Some(branch) => b.let_(branch.binders[0], operand, branch.body), + None => default.unwrap_or_else(|| b.error(node.ty)), + }; + Some(b.with_type(body, node.ty)) + }) +} + +/// Producer case folding plus accepted cleanup, without another ANF pass. +pub fn simplify_data_wrappers<'a>(b: &Builder<'a>, mut core: &'a Core<'a>) -> &'a Core<'a> { + loop { + let next = simplify_data(b, reduce_data_wrappers(b, core)); + if std::ptr::eq(core, next) { + return next; + } + core = next; + } +} + +type WrapperBindings<'a> = HashMap)>; +fn data_wrapper<'a>(value: &'a Core<'a>) -> Option<(Test<'a>, &'a Core<'a>)> { + match value.kind { + CoreKind::Builtin { + func: DefaultFunction::IData, + args: [operand], + } => Some((Test::DataI, operand)), + CoreKind::Builtin { + func: DefaultFunction::BData, + args: [operand], + } => Some((Test::DataB, operand)), + CoreKind::Builtin { + func: DefaultFunction::ListData, + args: [operand], + } => Some((Test::DataList, operand)), + CoreKind::Builtin { + func: DefaultFunction::MapData, + args: [operand], + } => Some((Test::DataMap, operand)), + _ => None, + } +} +fn wrapper_bindings<'a>(core: &'a Core<'a>) -> WrapperBindings<'a> { + let mut facts = HashMap::new(); + core.walk(&mut |node| { + let CoreKind::Let { binder, value, .. } = node.kind else { + return; + }; + let fact = if data_wrapper(value).is_some() { + Some((binder.name.unique, value)) + } else if let CoreKind::Var(name) = value.kind { + facts.get(&name.unique).copied() + } else { + None + }; + if let Some(fact) = fact { + facts.insert(binder.name.unique, fact); + } + }); + facts +} +fn wrapper_subject<'a>( + node: &'a Core<'a>, + facts: &WrapperBindings<'a>, +) -> Option<(u32, Test<'a>, &'a Core<'a>)> { + let CoreKind::Case { + kind: CaseKind::Data, + scrutinee, + branches, + .. + } = node.kind + else { + return None; + }; + if !valid_data_branches(branches) { + return None; + } + let CoreKind::Var(name) = scrutinee.kind else { + return None; + }; + let &(root, value) = facts.get(&name.unique)?; + let (test, operand) = data_wrapper(value)?; + Some((root, test, operand)) +} + +/// ConstrData shape folding in hygienic ANF. Construction stays strict; +/// a used native pair payload is still extracted at the original case site. +pub fn reduce_constr_data<'a>(b: &Builder<'a>, core: &'a Core<'a>) -> &'a Core<'a> { + let mut known = HashSet::new(); + core.walk(&mut |node| { + let CoreKind::Let { binder, value, .. } = node.kind else { + return; + }; + let recognized = match value.kind { + CoreKind::Builtin { + func: DefaultFunction::ConstrData, + args: [_, _], + } => true, + CoreKind::Var(name) => known.contains(&name.unique), + _ => false, + }; + if recognized { + known.insert(binder.name.unique); + } + }); + if known.is_empty() { + return core; + } + core.map(b, &mut |node| { + let CoreKind::Case { + kind: CaseKind::Data, + scrutinee, + branches, + default, + } = node.kind + else { + return None; + }; + let CoreKind::Var(name) = scrutinee.kind else { + return None; + }; + if !known.contains(&name.unique) || !valid_data_branches(branches) { + return None; + } + let body = match branches + .iter() + .find(|branch| branch.test == Test::DataConstr) + { + Some(branch) => { + let payload = branch.binders[0]; + if crate::analysis::free_variables(branch.body) + .iter() + .any(|name| name.unique == payload.name.unique) + { + b.let_( + payload, + b.builtin(DefaultFunction::UnConstrData, &[scrutinee], payload.ty), + branch.body, + ) + } else { + branch.body + } + } + None => default.unwrap_or_else(|| b.error(node.ty)), + }; + Some(b.with_type(body, node.ty)) + }) +} + +/// ConstrData folding with accepted cleanup, without another ANF pass. +pub fn simplify_constr_data<'a>(b: &Builder<'a>, mut core: &'a Core<'a>) -> &'a Core<'a> { + loop { + let next = simplify_data_wrappers(b, reduce_constr_data(b, core)); + if std::ptr::eq(core, next) { + return next; + } + core = next; + } +} diff --git a/crates/nash-ir/src/lib.rs b/crates/nash-ir/src/lib.rs index 31c66265..47af47e6 100644 --- a/crates/nash-ir/src/lib.rs +++ b/crates/nash-ir/src/lib.rs @@ -34,3 +34,5 @@ mod test_support { b.constr(tag, fields, ty) } } + +pub mod inverse; diff --git a/crates/nash-ir/src/pretty.rs b/crates/nash-ir/src/pretty.rs index d29839eb..1a823a71 100644 --- a/crates/nash-ir/src/pretty.rs +++ b/crates/nash-ir/src/pretty.rs @@ -21,157 +21,180 @@ fn newline(out: &mut String, indent: usize) { out.push_str(" "); } } -fn write_core(out: &mut String, core: &Core<'_>, indent: usize, context: u8) { - let precedence = match &core.kind { - CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error => 2, - CoreKind::App { args, .. } | CoreKind::Builtin { args, .. } if args.is_empty() => 2, - CoreKind::App { .. } - | CoreKind::Builtin { .. } - | CoreKind::Constr { .. } - | CoreKind::Field { .. } - | CoreKind::Delay(_) - | CoreKind::Force(_) => 1, - _ => 0, - }; - let parens = precedence < context; - if parens { - out.push('('); - } - match &core.kind { - CoreKind::Var(n) => name(out, *n), - CoreKind::Lit(c) => match c { - nash_plutus::constant::Constant::Integer(i) => write!(out, "{i}").unwrap(), - nash_plutus::constant::Constant::String(s) => write!(out, "{s:?}").unwrap(), - nash_plutus::constant::Constant::Boolean(b) => write!(out, "{b}").unwrap(), - nash_plutus::constant::Constant::Unit => out.push_str("()"), - _ => out.push_str(&nash_plutus::pretty::constant(c)), - }, - CoreKind::Lam { params, body } => { - out.push('\\'); - for (index, p) in params.iter().enumerate() { - if index > 0 { - out.push(' '); - } - // Parentheses separate function-valued parameters from the body arrow. - let parens = matches!(p.ty, crate::ty::Ty::Term(crate::ty::TermTy::Fun(_, _))); - if parens { - out.push('('); - } - binder(out, *p); - if parens { - out.push(')'); - } - } - out.push_str(" -> "); - write_core(out, body, indent, 0); +fn lambda(out: &mut String, params: &[Binder<'_>]) { + out.push('\\'); + for (index, p) in params.iter().enumerate() { + if index > 0 { + out.push(' '); } - CoreKind::App { func, args } => { - write_core(out, func, indent, 1); - arguments(out, args, indent); + // Separate function-valued parameters from the body arrow. + let parens = matches!(p.ty, crate::ty::Ty::Term(crate::ty::TermTy::Fun(_, _))); + if parens { + out.push('('); } - CoreKind::Let { - binder: b, - value, - body, - } => { - out.push_str("let "); - binder(out, *b); - out.push_str(" = "); - write_core(out, value, indent, 0); - out.push_str(" in"); - newline(out, indent); - write_core(out, body, indent, 0); + binder(out, *p); + if parens { + out.push(')'); } - CoreKind::LetRec { binders, body } => { - out.push_str("letrec"); - for rec in *binders { - newline(out, indent + 1); + } + out.push_str(" -> "); +} + +enum Task<'a> { + Core(&'a Core<'a>, usize, u8), + Text(&'static str), + Newline(usize), + Rec(&'a RecBinder<'a>, usize), + Branch(&'a Branch<'a>, usize), +} + +fn arguments<'a>(pending: &mut Vec>, args: &[&'a Core<'a>], indent: usize) { + for arg in args.iter().rev() { + pending.push(Task::Core(arg, indent, 2)); + pending.push(Task::Text(" ")); + } +} + +fn write_core<'a>(out: &mut String, core: &'a Core<'a>, indent: usize, context: u8) { + let mut pending = vec![Task::Core(core, indent, context)]; + while let Some(task) = pending.pop() { + let (core, indent, context) = match task { + Task::Text(text) => { + out.push_str(text); + continue; + } + Task::Newline(indent) => { + newline(out, indent); + continue; + } + Task::Rec(rec, indent) => { + newline(out, indent); binder(out, rec.binder); write!(out, " [static {:?}] = ", rec.static_params).unwrap(); - write_core( - out, - &Core { - ty: rec.binder.ty, - kind: CoreKind::Lam { - params: rec.params, - body: rec.body, - }, - }, - indent + 1, - 0, - ); + lambda(out, rec.params); + pending.push(Task::Core(rec.body, indent, 0)); + continue; } - newline(out, indent); - out.push_str("in"); - newline(out, indent); - write_core(out, body, indent, 0); - } - CoreKind::Case { - kind, - scrutinee, - branches, - default, - } => { - write!(out, "case@{kind:?} ").unwrap(); - write_core(out, scrutinee, indent, 1); - out.push_str(" of"); - for branch in *branches { - newline(out, indent + 1); + Task::Branch(branch, indent) => { + newline(out, indent); test(out, branch.test); for b in branch.binders { out.push(' '); name(out, b.name); } out.push_str(" -> "); - write_core(out, branch.body, indent + 1, 0); - } - if let Some(body) = default { - newline(out, indent + 1); - out.push_str("_ -> "); - write_core(out, body, indent + 1, 0); + pending.push(Task::Core(branch.body, indent, 0)); + continue; } + Task::Core(core, indent, context) => (core, indent, context), + }; + let precedence = match &core.kind { + CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error => 2, + CoreKind::App { args, .. } | CoreKind::Builtin { args, .. } if args.is_empty() => 2, + CoreKind::App { .. } + | CoreKind::Builtin { .. } + | CoreKind::Constr { .. } + | CoreKind::Field { .. } + | CoreKind::Delay(_) + | CoreKind::Force(_) => 1, + _ => 0, + }; + if precedence < context { + out.push('('); + pending.push(Task::Text(")")); } - CoreKind::Constr { tag, fields } => { - write!(out, "constr {tag}").unwrap(); - arguments(out, fields, indent); - } - CoreKind::Field { - record, - index, - arity, - } => { - write!(out, "field@{index}/{arity} ").unwrap(); - write_core(out, record, indent, 2); - } - CoreKind::Builtin { func, args } => { - out.push_str(nash_plutus::pretty::builtin(*func)); - arguments(out, args, indent); - } - CoreKind::Trace { message, body } => { - out.push_str("trace "); - write_core(out, message, indent, 2); - out.push_str(" in "); - write_core(out, body, indent, 0); - } - CoreKind::Error => out.push_str("error"), - CoreKind::Delay(body) => { - out.push_str("delay "); - write_core(out, body, indent, 2); - } - CoreKind::Force(body) => { - out.push_str("force "); - write_core(out, body, indent, 2); + match core.kind { + CoreKind::Var(n) => name(out, n), + CoreKind::Lit(c) => match c { + nash_plutus::constant::Constant::Integer(i) => write!(out, "{i}").unwrap(), + nash_plutus::constant::Constant::String(s) => write!(out, "{s:?}").unwrap(), + nash_plutus::constant::Constant::Boolean(b) => write!(out, "{b}").unwrap(), + nash_plutus::constant::Constant::Unit => out.push_str("()"), + _ => out.push_str(&nash_plutus::pretty::constant(c)), + }, + CoreKind::Lam { params, body } => { + lambda(out, params); + pending.push(Task::Core(body, indent, 0)); + } + CoreKind::App { func, args } => { + arguments(&mut pending, args, indent); + pending.push(Task::Core(func, indent, 1)); + } + CoreKind::Let { + binder: b, + value, + body, + } => { + out.push_str("let "); + binder(out, b); + out.push_str(" = "); + pending.push(Task::Core(body, indent, 0)); + pending.push(Task::Newline(indent)); + pending.push(Task::Text(" in")); + pending.push(Task::Core(value, indent, 0)); + } + CoreKind::LetRec { binders, body } => { + out.push_str("letrec"); + pending.push(Task::Core(body, indent, 0)); + pending.push(Task::Newline(indent)); + pending.push(Task::Text("in")); + pending.push(Task::Newline(indent)); + pending.extend(binders.iter().rev().map(|rec| Task::Rec(rec, indent + 1))); + } + CoreKind::Case { + kind, + scrutinee, + branches, + default, + } => { + write!(out, "case@{kind:?} ").unwrap(); + if let Some(body) = default { + pending.push(Task::Core(body, indent + 1, 0)); + pending.push(Task::Text("_ -> ")); + pending.push(Task::Newline(indent + 1)); + } + pending.extend( + branches + .iter() + .rev() + .map(|branch| Task::Branch(branch, indent + 1)), + ); + pending.push(Task::Text(" of")); + pending.push(Task::Core(scrutinee, indent, 1)); + } + CoreKind::Constr { tag, fields } => { + write!(out, "constr {tag}").unwrap(); + arguments(&mut pending, fields, indent); + } + CoreKind::Field { + record, + index, + arity, + } => { + write!(out, "field@{index}/{arity} ").unwrap(); + pending.push(Task::Core(record, indent, 2)); + } + CoreKind::Builtin { func, args } => { + out.push_str(nash_plutus::pretty::builtin(func)); + arguments(&mut pending, args, indent); + } + CoreKind::Trace { message, body } => { + out.push_str("trace "); + pending.push(Task::Core(body, indent, 0)); + pending.push(Task::Text(" in ")); + pending.push(Task::Core(message, indent, 2)); + } + CoreKind::Error => out.push_str("error"), + CoreKind::Delay(body) | CoreKind::Force(body) => { + out.push_str(if matches!(core.kind, CoreKind::Delay(_)) { + "delay " + } else { + "force " + }); + pending.push(Task::Core(body, indent, 2)); + } } } - if parens { - out.push(')'); - } -} -fn arguments(out: &mut String, args: &[&Core<'_>], indent: usize) { - for arg in args { - out.push(' '); - write_core(out, arg, indent, 2); - } } fn test(out: &mut String, test: Test<'_>) { match test { @@ -212,6 +235,33 @@ mod tests { } } + #[test] + fn deep_core_prints_on_a_small_stack() { + std::thread::Builder::new() + .stack_size(128 * 1024) + .spawn(|| { + let arena = Arena::new(); + let b = Builder::new(&arena); + let depth = 20_000; + let mut core = b.int(1); + for _ in 0..depth { + core = b.alloc(core.ty, CoreKind::Force(core)); + } + let rendered = pretty(core); + // Structural depth/parenthesis check; ordinary formatting is covered + // by the snapshots without storing a huge depth-test snapshot. + let expected = format!( + "{}force 1{}", + "force (".repeat(depth - 1), + ")".repeat(depth - 1) + ); + assert_eq!(rendered, expected); + }) + .unwrap() + .join() + .unwrap(); + } + #[test] fn pretty_let_app() { let arena = Arena::new(); diff --git a/crates/nash-ir/src/single_use/tests.rs b/crates/nash-ir/src/single_use/tests.rs index eb02b8bd..9d470aed 100644 --- a/crates/nash-ir/src/single_use/tests.rs +++ b/crates/nash-ir/src/single_use/tests.rs @@ -96,8 +96,8 @@ fn computed_function_operand_remains_bound() { ); let f = binder(&b, "f", value.ty); let core = b.let_(f, value, b.app(b.var(f.name, f.ty), &[b.int(42)], INT)); - assert!(std::ptr::eq(core, inline(&b, core))); assert_optimization_snapshot!(&b, core); + assert!(std::ptr::eq(core, inline(&b, core))); } #[test] fn computed_capture_is_not_moved_into_a_delay() { @@ -105,8 +105,8 @@ fn computed_capture_is_not_moved_into_a_delay() { let b = Builder::new(&a); let x = binder(&b, "x", INT); let core = b.let_(x, b.error(INT), b.delay(b.var(x.name, INT))); - assert!(std::ptr::eq(core, inline(&b, core))); assert_optimization_snapshot!(&b, core); + assert!(std::ptr::eq(core, inline(&b, core))); } #[test] fn multiple_use_function_stays_shared() { @@ -125,8 +125,8 @@ fn multiple_use_function_stays_shared() { b.app(b.var(f.name, f.ty), &[b.int(42)], INT), ), ); - assert!(std::ptr::eq(core, inline(&b, core))); assert_optimization_snapshot!(&b, core); + assert!(std::ptr::eq(core, inline(&b, core))); } #[test] fn occurrence_and_root_type_views_survive() { @@ -193,6 +193,6 @@ fn forced_builtin_reference_stays_bound_even_when_returned() { ))); let f = binder(&b, "tracer", ty); let core = b.let_(f, b.builtin(F::Trace, &[], ty), b.var(f.name, ty)); - assert!(std::ptr::eq(core, inline(&b, core))); assert_optimization_snapshot!(&b, core); + assert!(std::ptr::eq(core, inline(&b, core))); } diff --git a/crates/nash-ir/src/small_inline.rs b/crates/nash-ir/src/small_inline.rs index bc006115..4c80d21a 100644 --- a/crates/nash-ir/src/small_inline.rs +++ b/crates/nash-ir/src/small_inline.rs @@ -7,14 +7,15 @@ use crate::{ }; use std::{collections::HashSet, ptr}; -/// Compose rules 1–4, dead-code cleanup, force/delay cancellation and known Boolean folding. +/// Compose rules 1–4, dead-code cleanup, force/delay cancellation and known Boolean/literal folding. /// Input is typed ANF with globally unique binders. /// Conditional bodies, partial calls and indirect calls are not selected by rule 4. pub fn simplify<'a>(b: &Builder<'a>, mut core: &'a Core<'a>) -> &'a Core<'a> { loop { // Beta cleanup flattens lets exposed by cancellation before other ANF rules. - let core_without_delays = force_delay::reduce(b, core); + let core_without_delays = force_delay::reduce(b, crate::inverse::reduce(b, core)); let selected = known_case::reduce_bool(b, core_without_delays); + let selected = known_case::reduce_literals(b, selected); let next = dead_code::simplify_bindings(b, inline(b, single_use::simplify(b, selected))); let next = dead_code::prune_recursive(b, next); if ptr::eq(core, next) { diff --git a/crates/nash-ir/src/traverse.rs b/crates/nash-ir/src/traverse.rs index f5f4ec0e..fd2a3d10 100644 --- a/crates/nash-ir/src/traverse.rs +++ b/crates/nash-ir/src/traverse.rs @@ -12,20 +12,44 @@ pub fn map<'a>( build: &Builder<'a>, core: &'a Core<'a>, f: &mut impl FnMut(&'a Core<'a>) -> Option<&'a Core<'a>>, +) -> &'a Core<'a> { + let mut pending = vec![(core, false)]; + let mut results = Vec::new(); + let mut children = Vec::new(); + while let Some((node, finish)) = pending.pop() { + children.clear(); + node.push_children_reversed(&mut children); + if !finish { + pending.push((node, true)); + pending.extend(children.iter().map(|child| (*child, false))); + } else { + let start = results.len() - children.len(); + let mapped = rebuild(build, node, &mut results.drain(start..), f); + results.push(mapped); + } + } + results.pop().unwrap() +} + +pub(crate) fn rebuild<'a>( + build: &Builder<'a>, + core: &'a Core<'a>, + children: &mut impl Iterator>, + f: &mut impl FnMut(&'a Core<'a>) -> Option<&'a Core<'a>>, ) -> &'a Core<'a> { let changed = match &core.kind { CoreKind::Var(_) | CoreKind::Lit(_) | CoreKind::Error => None, CoreKind::Lam { params, body } => { - let mapped = map(build, body, f); + let mapped = children.next().unwrap(); (!ptr::eq(*body, mapped)).then_some(CoreKind::Lam { params, body: mapped, }) } CoreKind::App { func, args } => { - let mapped = map(build, func, f); + let mapped = children.next().unwrap(); let mapped_args = map_slice(build, args, |arg| { - let value = map(build, arg, f); + let value = children.next().unwrap(); (value, !ptr::eq(arg, value)) }); (!ptr::eq(*func, mapped) || !ptr::eq(*args, mapped_args)).then_some(CoreKind::App { @@ -38,8 +62,8 @@ pub fn map<'a>( value, body, } => { - let v = map(build, value, f); - let t = map(build, body, f); + let v = children.next().unwrap(); + let t = children.next().unwrap(); (!ptr::eq(*value, v) || !ptr::eq(*body, t)).then_some(CoreKind::Let { binder: *binder, value: v, @@ -48,10 +72,10 @@ pub fn map<'a>( } CoreKind::LetRec { binders, body } => { let mapped = map_slice(build, binders, |rb| { - let body = map(build, rb.body, f); + let body = children.next().unwrap(); (RecBinder { body, ..rb }, !ptr::eq(rb.body, body)) }); - let t = map(build, body, f); + let t = children.next().unwrap(); (!ptr::eq(*binders, mapped) || !ptr::eq(*body, t)).then_some(CoreKind::LetRec { binders: mapped, body: t, @@ -63,12 +87,12 @@ pub fn map<'a>( branches, default, } => { - let s = map(build, scrutinee, f); + let s = children.next().unwrap(); let bs = map_slice(build, branches, |branch| { - let body = map(build, branch.body, f); + let body = children.next().unwrap(); (Branch { body, ..branch }, !ptr::eq(branch.body, body)) }); - let d = default.map(|body| map(build, body, f)); + let d = default.map(|_| children.next().unwrap()); let same_default = match (default, d) { (Some(a), Some(b)) => ptr::eq(*a, b), (None, None) => true, @@ -85,7 +109,7 @@ pub fn map<'a>( } CoreKind::Constr { tag, fields } => { let mapped = map_slice(build, fields, |arg| { - let value = map(build, arg, f); + let value = children.next().unwrap(); (value, !ptr::eq(arg, value)) }); (!ptr::eq(*fields, mapped)).then_some(CoreKind::Constr { @@ -98,7 +122,7 @@ pub fn map<'a>( index, arity, } => { - let mapped = map(build, record, f); + let mapped = children.next().unwrap(); (!ptr::eq(*record, mapped)).then_some(CoreKind::Field { record: mapped, index: *index, @@ -107,7 +131,7 @@ pub fn map<'a>( } CoreKind::Builtin { func, args } => { let mapped = map_slice(build, args, |arg| { - let value = map(build, arg, f); + let value = children.next().unwrap(); (value, !ptr::eq(arg, value)) }); (!ptr::eq(*args, mapped)).then_some(CoreKind::Builtin { @@ -116,19 +140,19 @@ pub fn map<'a>( }) } CoreKind::Trace { message, body } => { - let m = map(build, message, f); - let t = map(build, body, f); + let m = children.next().unwrap(); + let t = children.next().unwrap(); (!ptr::eq(*message, m) || !ptr::eq(*body, t)).then_some(CoreKind::Trace { message: m, body: t, }) } CoreKind::Delay(body) => { - let mapped = map(build, body, f); + let mapped = children.next().unwrap(); (!ptr::eq(*body, mapped)).then_some(CoreKind::Delay(mapped)) } CoreKind::Force(body) => { - let mapped = map(build, body, f); + let mapped = children.next().unwrap(); (!ptr::eq(*body, mapped)).then_some(CoreKind::Force(mapped)) } }; diff --git a/crates/nash-ir/src/traverse/tests.rs b/crates/nash-ir/src/traverse/tests.rs index 91eb1f4f..7b19230e 100644 --- a/crates/nash-ir/src/traverse/tests.rs +++ b/crates/nash-ir/src/traverse/tests.rs @@ -174,3 +174,35 @@ fn visitor_observes_mapped_children_and_identity_replacement_is_a_noop() { }); assert!(std::ptr::eq(mapped, result)); } + +#[test] +fn deep_walk_and_map_use_heap_work_lists() { + std::thread::Builder::new() + .stack_size(128 * 1024) + .spawn(|| { + let arena = Arena::new(); + let b = Builder::new(&arena); + let mut core = b.int(1); + for _ in 0..20_000 { + core = b.alloc(core.ty, CoreKind::Force(core)); + } + let mut nodes = 0; + core.walk(&mut |_| nodes += 1); + assert_eq!(nodes, 20_001); + assert!(std::ptr::eq(core, core.map(&b, &mut |_| None))); + let mapped = core.map(&b, &mut |node| { + matches!(node.kind, CoreKind::Lit(_)).then(|| b.int(2)) + }); + let mut cursor = mapped; + for _ in 0..20_000 { + let CoreKind::Force(body) = cursor.kind else { + panic!("missing force") + }; + cursor = body; + } + assert!(matches!(cursor.kind, CoreKind::Lit(_))); + }) + .unwrap() + .join() + .unwrap(); +} diff --git a/crates/nash-ir/src/unused_params.rs b/crates/nash-ir/src/unused_params.rs index bf6ad731..64ea360e 100644 --- a/crates/nash-ir/src/unused_params.rs +++ b/crates/nash-ir/src/unused_params.rs @@ -1,4 +1,4 @@ -//! Trial: shorten nonrecursive helper signatures with exact, direct calls only. +//! Shorten nonrecursive helper signatures before ANF, with exact direct calls only. use crate::{ analysis, anf, build::Builder, diff --git a/crates/nash-plutus/src/debruijn.rs b/crates/nash-plutus/src/debruijn.rs index eea24b3d..a951fa28 100644 --- a/crates/nash-plutus/src/debruijn.rs +++ b/crates/nash-plutus/src/debruijn.rs @@ -13,50 +13,81 @@ pub fn to_debruijn<'a>( arena: &'a Arena, term: &'a Term<'a, Name<'a>>, ) -> Result<&'a Term<'a, DeBruijn>, FreeVariable<'a>> { - convert(arena, &mut Vec::new(), term) -} - -fn convert<'a>( - arena: &'a Arena, - scope: &mut Vec, - term: &'a Term<'a, Name<'a>>, -) -> Result<&'a Term<'a, DeBruijn>, FreeVariable<'a>> { - Ok(match term { - Term::Var(name) => { - let position = scope - .iter() - .rposition(|unique| *unique == name.unique()) - .ok_or(FreeVariable(name))?; - Term::var(arena, DeBruijn::new(arena, scope.len() - position)) - } - Term::Lambda { parameter, body } => { - scope.push(parameter.unique()); - let result = convert(arena, scope, body); - scope.pop(); - result?.lambda(arena, DeBruijn::zero(arena)) - } - Term::Apply { function, argument } => { - convert(arena, scope, function)?.apply(arena, convert(arena, scope, argument)?) - } - Term::Delay(t) => convert(arena, scope, t)?.delay(arena), - Term::Force(t) => convert(arena, scope, t)?.force(arena), - Term::Constant(c) => Term::constant(arena, c), - Term::Builtin(f) => Term::builtin(arena, f), - Term::Error => Term::error(arena), - Term::Constr { tag, fields } => { - let fields = fields - .iter() - .map(|f| convert(arena, scope, f)) - .collect::, _>>()?; - Term::constr(arena, *tag, arena.alloc_slice_copy(&fields)) - } - Term::Case { constr, branches } => { - let constr = convert(arena, scope, constr)?; - let branches = branches - .iter() - .map(|b| convert(arena, scope, b)) - .collect::, _>>()?; - Term::case(arena, constr, arena.alloc_slice_copy(&branches)) + enum Task<'a> { + Visit(&'a Term<'a, Name<'a>>), + Finish(&'a Term<'a, Name<'a>>, usize), + } + let mut pending = vec![Task::Visit(term)]; + let mut scope = Vec::new(); + let mut results: Vec<&'a Term<'a, DeBruijn>> = Vec::new(); + while let Some(task) = pending.pop() { + match task { + Task::Visit(term) => { + pending.push(Task::Finish(term, results.len())); + match term { + Term::Lambda { parameter, body } => { + scope.push(parameter.unique()); + pending.push(Task::Visit(body)); + } + Term::Apply { function, argument } => { + pending.push(Task::Visit(argument)); + pending.push(Task::Visit(function)); + } + Term::Delay(body) | Term::Force(body) => pending.push(Task::Visit(body)), + Term::Constr { fields, .. } => { + pending.extend(fields.iter().rev().map(|t| Task::Visit(t))) + } + Term::Case { constr, branches } => { + pending.extend(branches.iter().rev().map(|t| Task::Visit(t))); + pending.push(Task::Visit(constr)); + } + _ => {} + } + } + Task::Finish(term, start) => { + let mut children = results.drain(start..); + let result = match term { + Term::Var(name) => { + let position = scope + .iter() + .rposition(|id| *id == name.unique()) + .ok_or(FreeVariable(name))?; + Term::var(arena, DeBruijn::new(arena, scope.len() - position)) + } + Term::Lambda { .. } => { + scope.pop(); + children + .next() + .unwrap() + .lambda(arena, DeBruijn::zero(arena)) + } + Term::Apply { .. } => children + .next() + .unwrap() + .apply(arena, children.next().unwrap()), + Term::Delay(_) => children.next().unwrap().delay(arena), + Term::Force(_) => children.next().unwrap().force(arena), + Term::Constant(c) => Term::constant(arena, c), + Term::Builtin(f) => Term::builtin(arena, f), + Term::Error => Term::error(arena), + Term::Constr { tag, .. } => Term::constr( + arena, + *tag, + arena.alloc_slice_copy(&children.by_ref().collect::>()), + ), + Term::Case { .. } => { + let constr = children.next().unwrap(); + Term::case( + arena, + constr, + arena.alloc_slice_copy(&children.by_ref().collect::>()), + ) + } + }; + drop(children); + results.push(result); + } } - }) + } + Ok(results.pop().unwrap()) } diff --git a/crates/nash-plutus/src/pretty.rs b/crates/nash-plutus/src/pretty.rs index 2fa98bc7..9b1522a1 100644 --- a/crates/nash-plutus/src/pretty.rs +++ b/crates/nash-plutus/src/pretty.rs @@ -70,63 +70,112 @@ pub fn program(program: &Program<'_, V>) -> String { ) } pub fn term(term: &Term<'_, V>) -> String { - print_term(term, &mut Vec::new()) -} -fn print_term( - term: &Term<'_, V>, - scope: &mut Vec<(Option, String)>, -) -> String { - match term { - Term::Var(v) => { - if let Some(index) = v.index() { - return if index > 0 && index <= scope.len() { - scope[scope.len() - index].1.clone() - } else { - format!("free_i{index}") - }; - } - if let Some(unique) = v.unique() - && let Some((_, label)) = scope.iter().rev().find(|(id, _)| *id == Some(unique)) - { - return label.clone(); + enum Frame<'a, 't, V> { + Visit(&'t Term<'a, V>), + Form { + head: String, + start: usize, + apply: bool, + }, + EndLambda { + name: String, + start: usize, + }, + } + let mut pending = vec![Frame::Visit(term)]; + let mut scope: Vec<(Option, String)> = Vec::new(); + let mut rendered = Vec::new(); + while let Some(frame) = pending.pop() { + match frame { + Frame::Form { head, start, apply } => { + let children = rendered.split_off(start); + rendered.push(form(&head, children, apply)); } - let mut name = String::new(); - v.write(&mut name); - name - } - Term::Lambda { parameter, body } => { - let mut name = String::new(); - if parameter.index().is_some() { - write!(name, "i{}", scope.len()).unwrap(); - } else { - parameter.write(&mut name); + Frame::EndLambda { name, start } => { + scope.pop(); + let children = rendered.split_off(start); + rendered.push(form(&format!("lam {name}"), children, false)); } - scope.push((parameter.unique(), name.clone())); - let body = print_term(body, scope); - scope.pop(); - form(&format!("lam {name}"), vec![body], false) - } - Term::Apply { function, argument } => form( - "", - vec![print_term(function, scope), print_term(argument, scope)], - true, - ), - Term::Delay(t) => form("delay", vec![print_term(t, scope)], false), - Term::Force(t) => form("force", vec![print_term(t, scope)], false), - Term::Constant(c) => constant(c), - Term::Builtin(f) => format!("(builtin {})", builtin(**f)), - Term::Error => "(error)".into(), - Term::Constr { tag, fields } => form( - &format!("constr {tag}"), - fields.iter().map(|t| print_term(t, scope)).collect(), - false, - ), - Term::Case { constr, branches } => { - let mut children = vec![print_term(constr, scope)]; - children.extend(branches.iter().map(|t| print_term(t, scope))); - form("case", children, false) + Frame::Visit(term) => match term { + Term::Var(v) => { + let name = if let Some(index) = v.index() { + if index > 0 && index <= scope.len() { + scope[scope.len() - index].1.clone() + } else { + format!("free_i{index}") + } + } else if let Some(unique) = v.unique() + && let Some((_, label)) = + scope.iter().rev().find(|(id, _)| *id == Some(unique)) + { + label.clone() + } else { + let mut name = String::new(); + v.write(&mut name); + name + }; + rendered.push(name); + } + Term::Lambda { parameter, body } => { + let mut name = String::new(); + if parameter.index().is_some() { + write!(name, "i{}", scope.len()).unwrap(); + } else { + parameter.write(&mut name); + } + scope.push((parameter.unique(), name.clone())); + pending.push(Frame::EndLambda { + name, + start: rendered.len(), + }); + pending.push(Frame::Visit(body)); + } + Term::Apply { function, argument } => { + pending.push(Frame::Form { + head: String::new(), + start: rendered.len(), + apply: true, + }); + pending.push(Frame::Visit(argument)); + pending.push(Frame::Visit(function)); + } + Term::Delay(t) | Term::Force(t) => { + let head = if matches!(term, Term::Delay(_)) { + "delay" + } else { + "force" + }; + pending.push(Frame::Form { + head: head.into(), + start: rendered.len(), + apply: false, + }); + pending.push(Frame::Visit(t)); + } + Term::Constant(c) => rendered.push(constant(c)), + Term::Builtin(f) => rendered.push(format!("(builtin {})", builtin(**f))), + Term::Error => rendered.push("(error)".into()), + Term::Constr { tag, fields } => { + pending.push(Frame::Form { + head: format!("constr {tag}"), + start: rendered.len(), + apply: false, + }); + pending.extend(fields.iter().rev().map(|t| Frame::Visit(t))); + } + Term::Case { constr, branches } => { + pending.push(Frame::Form { + head: "case".into(), + start: rendered.len(), + apply: false, + }); + pending.extend(branches.iter().rev().map(|t| Frame::Visit(t))); + pending.push(Frame::Visit(constr)); + } + }, } } + rendered.pop().unwrap() } fn form(head: &str, children: Vec, apply: bool) -> String { let (open, close) = if apply { ('[', ']') } else { ('(', ')') }; @@ -409,3 +458,31 @@ pub fn builtin(function: DefaultFunction) -> &'static str { DefaultFunction::ScaleValue => "scaleValue", } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn deep_terms_print_on_a_small_stack() { + std::thread::Builder::new() + .stack_size(128 * 1024) + .spawn(|| { + let arena = Arena::new(); + let depth = 1024; + let mut root = Term::::error(&arena); + for _ in 0..depth { + root = root.delay(&arena); + } + let printed = term(root); + // Check the traversal preserves every node without parsing the + // deep output through another recursive consumer. + assert_eq!(printed.matches("(delay").count(), depth); + assert_eq!(printed.matches("(error)").count(), 1); + assert_eq!(printed.matches(')').count(), depth + 1); + }) + .unwrap() + .join() + .unwrap(); + } +} diff --git a/crates/nash-plutus/src/script.rs b/crates/nash-plutus/src/script.rs index 189a0aab..e80b65a0 100644 --- a/crates/nash-plutus/src/script.rs +++ b/crates/nash-plutus/src/script.rs @@ -56,81 +56,84 @@ fn validate_term( version: PlutusVersion, uplc_110: bool, ) -> Result<(), TargetError> { - match term { - Term::Lambda { body, .. } | Term::Delay(body) | Term::Force(body) => { - validate_term(body, version, uplc_110)? - } - Term::Apply { function, argument } => { - validate_term(function, version, uplc_110)?; - validate_term(argument, version, uplc_110)?; - } - Term::Constr { fields, .. } => { - if !uplc_110 { - return Err(error(version, "constr (requires UPLC 1.1.0)")); + let mut pending = vec![term]; + while let Some(term) = pending.pop() { + match term { + Term::Lambda { body, .. } | Term::Delay(body) | Term::Force(body) => { + pending.push(*body) } - for term in *fields { - validate_term(term, version, uplc_110)?; + Term::Apply { function, argument } => { + pending.push(*argument); + pending.push(*function); } - } - Term::Case { constr, branches } => { - if !uplc_110 { - return Err(error(version, "case (requires UPLC 1.1.0)")); + Term::Constr { fields, .. } => { + if !uplc_110 { + return Err(error(version, "constr (requires UPLC 1.1.0)")); + } + pending.extend(fields.iter().rev().copied()); } - validate_term(constr, version, uplc_110)?; - for term in *branches { - validate_term(term, version, uplc_110)?; + Term::Case { constr, branches } => { + if !uplc_110 { + return Err(error(version, "case (requires UPLC 1.1.0)")); + } + pending.extend(branches.iter().rev().copied()); + pending.push(*constr); } - } - Term::Builtin(fun) => { - let tag = **fun as u8; - // Flat tags 0..=100 are exactly upstream batches 1–6. Keep this - // bound fixed: future runtime builtins must not become ledger-valid - // merely because they were added to DefaultFunction. - let allowed = tag <= 100; - if !allowed { - return Err(error(version, format!("builtin {fun:?}"))); + Term::Builtin(fun) => { + let tag = **fun as u8; + // Flat tags 0..=100 are exactly upstream batches 1–6. Keep this + // bound fixed: future runtime builtins must not become ledger-valid + // merely because they were added to DefaultFunction. + let allowed = tag <= 100; + if !allowed { + return Err(error(version, format!("builtin {fun:?}"))); + } } + Term::Constant(constant) => validate_constant(constant, version)?, + Term::Var(_) | Term::Error => {} } - Term::Constant(constant) => validate_constant(constant, version)?, - Term::Var(_) | Term::Error => {} } Ok(()) } fn validate_type(typ: &Type<'_>, version: PlutusVersion) -> Result<(), TargetError> { - match typ { - Type::List(t) | Type::Array(t) => validate_type(t, version)?, - Type::Pair(a, b) => { - validate_type(a, version)?; - validate_type(b, version)?; - } - // Nash cannot encode BLS constant types (including empty containers). - Type::Bls12_381G1Element | Type::Bls12_381G2Element | Type::Bls12_381MlResult => { - return Err(error(version, format!("constant type {typ:?}"))); + let mut pending = vec![typ]; + while let Some(typ) = pending.pop() { + match typ { + Type::List(t) | Type::Array(t) => pending.push(*t), + Type::Pair(a, b) => { + pending.push(*b); + pending.push(*a); + } + // Nash cannot encode BLS constant types (including empty containers). + Type::Bls12_381G1Element | Type::Bls12_381G2Element | Type::Bls12_381MlResult => { + return Err(error(version, format!("constant type {typ:?}"))); + } + _ => {} } - _ => {} } Ok(()) } fn validate_constant(constant: &Constant<'_>, version: PlutusVersion) -> Result<(), TargetError> { - match constant { - Constant::ProtoList(t, values) | Constant::ProtoArray(t, values) => { - validate_type(t, version)?; - for value in *values { - validate_constant(value, version)?; + let mut pending = vec![constant]; + while let Some(constant) = pending.pop() { + match constant { + Constant::ProtoList(t, values) | Constant::ProtoArray(t, values) => { + validate_type(t, version)?; + pending.extend(values.iter().rev().copied()); } + Constant::ProtoPair(a, b, x, y) => { + validate_type(a, version)?; + validate_type(b, version)?; + pending.push(*y); + pending.push(*x); + } + Constant::Bls12_381G1Element(_) + | Constant::Bls12_381G2Element(_) + | Constant::Bls12_381MlResult(_) => { + return Err(error(version, "runtime-only BLS constant")); + } + _ => {} } - Constant::ProtoPair(a, b, x, y) => { - validate_type(a, version)?; - validate_type(b, version)?; - validate_constant(x, version)?; - validate_constant(y, version)?; - } - Constant::Bls12_381G1Element(_) - | Constant::Bls12_381G2Element(_) - | Constant::Bls12_381MlResult(_) => { - return Err(error(version, "runtime-only BLS constant")); - } - _ => {} } Ok(()) } diff --git a/docs/cli.md b/docs/cli.md index 3500a5c2..291af595 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -36,19 +36,23 @@ Global flags, accepted before the subcommand: | Flag | Default | Effect | |---|---|---| +| `-O0` / `-O1`, `--optimize 0\|1` | config `optimize`, else `1` | Select baseline or trace-preserving optimization. | | `--plutus-version v1\|v2\|v3` | config `plutusVersion`, else `v3` | Ledger language target at the protocol 11 baseline. | | `--trace-level silent\|compact\|verbose` | config `traceLevel`, else `silent` | User `trace` compilation mode. | | `--compiler-traces[=true\|false]` | config `compilerTraces`, else false | Independently control compiler traces; the bare flag enables them. | | `--out DIR` | `build` | Output directory. | -CLI options override the owning project's configuration. Builds are unoptimized; -`--optimize` and the `optimize` config field are rejected while Plan 08 is deferred. +CLI options override the owning project's configuration. `-O0` / `--optimize 0` +keeps baseline lowering. `-O1` / `--optimize 1` enables accepted +optimizations (the default) while preserving enabled user/compiler traces and their order. +Both `build` and `test` accept this option. O1 does not enable or disable traces. See [target compatibility](validators.md#target-compatibility). `nash test`: | Flag | Default | Effect | |---|---|---| +| `-O0` / `-O1`, `--optimize 0\|1` | config `optimize`, else `1` | Same pipeline as `build`. | | `--seed N` | random `u32` | Seed for property tests. Printed in the summary so a run can be replayed. | | `--max-success N` | `100` | Iterations per property. | | `--match PATTERN` | all | Run only tests whose `Module.Name` or name contains `PATTERN`. Repeatable. `--match "Vesting.{claim}"` selects a test by name inside a module. | @@ -138,6 +142,7 @@ Three optional build settings are accepted on `application` and `package` config "type": "application", "sourceDirectories": ["src"], "plutusVersion": "v3", // "v1" | "v2" | "v3"; default "v3" + "optimize": 1, // 0 or 1 (default); independent of trace settings "traceLevel": "compact", // "silent" | "compact" | "verbose"; default "silent" "compilerTraces": false, // boolean; default false "dependencies": { } @@ -147,6 +152,7 @@ Three optional build settings are accepted on `application` and `package` config | Field | Used by | Meaning | |---|---|---| | `plutusVersion` | `build` | Ledger language target and permitted generated features at the supported protocol baseline. | +| `optimize` | `build`, `test` | Default for `-O` / `--optimize`; 0 or 1. | | `traceLevel` | `build` | Default for `--trace-level`. | | `compilerTraces` | `build` | Default for `--compiler-traces`; independent of user traces. | diff --git a/docs/codegen.md b/docs/codegen.md index 7ca613da..be856412 100644 --- a/docs/codegen.md +++ b/docs/codegen.md @@ -168,7 +168,7 @@ Can AST + solved types + trait evidence Core with LetRec │ 5. hygiene + static lifting + ANF + main optimization (Plan 08; optimized path only) │ 6. recursion rewrite (LetRec -> self-application/dispatch) - │ 7. ANF + cleanup optimization (Plan 08; optimized path only) + │ 7. freshen generated binders (O1; no second ANF pass) ▼ Core │ 8. Core -> Term -> Term -> Program @@ -351,8 +351,7 @@ If every parameter is static, the worker is a singleton delayed recursive bindin memoized result. Final recursion rewriting supports this explicit delayed form; ordinary recursive values and zero-parameter mutual groups remain unsupported. The original integrated lifting path remains in O0 for baseline comparison while -the accepted extracted pass remains wired through the test harness until the -optimized production path is introduced. +the accepted extracted pass runs before ANF in production O1. **Mutual recursion** uses native UPLC constructor packets and case dispatch: @@ -415,14 +414,13 @@ Known builtin arguments normalize in order; valid builtin nodes cannot exceed arity and only execute on saturation. Trace message work precedes emission, while body work remains inside the trace. Administrative lets reassociate only with unique binders, and new binders retain the computation's actual result type. -Wiring remains test-only until the optimized production path is introduced; -production assembly is unchanged. +The accepted pipeline is shared by production O1, snapshots and measurements. Plan 08 rule 1 is accepted in `nash-ir::propagate`: remove variable aliases, then propagate literals with at most one remaining use. Integers, byte strings up to 64 bytes inclusive, and BLS constants may also be duplicated at multiple uses. Count uses after alias removal to retain other shared payloads. Computed, lambda, delay and builtin bindings -stay bound. This pass runs in the test pipeline before recursion rewriting; +stay bound. This pass runs in O1 before recursion rewriting; production assembly remains unchanged. Rule 2 is accepted in `nash-ir::beta`: direct lambda applications become @@ -442,7 +440,7 @@ program scope for other entry points). The optimized lowering entry point now implements that placement. Other computed bindings remain at their evaluation points, including computed function operands. This keeps ANF and effect order without a general effect-motion -analysis. The test-only candidate loop composes it with accepted rules 1 and 2. +analysis. The O1 cleanup loop composes it with accepted rules 1 and 2. Rule 4 is implemented in `nash-ir::small_inline`. It selects nonrecursive let-bound identity lambdas and wrappers containing one saturated builtin with only variable @@ -451,9 +449,8 @@ applied direct calls are copied; each copy gets fresh parameters and existing beta reduction preserves strict argument evaluation. Partial and escaping uses remain shared. Conditional bodies and broader size heuristics are deferred. `small_inline::simplify` composes rules 1–4, safe dead-binding removal, recursive -reachability, force/delay cancellation and known Boolean folding to a fixed point -in the accepted candidate and explicit performance pipelines. This does not -change the normal build default. +reachability, representation/force-delay cancellation and known Boolean/literal +folding to a fixed point in the shared production O1 pipeline. Chunk 5 force sharing is implemented in `lower::lower_with_builtin_sharing`. During lowering, references to each builtin requiring forces share one fresh @@ -464,7 +461,7 @@ Only references surviving lowering are bound; exhaustive case defaults can be discarded. This also shares across erased type instantiations without changing Core typing or repeating ANF. Core cleanup runs before these bindings exist. The accepted pipeline composes this with the constant-prefix sharing below; -O0 and normal builds still use `lower`. +O0 uses `lower`; O1 uses `lower_with_constant_sharing`. The accepted pipeline uses `lower::lower_with_constant_sharing` for Chunk 5 steps 1 and 2. The two-occurrence minimum is accepted, including startup costs. @@ -840,10 +837,20 @@ Production assembly accepts a ledger target and validates generated UPLC against the protocol 11 compatibility baseline described in [validators.md](validators.md#target-compatibility). `assemble_core` remains the default V3 entrypoint; `assemble_core_for_version` emits UPLC 1.1.0 for V1, V2, and V3 and checks the complete program. -Normal builds still use O0 (recursion rewriting then lowering). Plan 08 Chunk 11 -reserves public optimization modes, configuration and defaults until the accepted -pass set is reviewed; implemented passes currently run through the candidate and -explicit performance pipelines. +O1 is the build/test default; O0 remains available (required recursion rewriting then ordinary lowering). +`assemble_core_with_options` also supports O1: shared `optimizer::optimize` +performs freshening, static lifting, unused-parameter removal, direct constructor +folding and representation inverse cancellation, then one ANF normalization and accepted +cleanup/known-case passes. Recursion is encoded afterwards, binders are freshened, +and forced-builtin/constant-prefix sharing runs during lowering. O1 preserves +all traces generated by the selected trace settings; it does not strip traces. +Snapshot and performance pipelines reuse this production optimizer. Explicit +`comptime` evaluation retains O0 and its existing budget semantics. +Core traversal, scope-aware rewriting, ANF, recursion encoding, lowering and UPLC +conversion/validation use explicit heap work lists rather than depth-dependent +Rust calls. Assembly does not enlarge the thread stack. See the +[stack audit](research/compiler-stack-audit.md) for remaining frontend, diagnostic +and nested-type risks. ### Field offset extraction @@ -905,7 +912,7 @@ call-local strict binding in source order, including discarded arguments. It uses Delay/Force when every parameter is unused. The pass runs after static lifting and before the single ANF normalization, followed by accepted cleanup. Partial/staged/escaping/oversaturated uses and recursive signatures are unchanged; -production assembly remains O0 until the optimizer integration chunk. +these accepted passes run in production O1. Chunk 8 adds accepted `force_delay::reduce` cleanup for direct @@ -928,7 +935,7 @@ Malformed Boolean tables, unmatched cases without defaults and nonliteral subjects stay unchanged. It runs inside the accepted fixed-point loop after force/delay cancellation and before beta cleanup. This lets cleanup expose new literal subjects and remove dead branch helpers, without another ANF pass. -Production assembly remains O0 until optimizer integration. +Production O1 includes these accepted passes. Accepted native-constructor folding (`known_case::reduce_constr`) runs after static lifting and unused-parameter removal, before the single ANF pass. It @@ -936,3 +943,12 @@ selects a direct `Constr` subject's matching `CaseKind::Tag` branch and replaces field binders with strict lets in original field order. Ignored fields still evaluate. Malformed tables, absent tags, arity mismatches and non-direct subjects stay unchanged. No constructor fact propagation is included. + +Representation cancellation (`inverse::reduce`) runs both before ANF and inside +the main cleanup loop. It cancels integer/byte/list/map Data round trips and +UTF-8 round trips only with runtime-shape evidence; reverse conversions require +the precise Data variant or valid UTF-8. Let-bound operands stay at their original +evaluation point and only variables are reused. Constructor Data projections and +reconstruction reuse variables through retained strict producer bindings, keeping +all tag/field/variant checks. Unknown unary shapes stay unchanged. See Plan 08 +Chunk 8 for exact retained rules and the zero-regression measurements. diff --git a/docs/overview.md b/docs/overview.md index 25983ae4..c921b6f9 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -82,7 +82,7 @@ implementation, default imports, Prop and the full validator example. | IR | Single tree IR (`Core`): monomorphized lambda calculus with explicit reprs. Core -> Core optimization passes. Core -> UPLC `Term`. | | Pattern matching | Maranget decision trees, hoisted leaves, memoized accessors. Exhaustiveness from Elm's `Nitpick/PatternMatches`. | | Native maps | `Primitive.map k v` aliases `list (pair k v)` with Storable components. Map builtins and helper results retain the alias. Library Eq uses structural Data equality for Big/Big maps and selected element equality otherwise; native lists similarly split Big/Little element Eq. | -| Recursion | Self-application with static-parameter lifting; mutual recursion via a combined dispatcher. No Y combinator. Plan 08 optimizes ANF Core with explicit recursion first, then rewrites recursion, restores ANF and cleans up generated code. O0 keeps required recursion rewriting without optimization. | +| Recursion | Self-application with static-parameter lifting; mutual recursion via a combined dispatcher. No Y combinator. Plan 08 optimizes ANF Core with explicit recursion first, then rewrites recursion and lowers directly without repeating ANF. O0 keeps required recursion rewriting without optimization. | | Runtime errors | `fail`, `todo`, `trace`, `assert`. Trace levels silent / compact / verbose; compiler-generated traces separate switch. | | Diagnostics | Concise diagnostics with expected/actual types, source labels, stable codes, and shared terminal/JSON/LSP output. One `nash-report` crate. | | Stdlib | `nash/base` package in-repo (`crates/nash-driver/base/`), implicit default imports like Elm's `core`. `Builtin` exposes only real UPLC builtin functions. Synthetic `Primitive` owns primitive types, representation traits, constructors, and unchecked `coerce`. Base ships embedded in `nash-driver`; applications need no explicit dependency or download. Defaults affect canonical scope, not source imports. One module per type pair named by the uppercase name (`List`, `Int`, ...); helpers accept Big or little outer inputs and return little outer results, preserving payload types. No Big `String`. | diff --git a/docs/research/compiler-stack-audit.md b/docs/research/compiler-stack-audit.md new file mode 100644 index 00000000..145dd9b8 --- /dev/null +++ b/docs/research/compiler-stack-audit.md @@ -0,0 +1,56 @@ +# Compiler stack audit — 2026-09-29 + +Default O1 exposed a stack overflow in the driver `ledger_contexts` fixture. +This audit distinguishes reproduced failures from recursive paths that still +need depth regressions. Passing the fixture does not establish a universal +compiler depth bound. + +## Reproduced failures + +- O1 cleanup after ANF overflowed on the ordinary driver blocking thread. + The temporary 32 MiB stack has been removed. Core walk/map, occurrence and + free-variable analysis, discard checks, hygiene/substitution, ANF, beta binding + splicing, recursion rewriting, lowering, and constant sharing now use heap + work lists. De Bruijn conversion and term/type/constant target validation also + use work lists. This applies to O0 and O1 assembly without changing their + optimization policies. A 4,096-level trace tree assembles and evaluates on a + 256 KiB stack at both levels, with equivalent results and logs; a separate + 20,000-node Core test exercises walk/map on a 128 KiB stack. +- After assembly succeeded, `nash_plutus::pretty::program` overflowed while + rendering the named UPLC. Driver phase probes isolated this call, before + Flat encoding. The term printer now uses explicit visit/finish frames, + preserving child order and lexical scope. A small-stack regression exercises + 1,024 nested delays. Constant/type/data printing is still recursive. + +Core term printing was also converted to an explicit work list on 30 September. +A 20,000-level term renders on a 128 KiB stack; existing formatting snapshots +remain the compatibility check. Binder type and constant payload printing are +still covered by the nested-type/constant follow-ups below. + +## Remaining candidates, not reproduced + +| Area | Recursive path | Why the parser limit does not settle it | +| --- | --- | --- | +| Flat source chains | `nash-can/src/expression.rs` field access and `build_tree_rec`; `nash-solve/src/solve/expressions.rs` | Parser nesting limit 64 does not limit flat operator/access chains. Equal-precedence operator construction also repeatedly scans the remaining chain. | +| IR type metadata | Derived type equality and `Builder::plutus_type` | Deeply nested types are independent of term-tree depth. | +| Nested constants | Flat `encode_type` / `type_from_tags`, constant equality and pretty printing | Iterative Flat term traversal does not cover nested constant types or data. | +| Module graph | `nash-driver/src/graph.rs` cycle reporting | Import graph depth is independent of source expression nesting. | +| Type unification | `nash-solve/src/unify.rs` structural traversal | Compiler-generated types can be deeper than source types. Lower confidence until a valid input reproduces it. | + +Flat term encoding and decoding already use explicit stacks and have +20,000-delay regressions. Canonicalizer SCC traversal is also iterative. +Driver compilation runs in `spawn_blocking`; the name `tokio-rt-worker` +is not evidence that it ran on an async executor thread. + +## Follow-up order + +1. Compile long flat operator and field-access chains through canonicalization + and solving, not just parsing. Run overflow probes in subprocesses because + a stack overflow can abort the process. +2. Exercise deeply nested type metadata, including its diagnostic rendering. + Prefer explicit work stacks for straightforward traversals. +3. Probe deeply nested constant types and long import cycles independently. +4. Use valid generated programs to investigate type-unification depth. + +Do not replace these checks with a global test-only `RUST_MIN_STACK` setting: +that would hide the production stack boundary. diff --git a/docs/testing.md b/docs/testing.md index 45f1e3c4..83491023 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -520,7 +520,7 @@ across tests, as in Aiken (`aiken-project/src/lib.rs:1173-1176`). - `prepare` returns a `constr` term: `Some` is `constr 0 [constr 0 [prng, body, show]]`, `None` is `constr 1 []`. The stdlib declares `type option 'a = Some 'a | None` in that order; the runner depends on the tags. -- Test programs use the same unoptimized Core passes as validator builds. +- Test programs use the same selected O0/O1 pipeline as validator builds. Optimization does not change user/compiler trace settings or test protocol logs. Compiler traces are enabled; user traces default to verbose unless the owning project explicitly configures a level or the CLI overrides it. Plan 08 remains deferred. Property result tuples/options use native constructors and cases, diff --git a/plans/08-optimizer.md b/plans/08-optimizer.md index 86979a37..895dc645 100644 --- a/plans/08-optimizer.md +++ b/plans/08-optimizer.md @@ -17,15 +17,17 @@ for one leading literal; the retained Chunk 5 scope is complete. Chunk 6 safe unused-binding removal, recursive-member reachability and pre-ANF nonrecursive unused-parameter removal are accepted. Direct force/delay cancellation in Chunk 8 is also accepted. Recursive unused-parameter removal is approved Chunk 6 scope -but remains unimplemented. Known Boolean case folding in Chunk 7 was accepted on 28 September 2026. -Other Chunk 7 case-folding work remains. Continue -with the remaining Chunk 8 rules after Chunk 7, then proceed to -Chunks 9, 10 and 11. Normal build defaults remain O0 pending -Chunk 11 configuration decisions. +but remains unimplemented. Known Boolean, direct/bound native-constructor and +native-list folding in Chunk 7 are accepted. Literal Data-shape folding is also +accepted, as is IData/BData/ListData/MapData/ConstrData producer case folding; +known native-constructor field and native integer/byte case folding are accepted +as well. The retained Chunk 7 scope is complete. Continue +with Chunks 9, 10 and 11. The retained Chunk 8 representation cancellations +are accepted, including integer/byte/list/map Data round trips, UTF-8 round trips +and bound constructor Data projections/reconstruction. Normal build/test defaults are O1; explicit O0 is available in build/test and project config. Current assembly in `nash-codegen/src/program.rs` -rewrites recursion and lowers directly; normal assembly does not yet call the -accepted `nash-ir` passes. +selects O0 or the shared accepted O1 pipeline, then rewrites recursion and lowers. Reuse its existing Core, Builder, traversal and free-variable facilities. Prior experiment executables were removed on 28 September 2026 at the user's @@ -33,13 +35,30 @@ request. The measurements below are historical records; accepted semantic snapshots and the explicit budget regression runner remain. Future trial sources are temporary and should be removed after recording their decision. -Accepted decisions (26 September 2026): +Test layout cleanup (28 September 2026): codegen optimizer tests are grouped by +pass. `known_case.rs` contains Boolean, constructor, list and Data submodules; +`dead_code.rs` contains binding and recursive reachability submodules. +`unused_params.rs` is one pre-ANF suite using the actual accepted placement; +the old post-ANF test helper is removed, while its useful semantic fixtures remain. +Complete calls with later effectful arguments now test successful pre-ANF reduction, +rather than retaining the obsolete post-ANF no-change expectation. Independent +properties follow snapshots; snapshots alone specify exact visible structure. +Production pass behavior, the accepted pipeline and performance baseline are unchanged. +At this cleanup checkpoint, Data folding was still isolated pending acceptance; +historical measurement records remain. +Cleanup validation: 498 codegen and 69 IR tests pass, along with strict workspace +Clippy and formatting. All 188 snapshot moves retain their fixtures; O0 sections +are unchanged. All 23 performance baseline rows still match. Nextest stalled +during discovery, so the focused suites were run through Cargo instead. + +Accepted decisions (26 September 2026, reconciled with later keep decisions): - Start with binder hygiene, static-parameter lifting and A-normal form (ANF), retaining explicit recursive workers in Core. Lift before ANF splits calls; do not reconstruct application chains to recover this information. - Optimize while recursive functions remain explicit `LetRec`, then rewrite - recursion once, normalize the generated code and run cleanup. + recursion once and lower the generated code directly. Normalize only once, + before Core optimization; do not rerun ANF after recursion rewriting. - Consider inlining small functions even when used multiple times. This is a candidate to measure, not blanket permission to duplicate code. - Evaluate optimizations one chunk or one individual rewrite at a time. Review @@ -1259,20 +1278,328 @@ only accepted optimized output; original Core/O0 UPLC and isolated-pass evidence including results and logs, are byte-for-byte unchanged. The explicit 23-row budget check passes. -Next proposed trial: cases on known let-bound native constructors. Source +**Let-bound constructor folding (accepted).** Source `decision_tree::compile` binds the subject before matching, so direct-subject -folding alone misses this normal source shape. Track a constructor binding's tag -and already-evaluated fields, reuse those fields at matching cases, and let -ordinary dead-binding cleanup remove the construction only when unused. Trial -this with ANF field bindings so effects remain evaluated once in their original -order, including ignored fields and cases inside cold branches. Cover aliases, -multiple matches and a constructor value that also escapes. This is a proposed -extension, not part of the accepted direct-constructor rule. - -Known native-list cases (`Nil`/`Cons`) can follow. Native `CaseKind::Int`/`Bytes` -literal folding remains in scope, but currently has no source codegen producer: -source literal patterns call their selected conversion and equality traits. -Do not bypass those calls to manufacture an optimization opportunity. +folding alone misses this normal source shape. `reduce_bound_constr` tracks +lexical constructor bindings and their variable aliases by globally unique name. +It selects only complete, consecutive native tag tables with a matching tag and +exact field arity, using the same table checks as direct-constructor folding. + +For constructors with eligible matches, non-variable fields are named once at +the original construction site. This includes lambda/delay atoms: copying them +would duplicate their internal binder IDs. Naming literals also leaves the +existing constant propagation size policy in charge. Matching branches receive +aliases to those stable field references. The original constructor stays until +ordinary cleanup proves it unused, so escaping values and repeated matches work. +Strict fields, including ignored fields, stay evaluated once in source order, +even when the matched case sits in a cold branch. + +The pass runs on ANF after ordinary cleanup, followed by the existing cleanup +loop. Selecting a branch can expose leading lets, which existing beta binding +splicing flattens; ANF is not rerun. Repeat folding plus cleanup to a fixed point: +folding an outer case can expose aliases that make an inner case known. This extension is now accepted in both the shared snapshot pipeline and the +performance pipeline, after ordinary ANF cleanup. `simplify_bound_constr` owns +the fold/cleanup fixed point. Isolated-pass snapshots retain the trial evidence. + +Temporary measurements compare accepted optimization against accepted plus this +trial and cleanup, with identical lowerer sharing settings. Of 85 cases: + +- 60 generated cases cover 0/1/2/4/8 fields, 1/2/4 matches, pure/traced fields, + and retained/escaping constructor values. All improve CPU and memory. +- Two actual Nash examples improve: one `case One 42` saves 112,000 CPU, + 700 memory and 16 Flat bytes (22 to 6); two matches on `Two 20 22` save + 304,000 CPU, 1,900 memory and 27 bytes (37 to 10). +- All 23 existing workloads, including V3 vesting inputs, are unchanged. + +Across the 62 improved cases, CPU savings range from 48,000 to 816,000 and memory +savings from 300 to 5,100. Serialized size improves in 60 cases by up to 40 bytes; +the other 25 cases are unchanged. No measured metric regresses; all results and +ordered logs match. These are fixture results, not a real-validator distribution. +Temporary measurement code is removed after recording these findings. + +Validation: 18 new reviewed snapshots cover aliases, repeated matches, escaping +values, strict traced/failing fields before cold matches, function/delay fields +and captures, nested matches exposed by cleanup, nullary/reordered cases, absent +tags, empty tables, arity mismatches and malformed tables. All 473 codegen tests +pass using the compiled test binary after focused nextest discovery stalled. +Strict workspace Clippy, formatting and the unchanged 23-row accepted performance +baseline pass. A full `cargo nextest run --workspace` was attempted, but stopped +after two `nash-driver` rustc processes remained idle for over two minutes without +diagnostics; this trial does not claim a completed full-workspace test run. + +Adoption validation: all 475 codegen unit/integration tests pass through the +compiled test binaries, including both V3 vesting tests. Strict Clippy and +formatting pass. Forty-one reviewed snapshots change accepted optimized output; +original Core/O0 UPLC, isolated-pass evidence, results and logs remain unchanged. +All 23 performance rows and source inputs remain identical; baseline settings and +provenance record the added pass. Full-workspace nextest and Cargo attempts were +stopped after idle compiler stalls in driver/language-server targets, so full +workspace test completion is not claimed. + +**Known native-list folding (accepted 28 September 2026).** +`reduce_list` handles literal `ProtoList` subjects and let-bound literals or +exactly saturated `MkCons` values, following variable aliases. It validates the +whole branch table: unique `Nil` with zero binders and `Cons` with two binders. +The selected arm receives head/tail bindings, or selection uses the default or +an explicit error when that arm is absent. Malformed tables remain unchanged. + +`MkCons` stays strict at its original position even when folding removes its last +use. Besides evaluating head then tail, the builtin checks that the head is a +constant, the tail is a list, and their runtime element types match. Core type +annotations alone do not prove those checks; removing the construction belongs +to a separately justified builtin reduction. Partial/oversaturated `MkCons` and +other unknown subjects do not establish list facts. + +Matched bound lists share stable head/tail bindings across their cases. This +avoids copying lambda/delay operands and repeated literal-tail serialization. +Literal tails retain the original element metadata. The original list stays if +it escapes. `simplify_list` repeats folding and the accepted cleanup to expose +nested tail matches; ANF is not rerun. The keep decision adds this entry point to the shared accepted snapshot and +performance pipelines, replacing the constructor-only cleanup entry point. +Production assembly remains O0. + +Temporary measurements compare accepted optimization with accepted plus this +trial using identical lowerer sharing and V3 budgets. Across 86 cases (42 +construction/head-use combinations, 18 literal-tail cases, three Nash examples, +and the existing 23 workloads), results and ordered logs match. CPU and memory +improve in 63 cases, with 23 unchanged and no regressions. Savings range from +32,000 to 544,000 CPU and 200 to 3,400 memory. Size improves in 57 cases by up to +43 bytes, is unchanged in 23, and increases by 11–200 bytes in six cases that +retain both the original 32/128-element literal list and its derived tail. +Sharing derived fields reduced the initial worst growth from 804 to 200 bytes. +These are fixture measurements, not a real-validator distribution. + +The actual Nash empty-list example saves 32,000 CPU, 200 memory and 6 bytes; +nonempty head selection saves 64,000 CPU, 400 memory and 5 bytes; tail selection +saves 64,000 CPU, 400 memory and 6 bytes. The existing 23 workloads are unchanged. +Temporary measurement code is removed after recording the findings. + +Validation: all 486 codegen library tests pass, including 30 new list snapshots; +existing snapshots are unchanged. Formatting and strict all-target/all-feature +Clippy pass. The separate 23-case performance baseline check passes. Nextest +stalled during test discovery, so the codegen suite was run with Cargo instead; +full-workspace test completion is not claimed for this trial. + +Adoption validation: 486 codegen library tests and two vesting integration tests +pass, with 36 updated snapshots and unchanged unoptimized Core/UPLC sections. +Nextest again stalled at discovery; freshly built test binaries passed directly. +Strict all-target/all-feature Clippy and formatting pass. All 23 performance +rows and sources are unchanged; baseline settings now include list folding. + +**Known literal Data folding (accepted 28 September 2026).** +`reduce_data` selects `DataI`, `DataB`, `DataList`, `DataMap` or `DataConstr` +for direct `Constant::Data` subjects and let-bound literals/aliases. It validates +all branches first (unique Data tests and exactly one payload binder). Missing +arms use the default or an explicit error. Unknown subjects and malformed tables +remain untouched. This is shape selection, not builtin wrap/unwrap cancellation. + +Payloads exactly match runtime unwraps: native integer/bytes, a list of Data, +a list of native Data/Data pairs, or one native `(integer tag, list Data)` pair. +Nested children stay Data; map order and duplicate keys, empty container metadata, +arbitrary integers and full-width constructor tags are preserved. Matched bound +literals share one derived payload at their original binding. Literal payloads +are values, so creating them cannot move traces/failures. `simplify_data` repeats +this rule with accepted list/constructor cleanup without another ANF pass. + +The isolated experiment compares accepted optimization with accepted plus this +trial, using the same sharing and V3 budgets. Across 125 cases (102 targeted +shape/size/use/escape combinations plus 23 existing workloads), results and logs +match. CPU and memory improve in 102 cases and are unchanged in 23; no regressions. +Savings range from 578,517–2,172,476 CPU and 2,964–10,956 memory. Size improves in +57 cases by 4–89 bytes, is unchanged in 23, and grows in 45 by 1–1,210 bytes. +Of those increases, 25 retain the original Data and its native payload (maximum +1,210 bytes); 20 discard the original (maximum 743 bytes). Native lists/maps can +encode larger than CBOR Data, and accepted short-byte propagation can duplicate +small payloads. These measurements are synthetic fixtures, not a real-validator +distribution. No size heuristic or constant propagation exception is added. + +The 23 existing workloads remain unchanged. Source `I 42` currently emits an +`IData` call, which this literal-only trial intentionally does not recognize. +Builtin-produced Data shapes require a separate strictness/check-preserving trial; +wrap/unwrap cancellation remains Chunk 8. The keep decision adds `simplify_data` +to the shared accepted snapshot and performance pipelines, replacing the list-only +cleanup entry point. Normal build assembly remains O0. Temporary performance +code is removed after recording the results. + +Validation: 497 codegen library tests pass, including 59 new Data snapshots; +existing snapshots are unchanged. Tests cover all payload shapes and metadata, +missing/default branches, shared aliases, strict traces/failures, returned and +capturing closures/delays, nested Data/list folding, unknown/runtime-invalid +subjects, full-width tags/integers and malformed unselected branches. Snapshot +output precedes independent scope, ANF, type-view, equivalence and idempotence +checks. Formatting and strict all-target/all-feature Clippy pass. Nextest stalled +at discovery; the freshly built binary passed directly. Full-workspace test +completion is not claimed for this isolated trial. + +Adoption validation: 498 codegen and 69 IR tests pass, with 50 updated snapshots +and unchanged unoptimized Core/UPLC sections. Formatting, strict workspace Clippy +and the separate performance check pass. All 23 performance rows and source inputs +are unchanged; baseline settings now include Data folding. Nextest stalled during +discovery, so the freshly built binaries were run directly. + +**IData/BData producer case folding (28 September 2026), accepted.** +`reduce_data_wrappers` recognizes exactly saturated `IData`/`BData` let bindings +and aliases in hygienic ANF. Both literal operands (`iData 42`) and variable +operands (`iData x`) qualify. It selects the known Data arm and binds its payload +to the original operand; missing shapes use the default or error. All branch +shapes and binder counts must be valid, including unselected arms. + +The original builtin remains strict in its original position, even when its +result becomes unused: invalid runtime operands must still fail. Non-variable +operands are named once before the producer, preventing duplicated lambda/delay +binders. Traces, failures, intervening effects and suspended matches retain their +evaluation order. Partial, overapplied, traced and unrelated producers and +unknown Data parameters do not establish wrapper facts. `simplify_data_wrappers` +repeats producer folding with accepted cleanup without another ANF pass. The user +accepted the measured size tradeoffs without another heuristic. The shared accepted +snapshot and performance pipelines now use `simplify_data_wrappers`; normal build +assembly remains O0 pending Chunk 11. + +The separate experiment compares accepted optimization against accepted plus the +trial with identical lowering/sharing. All 191 cases have matching results and +logs: 168 targeted integer/byte literal and runtime-parameter combinations plus +23 existing source workloads. CPU and memory improve in 172 cases and remain +unchanged in 19; neither regresses. Savings range from 115,119–2,124,476 CPU and +64–10,656 memory. Size improves in 160 cases by 16–85 bytes, is unchanged in 19, +and grows in 12 by 12–182 bytes. All size increases involve used short byte +literal payloads duplicated by accepted constant propagation; they occur both +with and without the original Data escaping. Runtime-parameter cases have no +size regressions. These are synthetic measurements, not a real-validator sample. + +Four existing source workloads improve: `dataMatch` saves 579,119 CPU, 2,964 +memory and 30 bytes; `dataMiss` saves 510,375 CPU, 2,632 memory and 29 bytes; +`validationPass` saves 579,119 CPU, 2,964 memory and 27 bytes; `validationFail` +saves 115,119 CPU, 64 memory and 27 bytes. The other 19 are unchanged. The +23-case accepted baseline check passes. Temporary measurement source is removed +after recording results; performance experiments remain outside normal tests. + +Validation: 509 codegen and 69 IR library tests pass, including 50 new snapshots +in the existing `known_case::data::wrappers` module. Existing snapshots are +unchanged. Snapshot output precedes independent scope, type-view, ANF, semantic +and log equivalence, and idempotence checks. Malformed tables retain their lowering +errors. Formatting, diff checks and strict workspace Clippy pass. Nextest stalled +at discovery; Cargo test passed after restarting a stalled compiler invocation. +The full workspace test suite was not rerun for this isolated trial. + +Adoption validation: 509 codegen and 69 IR tests pass. The 34 updated snapshots +retain identical unoptimized Core/UPLC and isolated-pass evidence. The reviewed +23-case baseline incorporates only the four workload improvements listed above; +source inputs, results, logs and all O0 measurements are unchanged. Nextest stalled +during discovery, so the freshly built binaries were run directly. Both formatter +checks, workspace and isolated-runner strict Clippy, and the explicit performance +baseline check pass. + +**ListData/MapData producer case folding (28 September 2026), accepted.** +`reduce_data_wrappers` extends the scalar-wrapper algorithm to exactly +saturated `ListData` and `MapData` bindings. `DataList` receives the original +native Data list; `DataMap` receives the original native list of Data pairs. +The producer remains strict, including when no branch uses the payload, so wrong +operand types and incorrect empty-list element metadata still fail. Successful +MapData construction preserves entry order and duplicate keys. Alias handling, +non-variable operand sharing, full branch-table validation and defaults use the +same code as the accepted scalar rule. Adoption removes the temporary collection +switch and separate trial entry points; `simplify_data_wrappers` now handles all +four wrappers with accepted cleanup without another ANF pass. Both accepted +pipelines pick up the rule through that existing entry point. Normal build assembly +remains O0 pending Chunk 11 configuration decisions. + +The separate experiment compares accepted optimization against accepted plus +this trial with identical sharing and V3 budgets. All 215 cases match results and +logs. The 192 targeted cases cover lists/maps of lengths 0, 1, 4 and 16, one/two/four +matches, used/ignored payloads, escaping/nonescaping original Data and literal/runtime +parameter operands. Every targeted case improves CPU, memory and size; savings +range from 478,375–2,145,232 CPU, 2,432–10,656 memory and 18–85 bytes. All 23 existing +source workloads are unchanged, and their accepted baseline check passes. These +are synthetic coverage cases, not a representative real-validator distribution. +Temporary experiment source is removed after recording the results. + +Validation: nextest passes all 582 tests across the codegen/IR binaries on retry +(7.06 seconds); the first invocation stalled at discovery. There are 78 new +snapshots covering both wrappers in the existing module. Four existing snapshots +update isolated evidence and generated binder IDs; accepted comparison output is +otherwise unchanged. Cases cover literal/runtime operands, empty/nonempty and +runtime-built collections, wrong list/pair metadata even on empty or unused +payloads, duplicate map keys and order, aliases, repeated matches, strict effects, +returned/capturing functions, defaults, saturation and malformed unselected arms. +Scope, ANF, type-view, equivalence/log and idempotence checks follow snapshots. +Formatting, strict workspace Clippy, temporary-runner Clippy and the separate +accepted performance check pass. Full-workspace tests were not rerun for this trial. + +Adoption validation: 511 codegen and 69 IR library tests pass; 64 snapshots update +only accepted optimized output, preserving identical O0 and isolated-pass evidence. +All 23 performance rows and source inputs remain unchanged; baseline settings now +name the adopted collection wrappers. Formatting, strict workspace/runner Clippy +and the explicit performance check pass. Nextest stalled at discovery; the freshly +built library binaries passed directly. The temporary collection switch and trial +entry points are removed. + +**ConstrData producer shape folding (28 September 2026), accepted.** +`reduce_constr_data` recognizes exactly saturated, let-bound `ConstrData` producers +and aliases in hygienic ANF. It validates the full Data branch table, selects +`DataConstr`, and uses the original default or error when that arm is absent. +The original producer remains strict at its existing position, preserving tag +and field evaluation, runtime type checks and tag-range behavior. Partial, +overapplied, traced and unknown producers do not establish facts. + +Core has no general constructor for the dynamic native `(int, list Data)` pair +that `DataConstr` binds. Therefore this step removes `chooseData` dispatch but +retains `UnConstrData(scrutinee)` at the original case site when the selected +payload is used. Unused payloads and defaults need no extraction, matching ordinary +lowering. This does not substitute tag/fields directly or change pair representation. +`simplify_constr_data` composes the rule with accepted cleanup without another +ANF pass. Both shared snapshot and performance pipelines now use this entry point. +Normal build assembly remains O0 pending Chunk 11 configuration decisions. + +Across 215 accepted-versus-trial comparisons, results and logs match; 193 improve +CPU, memory and size and 22 are unchanged, with no regressions. The 192 targeted +cases cover tags 0, 59 and `u64::MAX`, zero/four fields, one/three matches, literal +or runtime arguments, escaping/nonescaping Data and ignored/pair/tag/fields payload +uses. Savings range from 366,375–1,307,125 CPU, 1,732–6,496 memory and 16–51 bytes. +One existing source workload, `Workloads.decoding`, improves by 366,375 CPU, 1,732 +memory and 19 bytes; the other 22 are unchanged. These are synthetic coverage +measurements. The accepted baseline is unchanged, and temporary runner source is +removed after recording the results. + +Validation: 518 codegen, 69 IR and two vesting tests pass (589 total) in the +freshly built binaries after nextest stalled at discovery. There are 39 new +snapshots and one updated isolated producer example; existing accepted-pipeline +Core/UPLC output is unchanged. Tests cover operand order/failure, wrong types, +empty/nonempty fields, alias/repeated/captured pair uses, cold producers, defaults, +partial/overapplied/traced producers and malformed tables. Scope, type-view, ANF, +semantic/log equivalence and idempotence checks follow executable snapshots. +Formatting, strict workspace/temporary-runner Clippy and the separate accepted +performance baseline check pass. Full-workspace tests were not rerun for this trial. + +Adoption validation: all 589 codegen/IR/vesting tests pass in fresh binaries +following a nextest discovery stall. The 34 updated snapshots retain identical +unoptimized Core/UPLC and isolated-pass evidence. The reviewed performance baseline +incorporates only the `decoding` improvement above; all source inputs, O0 metrics, +results and logs are unchanged. Formatting, strict workspace/runner Clippy and +the explicit baseline check pass. + +The evaluator currently panics for negative tags and tags above `u64::MAX`. +Those two fixtures render before/after Core and UPLC and independently check retained +construction without evaluating that existing panic path. In-range boundary tags +are evaluated normally. This is case folding, not permission to remove producers +through cancellation (Chunk 8). + +**Native integer/byte literal cases (29 September 2026), accepted.** +`reduce_literals` selects a matching branch or default for literal subjects, +inside the existing cleanup fixed point. The entire table must have tests of the +correct kind, no duplicate tests and no binders. Invalid tables and missing +matches without defaults remain unchanged. Effectful/unknown subjects are not +folded by this rule; strict surrounding bindings retain their evaluation. +The rule preserves the enclosing result type and selected branch delay boundaries. + +These Core kinds currently have no source codegen producer: source literal +patterns call their selected conversion and equality traits. Those calls are +not bypassed. Hand-built Core snapshots cover hits, misses, defaults, errors, +empty tables, unknown/effectful subjects, delayed results and malformed tables. +An isolated 80-case experiment covered integer/byte tables of 0, 1, 3, 8 and 32 +branches, early/middle/late hits and misses, with/without defaults. 64 cases +improved CPU, memory and size; 16 missing-match cases were unchanged. Maximum +savings were 4,794,656 CPU, 19,532 memory and 374 Flat bytes. Results/logs matched; +the temporary runner was removed. This completes the retained Chunk 7 scope. **Future late UPLC application packing, separate from Core folding.** Measure replacing a chain such as `f a b c` with native @@ -1293,9 +1620,25 @@ and constructor-field evaluation in the original order. An ignored failing field must still fail. Preserve out-of-range/malformed-case errors; do not assume every hand-built Core case has a matching branch. -Simplify fields of known constructors without dropping observable evaluation of -other fields. ANF often makes that evaluation explicit; do not mistake a selected -field alone for the original strict construction. +**Known native-constructor fields (29 September 2026), accepted.** +The existing bound-constructor reducer now replaces `Field` of a known tag-zero +constructor with the selected field reference. It follows aliases and requires +an exact field count and an in-range index: other tags still fail, too few fields +still return a partial selector, and extra fields still apply the selected value. +Fields are named at the original construction site, preserving strict evaluation +and sharing lambda/delay values without duplicating binders. Escaping records +retain their construction; ordinary cleanup removes unused safe constructions. +Nested accesses become eligible through the existing cleanup fixed point. + +The accepted test/performance pipeline includes this rule; normal build integration +remains Chunk 11. Snapshot fixtures cover every position at arities 1, 3 and 8, +aliases, repeated access, escaping records, ordered traces and ignored failures, +nested records, returned functions, delay boundaries and malformed runtime shapes. +The temporary 144-case experiment covered literal, runtime and computed fields, +one/three uses, and escaping/non-escaping records. All 144 improved: CPU by +96,000–800,000, memory by 600–5,000 and Flat size by 5–46 bytes. The existing +23-case baseline was unchanged. Results and logs matched in every case; the +temporary runner was removed after measurement. Tests: selected/default branches, empty/nonempty lists, each Data shape, field ordering, ignored failing/traced fields, returned functions/delays, and Big/little @@ -1334,6 +1677,76 @@ cases still match. Adoption validation also passed all 519 tests without snapsho changes, strict Clippy and formatting. The 23 baseline rows remain identical; only pipeline settings and revision metadata changed. +**Direct integer inverse cancellation (29 September 2026), accepted in O1.** +`inverse::reduce` cancels a directly nested `unIData (iData x)` when successful +evaluation of `x` is structurally known to produce a native integer: an integer +literal, a saturated `unIData`, or traces around those expressions. It keeps +`x` at the original evaluation point and preserves the result type view. +Type annotations alone are not proof: unknown variables, forged annotations, +wrong-kind values, partial applications and the reverse direction remain intact. +The retained `unIData` can still fail; cancellation does not remove its check. + +The rule handles adjacent calls before ANF in O1; let-bound producers and broader +integer-result proofs remain subsequent work. Snapshots cover successful/failed decoding, +traces, nested pairs, cold branches, unknown arguments, forged metadata, +partial applications and both reverse-direction outcomes. The temporary +16-case isolated benchmark used negative/zero/positive/large integer values, +literal/decoded operands and traced/untraced paths. Every case saved 100,043 CPU, +464 memory and 3–4 Flat bytes with identical results/logs. The runner was removed. + +**Representation cancellation expansion (3 October 2026), accepted under the user's zero-regression condition.** +`inverse::reduce` now handles `unBData(bData x)`, `unListData(listData x)`, +`unMapData(mapData x)` and `decodeUtf8(encodeUtf8 x)`, alongside the integer rule. +The corresponding reverse rules require the exact Data variant or valid UTF-8. +Evidence comes from actual constants, saturated known producers, traces and +lexical let bindings, never Core type annotations. List/map constants must have +both the correct runtime tags and valid element/pair payloads. Failures inside +retained operands still occur at the original evaluation point. + +Let-bound cancellation reuses operand variables and retains the original strict +producer binding. It does not duplicate literals or computations, or introduce +bindings. Unary bound cancellation still requires shape evidence: the broader +check-preserving rule was semantically valid but grew five malformed-input +fixtures by one Flat byte, so that rule was narrowed before acceptance. + +Constructor Data has two operands and is handled separately. Projection through +a bound `constrData tag fields` returns the existing tag/fields variable while +retaining the validating construction. Reconstruction from `fstPair p` and +`sndPair p` reuses the Data variable only when both refer to the same bound +`unConstrData` result. It retains the decoder binding. Tag-range, field-shape, +variant checks and evaluation of unused fields remain in place. Arbitrary direct +constructor round trips and unknown-shape unary conversions remain unchanged. + +The pass runs before ANF and within the existing `small_inline::simplify` cleanup +loop, before beta cleanup. The latter catches bindings exposed by ANF/inlining; +ANF is not repeated. The pass requires globally unique, well-scoped binders. + +Comparison against previous O1 at `5eaa7564e6b21b4815be93dd3c4c53aebb66edf7` +used the explicit runner with Plutus V3/PV11, UPLC 1.1.0 and the bundled V3 cost +model. All 108 rows preserve results/logs: 47 improve, 61 are unchanged, and none +increase CPU, memory or raw Flat bytes. The original 23 baseline rows are exactly +unchanged; 85 representation fixtures now form permanent explicit regressions. +Representative savings relative to previous O1: + +| Fixture | CPU saved | Memory saved | Flat bytes saved | +| --- | ---: | ---: | ---: | +| Direct byte round trip | 143,325 | 764 | 6 | +| Direct Data-list round trip | 171,785 | 764 | 6 | +| Direct Data-map round trip | 204,869 | 764 | 6 | +| Direct UTF-8 round trip | 247,879 | 712 | 6 | +| Bound constructor reconstruction | 539,887 | 1,664 | 12 | +| Reconstruction of known constructor Data | 642,038 | 2,196 | 18 | + +Semantic coverage includes both directions, traces, failures, cold branches, +aliased/captured/escaping bindings, partial/extra application, wrong runtime tags, +forged metadata and malformed constructor inputs. Inconsistent raw list/map +payloads receive noninterference checks without executing runtime panic paths. +Validation: all 3,827 workspace nextest tests pass; the final cancellation +fixtures also compare the complete O1 pipeline against O0. Root and isolated +performance-workspace strict Clippy, formatting and the explicit 108-row baseline +check pass. The retained Chunk 8 scope is complete; further shape inference or +conversion families require their own evidence and measurements. + Cancel `force (delay x)` and valid inverse builtin pairs such as `unIData (iData x)`. Establish preconditions per direction and representation; `iData (unIData d)` is not an unconditional replacement for arbitrary Data. @@ -1394,6 +1807,21 @@ rule. No assumption that projection wins, and no per-program tuning engine. ## Chunk 11 — Composition, convergence and final configuration +**O1 integration (29 September 2026), accepted scope.** +Production `nash-codegen::optimizer` owns the accepted Core pipeline; snapshots +and performance measurements reuse it. Build/test accept `-O0`/`-O1` and +`--optimize 0|1`; application/package config accepts integer `optimize: 0|1`. +The build/test default is O1. Workspace members own these settings, as with trace/target +settings. CLI overrides each owning project's level. No O2 is defined. +O1 preserves enabled traces and their order; trace generation remains independent. +It includes accepted direct integer inverse cancellation before the single ANF. +Post-recursion work is freshening and optimized lowering with builtin/constant +sharing, never a second normalization. Explicit comptime execution remains O0. +Chunks 9–10 and final convergence review stay open. +Default-O1 validation exposed deep-tree stack overflows; assembly traversals now use +heap work lists, with no stack enlargement; UPLC term printing is also iterative. Remaining depth risks and +follow-up probes are recorded in [the compiler stack audit](../docs/research/compiler-stack-audit.md). + Compose only the accepted passes. Establish their actual order from interactions: inlining exposes dead code and known cases, sharing can conflict with inlining, and recursion rewriting creates cleanup opportunities. Reuse the same accepted diff --git a/tools/optimizer-perf/Cargo.lock b/tools/optimizer-perf/Cargo.lock index 182614f8..c6f44e2c 100644 --- a/tools/optimizer-perf/Cargo.lock +++ b/tools/optimizer-perf/Cargo.lock @@ -315,7 +315,7 @@ dependencies = [ [[package]] name = "nash-ast" -version = "0.11.0" +version = "0.12.0" dependencies = [ "bumpalo", "nash-region", @@ -324,7 +324,7 @@ dependencies = [ [[package]] name = "nash-can" -version = "0.12.0" +version = "0.13.0" dependencies = [ "bumpalo", "nash-ast", @@ -334,7 +334,7 @@ dependencies = [ [[package]] name = "nash-codegen" -version = "0.4.2" +version = "0.4.3" dependencies = [ "bumpalo", "nash-ast", @@ -360,7 +360,7 @@ dependencies = [ [[package]] name = "nash-constrain" -version = "0.8.2" +version = "0.8.3" dependencies = [ "bumpalo", "nash-ast", @@ -370,7 +370,7 @@ dependencies = [ [[package]] name = "nash-ir" -version = "0.3.3" +version = "0.3.4" dependencies = [ "nash-ast", "nash-plutus", @@ -378,7 +378,7 @@ dependencies = [ [[package]] name = "nash-nitpick" -version = "0.3.2" +version = "0.3.3" dependencies = [ "bumpalo", "hex", @@ -405,7 +405,7 @@ dependencies = [ [[package]] name = "nash-parse" -version = "0.8.0" +version = "0.9.0" dependencies = [ "bumpalo", "nash-region", @@ -414,7 +414,7 @@ dependencies = [ [[package]] name = "nash-plutus" -version = "0.3.2" +version = "0.3.3" dependencies = [ "append-only-vec", "blst", @@ -438,7 +438,7 @@ version = "0.3.0" [[package]] name = "nash-solve" -version = "0.9.1" +version = "0.9.2" dependencies = [ "bumpalo", "nash-ast", @@ -449,7 +449,7 @@ dependencies = [ [[package]] name = "nash-source" -version = "0.9.0" +version = "0.10.0" dependencies = [ "bumpalo", "nash-region", @@ -457,7 +457,7 @@ dependencies = [ [[package]] name = "nash-test" -version = "0.4.1" +version = "0.4.2" dependencies = [ "cryptoxide", "nash-config", diff --git a/tools/optimizer-perf/README.md b/tools/optimizer-perf/README.md index 7fa7eca2..179b57f0 100644 --- a/tools/optimizer-perf/README.md +++ b/tools/optimizer-perf/README.md @@ -19,10 +19,11 @@ mismatch, a compilation failure or an exhausted budget. `measure` prints JSON without changing any baseline. Debug/release profiles produce the same ledger budgets: these are CEK costs, not Rust wall-clock benchmarks. -The 23 rows include the original 20 covering list traversal, static recursion, Data matching and +The 108 rows include the original 20 covering list traversal, static recursion, Data matching and misses, field decoding, validation success/failure, the real base Logic helpers, and six ledger scenarios each for the existing Vesting and VestingParam source -fixtures, plus constant-prefix two-use, cold and loop regressions. Validators receive one V3 ScriptContext containing TxInfo, redeemer and spending +fixtures, plus constant-prefix two-use, cold and loop regressions and 85 representation +cancellation cases shared with semantic tests. Validators receive one V3 ScriptContext containing TxInfo, redeemer and spending datum; the optional minimum-lock parameter is applied off-chain first. Times are POSIX milliseconds from the validity-range lower bound. Validator CPU/memory include parameter and context application; @@ -30,7 +31,7 @@ validator bytes exclude those arguments. Ordinary expression fixtures include their inputs in the measured program. The `before` pipeline is O0 (recursion rewrite and lowering). The `after` pipeline -is the accepted static lifting, pre-ANF unused-parameter removal and direct native-constructor folding, one ANF normalization and rules 1+2+3+4 plus safe dead-binding, recursive-reachability, force/delay and known-Boolean cleanup, +is the accepted static lifting, pre-ANF unused-parameter removal, direct native-constructor folding and representation inverse cancellation, one ANF normalization and rules 1+2+3+4 plus safe dead-binding, recursive-reachability, representation cancellation, force/delay, known-Boolean/integer/bytes, bound-constructor, known-constructor field, known-list, literal-Data and IData/BData/ListData/MapData/ConstrData producer cleanup, then recursion rewrite, binder freshening and lowering with both Chunk 5 sharing steps. No second normalization or ANF-dependent cleanup runs after recursion rewriting. Rule 3 was accepted on 27 September 2026. These figures record current behavior, including overhead from ANF; they are not a claim that the incomplete optimizer beats O0 everywhere. @@ -101,3 +102,6 @@ Their measured findings and keep/defer decisions remain in `plans/08-optimizer.m accepted behavior retains semantic snapshots and the explicit budget baseline. Use the temporary experiment runner above for future trials, then remove trial source once its decision is recorded. + +The Core pipeline is shared with production O1 in `nash-codegen::optimizer`. +Builds and tests default to O1; these measurements still compare explicit O0 and O1. diff --git a/tools/optimizer-perf/baseline.json b/tools/optimizer-perf/baseline.json index 1b4fad9d..ebb62ed1 100644 --- a/tools/optimizer-perf/baseline.json +++ b/tools/optimizer-perf/baseline.json @@ -1,8 +1,9 @@ { - "settings": "v1; Plutus V3/PV11; UPLC 1.1.0; bundled V3 default cost model; CPU=100000000; memory=2000000; raw Flat bytes before ledger application; O0 vs static lift/unused-parameters/known-constr/ANF once/rules1+2+3+4+dead-bindings+recursive-reachability+force-delay+known-bool/recursion/hygiene/lower+forced-builtin-sharing+constant-prefix-sharing", + "settings": "v1; Plutus V3/PV11; UPLC 1.1.0; bundled V3 default cost model; CPU=100000000; memory=2000000; raw Flat bytes before ledger application; O0 vs static lift/unused-parameters/known-constr/representation-inverse/ANF once/rules1+2+3+4+dead-bindings+recursive-reachability+representation-inverse+force-delay+known-bool+int-bytes/bound-constr+known-fields+list+data+idata-bdata-listdata-mapdata-constrdata-cleanup/recursion/hygiene/lower+forced-builtin-sharing+constant-prefix-sharing", "sources": { "Cardano.Tx": "module Cardano.Tx exposing (validAfter, signedBy)\n\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (Eq)\nimport Lift exposing (lower)\n\n-- V3 TxInfo field 7 is the validity interval. Require a finite lower bound.\n-- Times are POSIX milliseconds, not slots or the current wall-clock time.\nvalidAfter : Data -> int\nvalidAfter tx =\n case tx of\n Constr pair(0, [ _, _, _, _, _, _, _, Constr pair(0, [ Constr pair(0, [ Constr pair(1, [ I time ]), _ ]), _ ]), _, _, _, _, _, _, _, _ ]) -> time\n _ -> fail\n\n-- V3 TxInfo field 8 contains every extra signatory.\nsignedBy : Data -> Bytes -> bool\nsignedBy tx owner =\n case tx of\n Constr pair(0, [ _, _, _, _, _, _, _, _, List signers, _, _, _, _, _, _, _ ]) -> hasSigner signers (lower owner)\n _ -> fail\n\nhasSigner : list Data -> bytes -> bool\nhasSigner signers owner =\n case signers of\n [] -> False\n B signer :: rest ->\n if Builtin.equalsByteString signer owner then True\n else hasSigner rest owner\n _ -> fail\n", "Eq": "module Eq exposing ( Eq )\n\n\nimport Literal\nimport Logic exposing ( not, xor, (&&) )\nimport Primitive exposing (..)\nimport Builtin exposing (..)\n\n\n{-| Compare values for equality and inequality. -}\ntrait Eq 'a where\n eq : 'a -> 'a -> bool\n\n neq : 'a -> 'a -> bool\n neq a b = not (eq a b)\n\n\nimpl Eq int where\n eq = Builtin.equalsInteger\n\n\nimpl Eq bytes where\n eq = Builtin.equalsByteString\n\n\nimpl Eq string where\n eq = Builtin.equalsString\n\n\nimpl Eq bool where\n eq a b = not (xor a b)\n\n\nimpl Eq unit where\n eq _ _ = True\n\n\nimpl Eq (list ('a : Big)) where\n eq xs ys =\n eq (Builtin.listData xs) (Builtin.listData ys)\n\n\nimpl Eq 'a => Eq (list ('a : Little)) where\n eq xs ys =\n case xs of\n [] ->\n case ys of\n [] ->\n True\n\n _ :: _ ->\n False\n\n x :: restX ->\n case ys of\n [] ->\n False\n\n y :: restY ->\n eq x y && eq restX restY\n\n\nimpl ( Eq 'a, Eq 'b ) => Eq (pair 'a 'b) where\n eq a b =\n let\n pair(firstA, secondA) = a\n\n pair(firstB, secondB) = b\n in\n eq firstA firstB && eq secondA secondB\n\n\nimpl Eq (map ('k : Big) ('v : Big)) where\n eq xs ys = eq (Builtin.mapData xs) (Builtin.mapData ys)\n\n\nimpl ( Eq 'k, Eq 'v ) => Eq (map ('k : Little) 'v) where\n eq = eqMapEntries\n\n\nimpl Eq 'v => Eq (map ('k : Big) ('v : Little)) where\n eq = eqMapEntries\n\n\neqMapEntries : ( Eq 'k, Eq 'v ) => list (pair 'k 'v) -> list (pair 'k 'v) -> bool\neqMapEntries = eq\n\n\nimpl Eq value where\n eq a b = Builtin.equalsData (Builtin.valueData a) (Builtin.valueData b)\n", + "InverseInputs": "//! Shared semantic and explicit performance inputs for representation cancellation.\nuse nash_ir::{\n build::Builder,\n core::*,\n ty::{ConstTy, Ty},\n};\nuse nash_plutus::{\n builtin::DefaultFunction as F, constant::Constant, data::PlutusData as D, typ::Type,\n};\n\npub fn cases<'a>(b: &Builder<'a>) -> Vec<(String, &'a Core<'a>, bool)> {\n let a = b.arena;\n let d = D::integer_from(a, 7);\n let data = Constant::data(a, d);\n let pair = Constant::proto_pair(a, &Type::Data, &Type::Data, data, data);\n let list = Constant::proto_list(a, &Type::Data, a.alloc([data]));\n let map = Constant::proto_list(\n a,\n a.alloc(Type::Pair(&Type::Data, &Type::Data)),\n a.alloc([pair]),\n );\n let mut cases = Vec::new();\n for (name, encode, decode, value, encoded) in [\n (\"integer\", F::IData, F::UnIData, b.int(7), b.lit(data)),\n (\n \"bytes\",\n F::BData,\n F::UnBData,\n b.lit(Constant::byte_string(a, b\"hello\")),\n b.lit(Constant::data(a, D::byte_string(a, b\"hello\"))),\n ),\n (\n \"list\",\n F::ListData,\n F::UnListData,\n b.lit(list),\n b.lit(Constant::data(a, D::list(a, a.alloc([d])))),\n ),\n (\n \"map\",\n F::MapData,\n F::UnMapData,\n b.lit(map),\n b.lit(Constant::data(a, D::map(a, a.alloc([(d, d)])))),\n ),\n (\n \"utf8\",\n F::EncodeUtf8,\n F::DecodeUtf8,\n b.lit(Constant::string(a, \"héllo\")),\n b.lit(Constant::byte_string(a, \"héllo\".as_bytes())),\n ),\n ] {\n let wrap = |x| b.builtin(decode, &[b.builtin(encode, &[x], encoded.ty)], value.ty);\n let trace = |s, x| b.trace(b.lit(Constant::string(a, s)), x);\n cases.push((format!(\"{name}_direct\"), wrap(value), false));\n cases.push((\n format!(\"{name}_trace\"),\n wrap(trace(\"operand\", value)),\n false,\n ));\n cases.push((\n format!(\"{name}_decoded\"),\n wrap(b.builtin(decode, &[encoded], value.ty)),\n false,\n ));\n cases.push((\n format!(\"{name}_decode_failure\"),\n wrap(b.builtin(decode, &[b.int(0)], value.ty)),\n true,\n ));\n cases.push((\n format!(\"{name}_reverse\"),\n b.builtin(\n encode,\n &[b.builtin(decode, &[encoded], value.ty)],\n encoded.ty,\n ),\n false,\n ));\n cases.push((\n format!(\"{name}_wrong_kind\"),\n wrap(b.with_type(b.lit(Constant::bool(a, false)), value.ty)),\n true,\n ));\n cases.push((\n format!(\"{name}_cold\"),\n b.if_(\n b.lit(Constant::bool(a, true)),\n value,\n wrap(trace(\"cold\", value)),\n ),\n false,\n ));\n let x = Binder {\n name: b.fresh(\"x\"),\n ty: value.ty,\n };\n let y = Binder {\n name: b.fresh(\"encoded\"),\n ty: encoded.ty,\n };\n let z = Binder {\n name: b.fresh(\"alias\"),\n ty: encoded.ty,\n };\n let decoded = b.builtin(decode, &[b.var(z.name, z.ty)], value.ty);\n let bindings = |body| {\n b.let_(\n x,\n trace(\"once\", value),\n b.let_(\n y,\n b.builtin(encode, &[b.var(x.name, x.ty)], encoded.ty),\n b.let_(z, b.var(y.name, y.ty), body),\n ),\n )\n };\n cases.push((\n format!(\"{name}_bound\"),\n bindings(trace(\"after encoding\", decoded)),\n false,\n ));\n cases.push((\n format!(\"{name}_captured\"),\n bindings(b.force(b.delay(decoded), decoded.ty)),\n false,\n ));\n cases.push((\n format!(\"{name}_escaping\"),\n bindings(b.constr(0, &[b.var(y.name, y.ty), decoded, decoded], Ty::Erased)),\n false,\n ));\n cases.push((\n format!(\"{name}_bound_invalid\"),\n b.let_(\n x,\n trace(\n \"operand\",\n b.with_type(b.lit(Constant::bool(a, false)), value.ty),\n ),\n b.let_(\n y,\n b.builtin(encode, &[b.var(x.name, x.ty)], encoded.ty),\n trace(\n \"must not run\",\n b.builtin(decode, &[b.var(y.name, y.ty)], value.ty),\n ),\n ),\n ),\n true,\n ));\n cases.push((\n format!(\"{name}_reverse_bound_invalid\"),\n b.let_(\n y,\n b.with_type(b.int(0), encoded.ty),\n b.let_(\n x,\n b.builtin(decode, &[b.var(y.name, y.ty)], value.ty),\n trace(\n \"must not run\",\n b.builtin(encode, &[b.var(x.name, x.ty)], encoded.ty),\n ),\n ),\n ),\n true,\n ));\n cases.push((\n format!(\"{name}_oversaturated\"),\n b.app(wrap(value), &[b.int(1)], value.ty),\n true,\n ));\n let unknown = Binder {\n name: b.fresh(\"unknown\"),\n ty: value.ty,\n };\n cases.push((\n format!(\"{name}_unknown_invalid\"),\n b.app(\n b.lam(&[unknown], wrap(b.var(unknown.name, unknown.ty))),\n &[b.lit(Constant::bool(a, false))],\n value.ty,\n ),\n true,\n ));\n cases.push((\n format!(\"{name}_partial\"),\n b.app(\n b.builtin(decode, &[], Ty::Erased),\n &[b.builtin(encode, &[value], encoded.ty)],\n value.ty,\n ),\n false,\n ));\n }\n let bad_utf8 = b.lit(Constant::byte_string(a, &[255]));\n cases.push((\n \"utf8_reverse_invalid\".into(),\n b.builtin(\n F::EncodeUtf8,\n &[b.builtin(F::DecodeUtf8, &[bad_utf8], Ty::Const(&ConstTy::String))],\n bad_utf8.ty,\n ),\n true,\n ));\n for (name, encode, decode, typ) in [\n (\"list_wrong_tag\", F::ListData, F::UnListData, &Type::Integer),\n (\"map_wrong_tag\", F::MapData, F::UnMapData, &Type::Data),\n ] {\n let value = b.lit(Constant::proto_list(a, typ, &[]));\n cases.push((\n name.into(),\n b.builtin(decode, &[b.builtin(encode, &[value], Ty::Erased)], value.ty),\n true,\n ));\n }\n let data_ty = b.lit(data).ty;\n let fields = Binder {\n name: b.fresh(\"fields\"),\n ty: b.lit(list).ty,\n };\n let tag = Binder {\n name: b.fresh(\"tag\"),\n ty: b.int(0).ty,\n };\n let encoded = Binder {\n name: b.fresh(\"constructor\"),\n ty: data_ty,\n };\n let payload = Binder {\n name: b.fresh(\"payload\"),\n ty: Ty::Erased,\n };\n let p = b.var(payload.name, payload.ty);\n let fst = b.builtin(F::FstPair, &[p], tag.ty);\n let snd = b.builtin(F::SndPair, &[p], fields.ty);\n let constructor = b.builtin(\n F::ConstrData,\n &[b.var(tag.name, tag.ty), b.var(fields.name, fields.ty)],\n data_ty,\n );\n let bind = |body| {\n b.let_(\n tag,\n b.int(0),\n b.let_(\n fields,\n b.lit(list),\n b.let_(\n encoded,\n constructor,\n b.let_(\n payload,\n b.builtin(\n F::UnConstrData,\n &[b.var(encoded.name, encoded.ty)],\n Ty::Erased,\n ),\n body,\n ),\n ),\n ),\n )\n };\n cases.push((\"constructor_tag\".into(), bind(fst), false));\n cases.push((\"constructor_fields\".into(), bind(snd), false));\n cases.push((\n \"constructor_rebuild\".into(),\n bind(b.builtin(F::ConstrData, &[fst, snd], data_ty)),\n false,\n ));\n for (name, subject, fails) in [\n (\n \"constructor_known_reverse\",\n b.lit(Constant::data(a, D::constr(a, 3, a.alloc([d])))),\n false,\n ),\n (\"constructor_wrong_variant\", b.lit(data), true),\n ] {\n cases.push((\n name.into(),\n b.let_(\n encoded,\n subject,\n b.let_(\n payload,\n b.builtin(F::UnConstrData, &[b.var(encoded.name, data_ty)], Ty::Erased),\n b.trace(\n b.lit(Constant::string(a, \"after decoding\")),\n b.builtin(F::ConstrData, &[fst, snd], data_ty),\n ),\n ),\n ),\n fails,\n ));\n }\n let bad_tag = b.with_type(b.lit(Constant::bool(a, false)), tag.ty);\n cases.push((\n \"constructor_bad_tag\".into(),\n b.let_(\n tag,\n bad_tag,\n b.let_(\n fields,\n b.trace(b.lit(Constant::string(a, \"fields evaluated\")), b.lit(list)),\n b.let_(\n encoded,\n constructor,\n b.builtin(\n F::FstPair,\n &[b.builtin(F::UnConstrData, &[b.var(encoded.name, data_ty)], Ty::Erased)],\n tag.ty,\n ),\n ),\n ),\n ),\n true,\n ));\n cases.push((\n \"constructor_bad_fields\".into(),\n b.let_(\n tag,\n b.int(0),\n b.let_(\n fields,\n b.with_type(b.lit(Constant::bool(a, false)), fields.ty),\n b.let_(\n encoded,\n constructor,\n b.builtin(\n F::SndPair,\n &[b.builtin(F::UnConstrData, &[b.var(encoded.name, data_ty)], Ty::Erased)],\n fields.ty,\n ),\n ),\n ),\n ),\n true,\n ));\n cases\n}\n", "Lift": "module Lift exposing (..)\n\nimport Primitive exposing (..)\nimport Builtin exposing (..)\n\ntrait Lift 'a 'b where\n lift : 'a -> 'b\n lower : 'b -> 'a\n\nimpl Lift int Int where\n lift value = Builtin.iData value\n lower value = Builtin.unIData value\n\nimpl Lift bytes Bytes where\n lift value = Builtin.bData value\n lower value = Builtin.unBData value\n", "Literal": "module Literal exposing (..)\n\nimport Primitive exposing (..)\nimport Builtin exposing (..)\n\ntrait FromInt 'a where\n fromInt : int -> 'a\n\ntrait FromString 'a where\n fromString : string -> 'a\n\ntrait FromBytes 'a where\n fromBytes : bytes -> 'a\n\nimpl FromInt int where\n fromInt x = x\n\nimpl FromString string where\n fromString x = x\n\nimpl FromBytes bytes where\n fromBytes x = x\n\ntrait FromBool 'a where\n fromBool : bool -> 'a\n\ntrait FromUnit 'a where\n fromUnit : unit -> 'a\n\nimpl FromBool bool where\n fromBool value = value\n\nimpl FromUnit unit where\n fromUnit value = value\n", "Logic": "module Logic exposing ( not, and, or, xor, (&&), (||) )\n\n\nimport Primitive\nimport Lift exposing ( Lift )\n\n\ninfix right 2 (||) = or\n\n\ninfix right 3 (&&) = and\n\n\n{-| Negate a Big or little Boolean, returning bool. -}\nnot : Lift bool 'a => 'a -> bool\nnot value =\n if lower value then\n Primitive.False\n else\n Primitive.True\n\n\n{-| Boolean conjunction. Fully applied calls short-circuit; partial and indirect calls are strict. -}\nand : ( Lift bool 'a, Lift bool 'b ) => 'a -> 'b -> bool\nand a b =\n if lower a then\n lower b\n else\n Primitive.False\n\n\n{-| Boolean disjunction. Fully applied calls short-circuit; partial and indirect calls are strict. -}\nor : ( Lift bool 'a, Lift bool 'b ) => 'a -> 'b -> bool\nor a b =\n if lower a then\n Primitive.True\n else\n lower b\n\n\n{-| Return True when the Boolean operands differ. -}\nxor : ( Lift bool 'a, Lift bool 'b ) => 'a -> 'b -> bool\nxor a b =\n if lower a then\n not b\n else\n lower b\n", @@ -11,7 +12,7 @@ "VestingParam": "validator module VestingParam exposing (main)\n\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Eq exposing (Eq)\nimport Lift exposing (lower)\nimport Cardano.Tx exposing (validAfter, signedBy)\n\ntype Datum = Datum { owner : Bytes, deadline : Int }\n\ntype Redeemer = Claim | Cancel\n\n-- The ledger supplies one V3 ScriptContext; spending datum is in ScriptInfo.\nmain : int -> Data -> unit\nmain minimumLock ctx =\n case ctx of\n Constr pair(0, [ tx, action, Constr pair(1, [ _, Constr pair(0, [ datum ]) ]) ]) ->\n check minimumLock (Primitive.coerce datum) (Primitive.coerce action) tx\n _ -> fail\n\ncheck : int -> Datum -> Redeemer -> Data -> unit\ncheck minimumLock datum redeemer tx =\n case redeemer of\n Claim ->\n assert\n (Builtin.lessThanInteger\n (Builtin.addInteger (lower datum.deadline) minimumLock)\n (validAfter tx))\n Cancel -> assert (signedBy tx datum.owner)\n", "Workloads": "module Workloads exposing (..)\n\nimport Primitive exposing (..)\nimport Builtin exposing (..)\nimport Literal exposing (..)\nimport Logic exposing (..)\n\nsum : list int -> int\nsum xs =\n case xs of\n [] -> 0\n x :: rest -> Builtin.addInteger x (sum rest)\n\nlistTraversal : int\nlistTraversal = sum [1, 2, 3, 4, 5, 6, 7, 8]\n\ncountdown : int -> int -> int\ncountdown n result =\n if Builtin.equalsInteger n 0 then\n result\n else\n countdown (Builtin.subtractInteger n 1) result\n\nstaticRecursion : int\nstaticRecursion = countdown 8 42\n\nmatchData : Data -> int\nmatchData value =\n case value of\n I n -> n\n _ -> 0\n\ndataMatch : int\ndataMatch = matchData (I 42)\n\ndataMiss : int\ndataMiss = matchData (B #\"ab\")\n\ndecode : Data -> int\ndecode value =\n case value of\n Constr pair(_, [I n, _]) -> n\n _ -> 0\n\ndecoding : int\ndecoding = decode (Builtin.constrData 0 [I 42, I 7])\n\nvalidate : Data -> unit\nvalidate value =\n case value of\n I n -> assert (Builtin.lessThanInteger 0 n)\n _ -> fail\n\nvalidationPass : unit\nvalidationPass = validate (I 42)\n\nvalidationFail : unit\nvalidationFail = validate (I 0)\n\nbooleanHelpers : bool\nbooleanHelpers = (True && False) || (True && True)\n\nconstantPrefixTwice : int\nconstantPrefixTwice =\n Builtin.addInteger (Builtin.subtractInteger 100 1) (Builtin.subtractInteger 100 2)\n\nconstantPrefixCold : int\nconstantPrefixCold =\n if True then\n 42\n else\n Builtin.addInteger (Builtin.subtractInteger 100 1) (Builtin.subtractInteger 100 2)\n\nprefixLoop : int -> int\nprefixLoop n =\n if Builtin.equalsInteger n 0 then\n 0\n else\n Builtin.addInteger\n (Builtin.addInteger (Builtin.subtractInteger 100 n) (Builtin.subtractInteger 100 n))\n (prefixLoop (Builtin.subtractInteger n 1))\n\nconstantPrefixLoop : int\nconstantPrefixLoop = prefixLoop 8\n" }, - "revision": "0af9e04fc30e571431e98a98748f190802d0ee70", + "revision": "a20f787e814b319691b3b10476b693cb8d142e3f", "rustc": "rustc 1.98.1 (48a229cea 2026-09-01)", "rows": [ { @@ -58,9 +59,9 @@ "logs": [] }, "after": { - "cpu": 690518, - "memory": 3696, - "bytes": 41, + "cpu": 111399, + "memory": 732, + "bytes": 11, "result": "(con integer 42)", "logs": [] } @@ -75,9 +76,9 @@ "logs": [] }, "after": { - "cpu": 617658, - "memory": 3364, - "bytes": 43, + "cpu": 107283, + "memory": 732, + "bytes": 14, "result": "(con integer 0)", "logs": [] } @@ -92,9 +93,9 @@ "logs": [] }, "after": { - "cpu": 2047655, - "memory": 10488, - "bytes": 113, + "cpu": 1681280, + "memory": 8756, + "bytes": 94, "result": "(con integer 42)", "logs": [] } @@ -109,9 +110,9 @@ "logs": [] }, "after": { - "cpu": 943808, - "memory": 4997, - "bytes": 74, + "cpu": 364689, + "memory": 2033, + "bytes": 47, "result": "(con unit ())", "logs": [] } @@ -128,9 +129,9 @@ ] }, "after": { - "cpu": 235306, - "memory": 229, - "bytes": 74, + "cpu": 120187, + "memory": 165, + "bytes": 47, "result": "error: ExplicitErrorTerm", "logs": [ "assertion failed" @@ -428,6 +429,1569 @@ "assertion failed" ] } + }, + { + "input": "representation cancellation: integer_direct", + "before": { + "cpu": 116143, + "memory": 664, + "bytes": 10, + "result": "(con integer 7)", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 6, + "result": "(con integer 7)", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_trace", + "before": { + "cpu": 287641, + "memory": 1396, + "bytes": 24, + "result": "(con integer 7)", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 235598, + "memory": 1232, + "bytes": 23, + "result": "(con integer 7)", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: integer_decoded", + "before": { + "cpu": 168887, + "memory": 896, + "bytes": 14, + "result": "(con integer 7)", + "logs": [] + }, + "after": { + "cpu": 68844, + "memory": 432, + "bytes": 11, + "result": "(con integer 7)", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_decode_failure", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 8, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_reverse", + "before": { + "cpu": 116143, + "memory": 664, + "bytes": 13, + "result": "(con data (I 7))", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 9, + "result": "(con data (I 7))", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_wrong_kind", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 9, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_cold", + "before": { + "cpu": 48100, + "memory": 400, + "bytes": 26, + "result": "(con integer 7)", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 6, + "result": "(con integer 7)", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_bound", + "before": { + "cpu": 603139, + "memory": 3028, + "bytes": 50, + "result": "(con integer 7)", + "logs": [ + "once", + "after encoding" + ] + }, + "after": { + "cpu": 534395, + "memory": 2696, + "bytes": 48, + "result": "(con integer 7)", + "logs": [ + "once", + "after encoding" + ] + } + }, + { + "input": "representation cancellation: integer_captured", + "before": { + "cpu": 463641, + "memory": 2496, + "bytes": 29, + "result": "(con integer 7)", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 378897, + "memory": 2064, + "bytes": 27, + "result": "(con integer 7)", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: integer_escaping", + "before": { + "cpu": 532385, + "memory": 2828, + "bytes": 35, + "result": "(constr 0 (con data (I 7)) (con integer 7) (con integer 7))", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 426897, + "memory": 2364, + "bytes": 32, + "result": "(constr 0 (con data (I 7)) (con integer 7) (con integer 7))", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: integer_bound_invalid", + "before": { + "cpu": 59598, + "memory": 132, + "bytes": 47, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 59598, + "memory": 132, + "bytes": 50, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: integer_reverse_bound_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_oversaturated", + "before": { + "cpu": 36143, + "memory": 164, + "bytes": 12, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(Integer(7)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 9, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(Integer(7)))", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_unknown_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: integer_partial", + "before": { + "cpu": 116143, + "memory": 664, + "bytes": 10, + "result": "(con integer 7)", + "logs": [] + }, + "after": { + "cpu": 164143, + "memory": 964, + "bytes": 12, + "result": "(con integer 7)", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_direct", + "before": { + "cpu": 111425, + "memory": 664, + "bytes": 17, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 13, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_trace", + "before": { + "cpu": 282923, + "memory": 1396, + "bytes": 31, + "result": "(con bytestring #68656c6c6f)", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 235598, + "memory": 1232, + "bytes": 29, + "result": "(con bytestring #68656c6c6f)", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: bytes_decoded", + "before": { + "cpu": 163567, + "memory": 896, + "bytes": 19, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + }, + "after": { + "cpu": 68242, + "memory": 432, + "bytes": 16, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_decode_failure", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 8, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_reverse", + "before": { + "cpu": 111425, + "memory": 664, + "bytes": 18, + "result": "(con data (B #68656c6c6f))", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 14, + "result": "(con data (B #68656c6c6f))", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_wrong_kind", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 9, + "result": "error: Runtime(TypeMismatch(ByteString, Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(ByteString, Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_cold", + "before": { + "cpu": 48100, + "memory": 400, + "bytes": 39, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 13, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_bound", + "before": { + "cpu": 598421, + "memory": 3028, + "bytes": 57, + "result": "(con bytestring #68656c6c6f)", + "logs": [ + "once", + "after encoding" + ] + }, + "after": { + "cpu": 530279, + "memory": 2696, + "bytes": 54, + "result": "(con bytestring #68656c6c6f)", + "logs": [ + "once", + "after encoding" + ] + } + }, + { + "input": "representation cancellation: bytes_captured", + "before": { + "cpu": 458923, + "memory": 2496, + "bytes": 36, + "result": "(con bytestring #68656c6c6f)", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 374781, + "memory": 2064, + "bytes": 33, + "result": "(con bytestring #68656c6c6f)", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: bytes_escaping", + "before": { + "cpu": 527065, + "memory": 2828, + "bytes": 42, + "result": "(constr 0\n (con data (B #68656c6c6f))\n (con bytestring #68656c6c6f)\n (con bytestring #68656c6c6f))", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 422781, + "memory": 2364, + "bytes": 38, + "result": "(constr 0\n (con data (B #68656c6c6f))\n (con bytestring #68656c6c6f)\n (con bytestring #68656c6c6f))", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: bytes_bound_invalid", + "before": { + "cpu": 59598, + "memory": 132, + "bytes": 47, + "result": "error: Runtime(TypeMismatch(ByteString, Boolean(false)))", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 59598, + "memory": 132, + "bytes": 50, + "result": "error: Runtime(TypeMismatch(ByteString, Boolean(false)))", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: bytes_reverse_bound_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_oversaturated", + "before": { + "cpu": 31425, + "memory": 164, + "bytes": 19, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(ByteString([104, 101, 108, 108, 111])))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 15, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(ByteString([104, 101, 108, 108, 111])))", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_unknown_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(ByteString, Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(ByteString, Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: bytes_partial", + "before": { + "cpu": 111425, + "memory": 664, + "bytes": 17, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + }, + "after": { + "cpu": 159425, + "memory": 964, + "bytes": 19, + "result": "(con bytestring #68656c6c6f)", + "logs": [] + } + }, + { + "input": "representation cancellation: list_direct", + "before": { + "cpu": 139885, + "memory": 664, + "bytes": 14, + "result": "(con (list data) [(I 7)])", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 10, + "result": "(con (list data) [(I 7)])", + "logs": [] + } + }, + { + "input": "representation cancellation: list_trace", + "before": { + "cpu": 311383, + "memory": 1396, + "bytes": 29, + "result": "(con (list data) [(I 7)])", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 235598, + "memory": 1232, + "bytes": 28, + "result": "(con (list data) [(I 7)])", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: list_decoded", + "before": { + "cpu": 197818, + "memory": 896, + "bytes": 16, + "result": "(con (list data) [(I 7)])", + "logs": [] + }, + "after": { + "cpu": 74033, + "memory": 432, + "bytes": 13, + "result": "(con (list data) [(I 7)])", + "logs": [] + } + }, + { + "input": "representation cancellation: list_decode_failure", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 8, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_reverse", + "before": { + "cpu": 139885, + "memory": 664, + "bytes": 15, + "result": "(con data (List [I 7]))", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 11, + "result": "(con data (List [I 7]))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_wrong_kind", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 9, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_cold", + "before": { + "cpu": 48100, + "memory": 400, + "bytes": 34, + "result": "(con (list data) [(I 7)])", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 10, + "result": "(con (list data) [(I 7)])", + "logs": [] + } + }, + { + "input": "representation cancellation: list_bound", + "before": { + "cpu": 626881, + "memory": 3028, + "bytes": 55, + "result": "(con (list data) [(I 7)])", + "logs": [ + "once", + "after encoding" + ] + }, + "after": { + "cpu": 552948, + "memory": 2696, + "bytes": 53, + "result": "(con (list data) [(I 7)])", + "logs": [ + "once", + "after encoding" + ] + } + }, + { + "input": "representation cancellation: list_captured", + "before": { + "cpu": 487383, + "memory": 2496, + "bytes": 34, + "result": "(con (list data) [(I 7)])", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 397450, + "memory": 2064, + "bytes": 32, + "result": "(con (list data) [(I 7)])", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: list_escaping", + "before": { + "cpu": 561316, + "memory": 2828, + "bytes": 40, + "result": "(constr 0\n (con data (List [I 7]))\n (con (list data) [(I 7)])\n (con (list data) [(I 7)]))", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 445450, + "memory": 2364, + "bytes": 37, + "result": "(constr 0\n (con data (List [I 7]))\n (con (list data) [(I 7)])\n (con (list data) [(I 7)]))", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: list_bound_invalid", + "before": { + "cpu": 59598, + "memory": 132, + "bytes": 47, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 59598, + "memory": 132, + "bytes": 50, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: list_reverse_bound_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_oversaturated", + "before": { + "cpu": 59885, + "memory": 164, + "bytes": 16, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(ProtoList(Data, [Data(Integer(7))])))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 13, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(ProtoList(Data, [Data(Integer(7))])))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_unknown_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_partial", + "before": { + "cpu": 139885, + "memory": 664, + "bytes": 14, + "result": "(con (list data) [(I 7)])", + "logs": [] + }, + "after": { + "cpu": 187885, + "memory": 964, + "bytes": 16, + "result": "(con (list data) [(I 7)])", + "logs": [] + } + }, + { + "input": "representation cancellation: map_direct", + "before": { + "cpu": 172969, + "memory": 664, + "bytes": 20, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 17, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + } + }, + { + "input": "representation cancellation: map_trace", + "before": { + "cpu": 344467, + "memory": 1396, + "bytes": 35, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 235598, + "memory": 1232, + "bytes": 34, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: map_decoded", + "before": { + "cpu": 229592, + "memory": 896, + "bytes": 16, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + }, + "after": { + "cpu": 72723, + "memory": 432, + "bytes": 13, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + } + }, + { + "input": "representation cancellation: map_decode_failure", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 8, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_reverse", + "before": { + "cpu": 172969, + "memory": 664, + "bytes": 15, + "result": "(con data (Map [(I 7, I 7)]))", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 11, + "result": "(con data (Map [(I 7, I 7)]))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_wrong_kind", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 9, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_cold", + "before": { + "cpu": 48100, + "memory": 400, + "bytes": 47, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 17, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + } + }, + { + "input": "representation cancellation: map_bound", + "before": { + "cpu": 659965, + "memory": 3028, + "bytes": 61, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [ + "once", + "after encoding" + ] + }, + "after": { + "cpu": 587342, + "memory": 2696, + "bytes": 59, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [ + "once", + "after encoding" + ] + } + }, + { + "input": "representation cancellation: map_captured", + "before": { + "cpu": 520467, + "memory": 2496, + "bytes": 40, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 431844, + "memory": 2064, + "bytes": 38, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: map_escaping", + "before": { + "cpu": 593090, + "memory": 2828, + "bytes": 46, + "result": "(constr 0\n (con data (Map [(I 7, I 7)]))\n (con (list (pair data data)) [((I 7), (I 7))])\n (con (list (pair data data)) [((I 7), (I 7))]))", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 479844, + "memory": 2364, + "bytes": 43, + "result": "(constr 0\n (con data (Map [(I 7, I 7)]))\n (con (list (pair data data)) [((I 7), (I 7))])\n (con (list (pair data data)) [((I 7), (I 7))]))", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: map_bound_invalid", + "before": { + "cpu": 59598, + "memory": 132, + "bytes": 47, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 59598, + "memory": 132, + "bytes": 50, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: map_reverse_bound_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(NotData(Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_oversaturated", + "before": { + "cpu": 92969, + "memory": 164, + "bytes": 23, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(ProtoList(Pair(Data, Data), [ProtoPair(Data, Data, Data(Integer(7)), Data(Integer(7)))])))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 19, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(ProtoList(Pair(Data, Data), [ProtoPair(Data, Data, Data(Integer(7)), Data(Integer(7)))])))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_unknown_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_partial", + "before": { + "cpu": 172969, + "memory": 664, + "bytes": 20, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + }, + "after": { + "cpu": 220969, + "memory": 964, + "bytes": 23, + "result": "(con (list (pair data data)) [((I 7), (I 7))])", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_direct", + "before": { + "cpu": 215979, + "memory": 612, + "bytes": 18, + "result": "(con string \"héllo\")", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 14, + "result": "(con string \"héllo\")", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_trace", + "before": { + "cpu": 387477, + "memory": 1344, + "bytes": 32, + "result": "(con string \"héllo\")", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 235598, + "memory": 1232, + "bytes": 30, + "result": "(con string \"héllo\")", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: utf8_decoded", + "before": { + "cpu": 339937, + "memory": 818, + "bytes": 19, + "result": "(con string \"héllo\")", + "logs": [] + }, + "after": { + "cpu": 140058, + "memory": 406, + "bytes": 16, + "result": "(con string \"héllo\")", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_decode_failure", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(ByteString, Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 8, + "result": "error: Runtime(TypeMismatch(ByteString, Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_reverse", + "before": { + "cpu": 215979, + "memory": 612, + "bytes": 18, + "result": "(con bytestring #68c3a96c6c6f)", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 14, + "result": "(con bytestring #68c3a96c6c6f)", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_wrong_kind", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 9, + "result": "error: Runtime(TypeMismatch(String, Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(String, Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_cold", + "before": { + "cpu": 48100, + "memory": 400, + "bytes": 41, + "result": "(con string \"héllo\")", + "logs": [] + }, + "after": { + "cpu": 16100, + "memory": 200, + "bytes": 14, + "result": "(con string \"héllo\")", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_bound", + "before": { + "cpu": 702975, + "memory": 2976, + "bytes": 58, + "result": "(con string \"héllo\")", + "logs": [ + "once", + "after encoding" + ] + }, + "after": { + "cpu": 563017, + "memory": 2670, + "bytes": 55, + "result": "(con string \"héllo\")", + "logs": [ + "once", + "after encoding" + ] + } + }, + { + "input": "representation cancellation: utf8_captured", + "before": { + "cpu": 563477, + "memory": 2444, + "bytes": 37, + "result": "(con string \"héllo\")", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 407519, + "memory": 2038, + "bytes": 34, + "result": "(con string \"héllo\")", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: utf8_escaping", + "before": { + "cpu": 703435, + "memory": 2750, + "bytes": 43, + "result": "(constr 0\n (con bytestring #68c3a96c6c6f)\n (con string \"héllo\")\n (con string \"héllo\"))", + "logs": [ + "once" + ] + }, + "after": { + "cpu": 455519, + "memory": 2338, + "bytes": 39, + "result": "(constr 0\n (con bytestring #68c3a96c6c6f)\n (con string \"héllo\")\n (con string \"héllo\"))", + "logs": [ + "once" + ] + } + }, + { + "input": "representation cancellation: utf8_bound_invalid", + "before": { + "cpu": 59598, + "memory": 132, + "bytes": 47, + "result": "error: Runtime(TypeMismatch(String, Boolean(false)))", + "logs": [ + "operand" + ] + }, + "after": { + "cpu": 59598, + "memory": 132, + "bytes": 50, + "result": "error: Runtime(TypeMismatch(String, Boolean(false)))", + "logs": [ + "operand" + ] + } + }, + { + "input": "representation cancellation: utf8_reverse_bound_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(TypeMismatch(ByteString, Integer(0)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 34, + "result": "error: Runtime(TypeMismatch(ByteString, Integer(0)))", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_oversaturated", + "before": { + "cpu": 135979, + "memory": 112, + "bytes": 20, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(String(\"héllo\")))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 16, + "result": "error: NonFunctionApplication(Con(Integer(1)), Con(String(\"héllo\")))", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_unknown_invalid", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(String, Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 11, + "result": "error: Runtime(TypeMismatch(String, Boolean(false)))", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_partial", + "before": { + "cpu": 215979, + "memory": 612, + "bytes": 18, + "result": "(con string \"héllo\")", + "logs": [] + }, + "after": { + "cpu": 263979, + "memory": 912, + "bytes": 20, + "result": "(con string \"héllo\")", + "logs": [] + } + }, + { + "input": "representation cancellation: utf8_reverse_invalid", + "before": { + "cpu": 92058, + "memory": 106, + "bytes": 13, + "result": "error: Runtime(DecodeUtf8(Utf8Error { valid_up_to: 0, error_len: Some(1) }))", + "logs": [] + }, + "after": { + "cpu": 92058, + "memory": 106, + "bytes": 15, + "result": "error: Runtime(DecodeUtf8(Utf8Error { valid_up_to: 0, error_len: Some(1) }))", + "logs": [] + } + }, + { + "input": "representation cancellation: list_wrong_tag", + "before": { + "cpu": 33952, + "memory": 132, + "bytes": 10, + "result": "error: Runtime(TypeMismatch(Data, ProtoList(Integer, [])))", + "logs": [] + }, + "after": { + "cpu": 33952, + "memory": 132, + "bytes": 12, + "result": "error: Runtime(TypeMismatch(Data, ProtoList(Integer, [])))", + "logs": [] + } + }, + { + "input": "representation cancellation: map_wrong_tag", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 10, + "result": "error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, [])))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 12, + "result": "error: Runtime(TypeMismatch(List(Pair(Data, Data)), ProtoList(Data, [])))", + "logs": [] + } + }, + { + "input": "representation cancellation: constructor_tag", + "before": { + "cpu": 556734, + "memory": 2496, + "bytes": 29, + "result": "(con integer 0)", + "logs": [] + }, + "after": { + "cpu": 254839, + "memory": 1464, + "bytes": 22, + "result": "(con integer 0)", + "logs": [] + } + }, + { + "input": "representation cancellation: constructor_fields", + "before": { + "cpu": 556831, + "memory": 2496, + "bytes": 29, + "result": "(con (list data) [(I 7)])", + "logs": [] + }, + "after": { + "cpu": 302839, + "memory": 1764, + "bytes": 24, + "result": "(con (list data) [(I 7)])", + "logs": [] + } + }, + { + "input": "representation cancellation: constructor_rebuild", + "before": { + "cpu": 848877, + "memory": 3360, + "bytes": 36, + "result": "(con data (Constr 0 [I 7]))", + "logs": [] + }, + "after": { + "cpu": 404990, + "memory": 2296, + "bytes": 29, + "result": "(con data (Constr 0 [I 7]))", + "logs": [] + } + }, + { + "input": "representation cancellation: constructor_known_reverse", + "before": { + "cpu": 838224, + "memory": 3060, + "bytes": 51, + "result": "(con data (Constr 3 [I 7]))", + "logs": [ + "after decoding" + ] + }, + "after": { + "cpu": 388186, + "memory": 2064, + "bytes": 43, + "result": "(con data (Constr 3 [I 7]))", + "logs": [ + "after decoding" + ] + } + }, + { + "input": "representation cancellation: constructor_wrong_variant", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 47, + "result": "error: Runtime(MalFormedData(Integer(7)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 39, + "result": "error: Runtime(MalFormedData(Integer(7)))", + "logs": [] + } + }, + { + "input": "representation cancellation: constructor_bad_tag", + "before": { + "cpu": 59598, + "memory": 132, + "bytes": 50, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [ + "fields evaluated" + ] + }, + "after": { + "cpu": 59598, + "memory": 132, + "bytes": 48, + "result": "error: Runtime(TypeMismatch(Integer, Boolean(false)))", + "logs": [ + "fields evaluated" + ] + } + }, + { + "input": "representation cancellation: constructor_bad_fields", + "before": { + "cpu": 100, + "memory": 100, + "bytes": 22, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + }, + "after": { + "cpu": 100, + "memory": 100, + "bytes": 15, + "result": "error: Runtime(ExpectedList(Boolean(false)))", + "logs": [] + } } ] } diff --git a/tools/optimizer-perf/src/main.rs b/tools/optimizer-perf/src/main.rs index 71334b48..d1652ccd 100644 --- a/tools/optimizer-perf/src/main.rs +++ b/tools/optimizer-perf/src/main.rs @@ -1,10 +1,12 @@ //! Explicit-only performance checks. This binary is not a Cargo test target. +#[path = "../../../crates/nash-codegen/tests/support/inverse.rs"] +mod inverse_input; mod source; #[path = "../../../crates/nash-codegen/tests/support/vesting.rs"] mod vesting_input; -use nash_ir::{anf, build::Builder, core::Core, hygiene, static_lift}; +use nash_ir::{anf, build::Builder, core::Core, hygiene}; use nash_plutus::{ arena::Arena, binder::DeBruijn, @@ -23,7 +25,7 @@ const BUDGET: ExBudget = ExBudget { cpu: 100_000_000, mem: 2_000_000, }; -const SETTINGS: &str = "v1; Plutus V3/PV11; UPLC 1.1.0; bundled V3 default cost model; CPU=100000000; memory=2000000; raw Flat bytes before ledger application; O0 vs static lift/unused-parameters/known-constr/ANF once/rules1+2+3+4+dead-bindings+recursive-reachability+force-delay+known-bool/recursion/hygiene/lower+forced-builtin-sharing+constant-prefix-sharing"; +const SETTINGS: &str = "v1; Plutus V3/PV11; UPLC 1.1.0; bundled V3 default cost model; CPU=100000000; memory=2000000; raw Flat bytes before ledger application; O0 vs static lift/unused-parameters/known-constr/representation-inverse/ANF once/rules1+2+3+4+dead-bindings+recursive-reachability+representation-inverse+force-delay+known-bool+int-bytes/bound-constr+known-fields+list+data+idata-bdata-listdata-mapdata-constrdata-cleanup/recursion/hygiene/lower+forced-builtin-sharing+constant-prefix-sharing"; #[derive(Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(deny_unknown_fields)] @@ -110,6 +112,10 @@ fn run() -> Result<()> { "VestingContextInput".into(), include_str!("../../../crates/nash-codegen/tests/support/vesting.rs").into(), ); + sources.insert( + "InverseInputs".into(), + include_str!("../../../crates/nash-codegen/tests/support/inverse.rs").into(), + ); suite()? }; let report = Report { @@ -183,11 +189,7 @@ fn output(program: &str, args: &[&str], cwd: Option<&Path>) -> String { fn accepted<'a>(arena: &'a Arena, core: &'a Core<'a>) -> &'a Core<'a> { let b = Builder::new(arena); - let core = hygiene::freshen(&b, core); - let core = static_lift::lift(&b, core); - let core = nash_ir::unused_params::reduce(&b, core); - let core = nash_ir::known_case::reduce_constr(&b, core); - let core = nash_ir::small_inline::simplify(&b, anf::normalize(&b, core)); + let core = nash_codegen::optimizer::optimize(arena, core); anf::validate(core).expect("ANF before recursion rewriting"); let core = nash_codegen::recursion::rewrite(&b, core).expect("recursion rewrite"); let core = hygiene::freshen(&b, core); @@ -370,5 +372,15 @@ fn suite() -> Result> { )?); } } + let arena = Arena::new(); + for (name, core, _) in inverse_input::cases(&Builder::new(&arena)) { + rows.push(compare( + &arena, + format!("representation cancellation: {name}"), + core, + &[], + None, + )?); + } Ok(rows) }