From e4aa9642a9760327a9ce006ff603ddcc30e8c750 Mon Sep 17 00:00:00 2001 From: Ori Ziv Date: Mon, 30 Sep 2024 12:16:31 +0300 Subject: [PATCH] Enabled const-folding cancelation for e2e tests. commit-id:34243163 --- .../src/optimizations/config.rs | 10 +- .../src/optimizations/const_folding.rs | 2 +- tests/e2e_test.rs | 61 +- tests/e2e_test_data/libfuncs/consts | 34 +- tests/e2e_test_data/libfuncs/gas | 123 +-- tests/e2e_test_data/metadata_computation | 818 ++++++++++-------- 6 files changed, 582 insertions(+), 466 deletions(-) diff --git a/crates/cairo-lang-lowering/src/optimizations/config.rs b/crates/cairo-lang-lowering/src/optimizations/config.rs index ce9d5a37033..1ba669685eb 100644 --- a/crates/cairo-lang-lowering/src/optimizations/config.rs +++ b/crates/cairo-lang-lowering/src/optimizations/config.rs @@ -24,6 +24,8 @@ pub struct OptimizationConfig { pub inline_small_functions_threshold: usize, /// Determines whether inlining is disabled. pub inlining_strategy: InliningStrategy, + /// Should const folding be skipped. + pub skip_const_folding: bool, } impl OptimizationConfig { @@ -44,11 +46,16 @@ impl OptimizationConfig { self.inline_small_functions_threshold = inline_small_functions_threshold; self } - /// Sets the `inlining_strategy` flag + /// Sets the `inlining_strategy` flag. pub fn with_inlining_strategy(mut self, inlining_strategy: InliningStrategy) -> Self { self.inlining_strategy = inlining_strategy; self } + /// Sets the `skip_const_folding` flag. + pub fn with_skip_const_folding(mut self, skip_const_folding: bool) -> Self { + self.skip_const_folding = skip_const_folding; + self + } } impl Default for OptimizationConfig { @@ -57,6 +64,7 @@ impl Default for OptimizationConfig { moveable_functions: vec![], inline_small_functions_threshold: DEFAULT_INLINE_SMALL_FUNCTIONS_THRESHOLD, inlining_strategy: InliningStrategy::Default, + skip_const_folding: false, } } } diff --git a/crates/cairo-lang-lowering/src/optimizations/const_folding.rs b/crates/cairo-lang-lowering/src/optimizations/const_folding.rs index f6c6f90ca33..45e67057b5b 100644 --- a/crates/cairo-lang-lowering/src/optimizations/const_folding.rs +++ b/crates/cairo-lang-lowering/src/optimizations/const_folding.rs @@ -44,7 +44,7 @@ enum VarInfo { /// Performs constant folding on the lowered program. /// The optimization works better when the blocks are topologically sorted. pub fn const_folding(db: &dyn LoweringGroup, lowered: &mut FlatLowered) { - if lowered.blocks.is_empty() { + if db.optimization_config().skip_const_folding || lowered.blocks.is_empty() { return; } let libfunc_info = priv_const_folding_info(db); diff --git a/tests/e2e_test.rs b/tests/e2e_test.rs index 8dd8a1d624b..e0c1a9b1040 100644 --- a/tests/e2e_test.rs +++ b/tests/e2e_test.rs @@ -22,20 +22,25 @@ use itertools::Itertools; /// Salsa databases configured to find the corelib, when reused by different tests should be able to /// use the cached queries that rely on the corelib's code, which vastly reduces the tests runtime. -static SHARED_DB_WITH_GAS: LazyLock> = LazyLock::new(|| { +static SHARED_DB_WITH_GAS_NO_OPTS: LazyLock> = LazyLock::new(|| { let mut db = RootDatabase::builder().detect_corelib().build().unwrap(); db.set_optimization_config(Arc::new( - OptimizationConfig::default().with_minimal_movable_functions(), + OptimizationConfig::default().with_skip_const_folding(true), )); Mutex::new(db) }); -static SHARED_DB_NO_GAS: LazyLock> = LazyLock::new(|| { +static SHARED_DB_NO_GAS_NO_OPTS: LazyLock> = LazyLock::new(|| { let mut db = RootDatabase::builder().detect_corelib().skip_auto_withdraw_gas().build().unwrap(); db.set_optimization_config(Arc::new( - OptimizationConfig::default().with_minimal_movable_functions(), + OptimizationConfig::default().with_skip_const_folding(true), )); Mutex::new(db) }); +static SHARED_DB_WITH_OPTS: LazyLock> = LazyLock::new(|| { + let mut db = RootDatabase::builder().detect_corelib().skip_auto_withdraw_gas().build().unwrap(); + db.set_optimization_config(Arc::new(OptimizationConfig::default())); + Mutex::new(db) +}); cairo_lang_test_utils::test_file_test_with_runner!( general_e2e, @@ -58,7 +63,6 @@ cairo_lang_test_utils::test_file_test_with_runner!( builtin_costs: "builtin_costs", casts: "casts", circuit: "circuit", - consts: "consts", coupon: "coupon", ec: "ec", enum_: "enum", @@ -97,6 +101,15 @@ cairo_lang_test_utils::test_file_test_with_runner!( SmallE2ETestRunnerSkipAddGas ); +cairo_lang_test_utils::test_file_test_with_runner!( + libfunc_e2e_withopts, + "e2e_test_data/libfuncs", + { + consts: "consts", + }, + WithOptsE2ETestRunner +); + cairo_lang_test_utils::test_file_test_with_runner!( starknet_libfunc_e2e, "e2e_test_data/libfuncs/starknet", @@ -132,6 +145,21 @@ impl TestFileRunner for SmallE2ETestRunner { } } +#[derive(Default)] +struct WithOptsE2ETestRunner; +impl TestFileRunner for WithOptsE2ETestRunner { + fn run( + &mut self, + inputs: &OrderedHashMap, + _args: &OrderedHashMap, + ) -> TestRunnerResult { + run_e2e_test( + inputs, + E2eTestParams { skip_optimization_passes: false, ..Default::default() }, + ) + } +} + #[derive(Default)] struct SmallE2ETestRunnerSkipAddGas; impl TestFileRunner for SmallE2ETestRunnerSkipAddGas { @@ -152,7 +180,14 @@ impl TestFileRunner for SmallE2ETestRunnerMetadataComputation { inputs: &OrderedHashMap, _args: &OrderedHashMap, ) -> TestRunnerResult { - run_e2e_test(inputs, E2eTestParams { add_withdraw_gas: false, metadata_computation: true }) + run_e2e_test( + inputs, + E2eTestParams { + add_withdraw_gas: false, + metadata_computation: true, + skip_optimization_passes: true, + }, + ) } } @@ -165,12 +200,15 @@ struct E2eTestParams { /// Argument for `run_e2e_test` that controls whether to add metadata computation information /// to the test outputs. metadata_computation: bool, + + /// Argument for `run_e2e_test` that controls whether to skip optimization passes. + skip_optimization_passes: bool, } /// Implements default for `E2eTestParams`. impl Default for E2eTestParams { fn default() -> Self { - Self { add_withdraw_gas: true, metadata_computation: false } + Self { add_withdraw_gas: true, metadata_computation: false, skip_optimization_passes: true } } } @@ -179,8 +217,13 @@ fn run_e2e_test( inputs: &OrderedHashMap, params: E2eTestParams, ) -> TestRunnerResult { - let mut locked_db = - test_lock(if params.add_withdraw_gas { &SHARED_DB_WITH_GAS } else { &SHARED_DB_NO_GAS }); + let mut locked_db = test_lock(if !params.skip_optimization_passes { + &SHARED_DB_WITH_OPTS + } else if params.add_withdraw_gas { + &SHARED_DB_WITH_GAS_NO_OPTS + } else { + &SHARED_DB_NO_GAS_NO_OPTS + }); // Parse code and create semantic model. let test_module = setup_test_module(locked_db.deref_mut(), inputs["cairo"].as_str()).unwrap(); let db = locked_db.snapshot(); diff --git a/tests/e2e_test_data/libfuncs/consts b/tests/e2e_test_data/libfuncs/consts index fcf6f976642..61c69ed1c76 100644 --- a/tests/e2e_test_data/libfuncs/consts +++ b/tests/e2e_test_data/libfuncs/consts @@ -1,7 +1,7 @@ //! > const felt252 //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: felt252 = 100; @@ -45,7 +45,7 @@ test::foo@3() -> (Box); //! > const u8 //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: u8 = 100; @@ -89,7 +89,7 @@ test::foo@3() -> (Box); //! > const i16 //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: i16 = -1000; @@ -133,7 +133,7 @@ test::foo@3() -> (Box); //! > const u256 //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V1: u256 = 0x2000000000000000000000000000000010; @@ -200,7 +200,7 @@ test::foo2@8() -> (Box); //! > const bool //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo fn bar() -> bool { false } @@ -246,7 +246,7 @@ test::foo@4() -> (Box); //! > const complex //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo enum ThreeOptions { @@ -307,7 +307,7 @@ test::foo@3() -> (Box); //! > const complex with padding //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo enum ThreeOptions { @@ -366,7 +366,7 @@ test::foo@3() -> (Box); //! > const several complex enums //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo enum ThreeOptions { @@ -453,7 +453,7 @@ test::foo@3() -> (Box); //! > const and builtin costs //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo fn foo() -> (Box, BuiltinCosts) { @@ -499,7 +499,7 @@ test::foo@0() -> (Tuple, BuiltinCosts>); //! > const segmentation //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo extern type Const; @@ -582,7 +582,7 @@ test::foo@0() -> (Tuple, Box, Box, Box, //! > const felt252 span //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo fn foo() -> @Array { @@ -632,7 +632,7 @@ test::foo: OrderedHashMap({Const: 500}) //! > const felt252 quad span //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo fn foo() -> @Array<(felt252, felt252, felt252, felt252)> { @@ -701,7 +701,7 @@ test::foo: OrderedHashMap({Const: 500}) //! > const NonZero //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: NonZero = 100; @@ -747,7 +747,7 @@ test::foo: OrderedHashMap({Const: 300}) //! > const NonZero //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: NonZero = 100; @@ -793,7 +793,7 @@ test::foo: OrderedHashMap({Const: 300}) //! > const NonZero 0 low. //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: NonZero = 0x2000000000000000000000000000000000; @@ -844,7 +844,7 @@ test::foo: OrderedHashMap({Const: 300}) //! > const NonZero 0 high. //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo const V: NonZero = 16; @@ -895,7 +895,7 @@ test::foo: OrderedHashMap({Const: 300}) //! > const NonZero 0 high. //! > test_runner_name -SmallE2ETestRunner +WithOptsE2ETestRunner //! > cairo use core::integer::u512; diff --git a/tests/e2e_test_data/libfuncs/gas b/tests/e2e_test_data/libfuncs/gas index 12cff2ed48c..4bc5bfb4dc1 100644 --- a/tests/e2e_test_data/libfuncs/gas +++ b/tests/e2e_test_data/libfuncs/gas @@ -24,7 +24,8 @@ fn bar() { } //! > casm -jmp rel 10 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 10 if [ap + -1] != 0; call rel 13; call rel 11; call rel 9; @@ -36,7 +37,7 @@ ret; ret; //! > function_costs -test::foo: OrderedHashMap({Const: 800}) +test::foo: OrderedHashMap({Const: 900}) test::bar: OrderedHashMap({}) //! > sierra_code @@ -44,7 +45,11 @@ type felt252 = felt252 [storable: true, drop: true, dup: true, zero_sized: false type Unit = Struct [storable: true, drop: true, dup: true, zero_sized: true]; type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; libfunc function_call = function_call; @@ -52,22 +57,25 @@ libfunc store_temp = store_temp; libfunc drop> = drop>; libfunc redeposit_gas = redeposit_gas; -felt252_is_zero([1]) { fallthrough() 7([2]) }; // 0 -branch_align() -> (); // 1 -function_call() -> (); // 2 -function_call() -> (); // 3 -function_call() -> (); // 4 -store_temp([0]) -> ([0]); // 5 -return([0]); // 6 -branch_align() -> (); // 7 -drop>([2]) -> (); // 8 -redeposit_gas([0]) -> ([3]); // 9 -store_temp([3]) -> ([3]); // 10 -return([3]); // 11 -return(); // 12 +const_as_immediate>() -> ([2]); // 0 +felt252_sub([1], [2]) -> ([3]); // 1 +store_temp([3]) -> ([3]); // 2 +felt252_is_zero([3]) { fallthrough() 10([4]) }; // 3 +branch_align() -> (); // 4 +function_call() -> (); // 5 +function_call() -> (); // 6 +function_call() -> (); // 7 +store_temp([0]) -> ([0]); // 8 +return([0]); // 9 +branch_align() -> (); // 10 +drop>([4]) -> (); // 11 +redeposit_gas([0]) -> ([5]); // 12 +store_temp([5]) -> ([5]); // 13 +return([5]); // 14 +return(); // 15 test::foo@0([0]: GasBuiltin, [1]: felt252) -> (GasBuiltin); -test::bar@12() -> (); +test::bar@15() -> (); //! > ========================================================================== @@ -93,7 +101,8 @@ fn foo(x: felt252) { } //! > casm -jmp rel 28 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 28 if [ap + -1] != 0; ap += 3; [ap + 0] = 1, ap++; [ap + 0] = 2, ap++; @@ -125,7 +134,7 @@ call rel 16; ret; //! > function_costs -test::foo: OrderedHashMap({Bitwise: 2, Pedersen: 1, Const: 1730}) +test::foo: OrderedHashMap({Bitwise: 2, Pedersen: 1, Const: 1830}) //! > sierra_code type felt252 = felt252 [storable: true, drop: true, dup: true, zero_sized: false]; @@ -138,7 +147,11 @@ type Const = Const [storable: false, drop: false, dup: false, type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; type u128 = u128 [storable: true, drop: true, dup: true, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; libfunc const_as_immediate> = const_as_immediate>; @@ -147,7 +160,6 @@ libfunc store_temp = store_temp; libfunc bitwise = bitwise; libfunc drop = drop; libfunc const_as_immediate> = const_as_immediate>; -libfunc store_temp = store_temp; libfunc pedersen = pedersen; libfunc drop = drop; libfunc store_temp = store_temp; @@ -156,41 +168,44 @@ libfunc store_temp = store_temp; libfunc drop> = drop>; libfunc redeposit_gas = redeposit_gas; -felt252_is_zero([3]) { fallthrough() 28([4]) }; // 0 -branch_align() -> (); // 1 -const_as_immediate>() -> ([5]); // 2 -const_as_immediate>() -> ([6]); // 3 -store_temp([5]) -> ([5]); // 4 -store_temp([6]) -> ([6]); // 5 -bitwise([1], [5], [6]) -> ([7], [8], [9], [10]); // 6 -drop([8]) -> (); // 7 -drop([9]) -> (); // 8 -drop([10]) -> (); // 9 -const_as_immediate>() -> ([11]); // 10 -const_as_immediate>() -> ([12]); // 11 -store_temp([11]) -> ([11]); // 12 -store_temp([12]) -> ([12]); // 13 -bitwise([7], [11], [12]) -> ([13], [14], [15], [16]); // 14 -drop([14]) -> (); // 15 -drop([15]) -> (); // 16 -drop([16]) -> (); // 17 -const_as_immediate>() -> ([17]); // 18 -const_as_immediate>() -> ([18]); // 19 -store_temp([17]) -> ([17]); // 20 -store_temp([18]) -> ([18]); // 21 -pedersen([2], [17], [18]) -> ([19], [20]); // 22 -drop([20]) -> (); // 23 -store_temp([0]) -> ([0]); // 24 -store_temp([13]) -> ([13]); // 25 -store_temp([19]) -> ([19]); // 26 -return([0], [13], [19]); // 27 -branch_align() -> (); // 28 -drop>([4]) -> (); // 29 -redeposit_gas([0]) -> ([21]); // 30 -store_temp([21]) -> ([21]); // 31 -store_temp([1]) -> ([1]); // 32 -store_temp([2]) -> ([2]); // 33 -return([21], [1], [2]); // 34 +const_as_immediate>() -> ([4]); // 0 +felt252_sub([3], [4]) -> ([5]); // 1 +store_temp([5]) -> ([5]); // 2 +felt252_is_zero([5]) { fallthrough() 31([6]) }; // 3 +branch_align() -> (); // 4 +const_as_immediate>() -> ([7]); // 5 +const_as_immediate>() -> ([8]); // 6 +store_temp([7]) -> ([7]); // 7 +store_temp([8]) -> ([8]); // 8 +bitwise([1], [7], [8]) -> ([9], [10], [11], [12]); // 9 +drop([10]) -> (); // 10 +drop([11]) -> (); // 11 +drop([12]) -> (); // 12 +const_as_immediate>() -> ([13]); // 13 +const_as_immediate>() -> ([14]); // 14 +store_temp([13]) -> ([13]); // 15 +store_temp([14]) -> ([14]); // 16 +bitwise([9], [13], [14]) -> ([15], [16], [17], [18]); // 17 +drop([16]) -> (); // 18 +drop([17]) -> (); // 19 +drop([18]) -> (); // 20 +const_as_immediate>() -> ([19]); // 21 +const_as_immediate>() -> ([20]); // 22 +store_temp([19]) -> ([19]); // 23 +store_temp([20]) -> ([20]); // 24 +pedersen([2], [19], [20]) -> ([21], [22]); // 25 +drop([22]) -> (); // 26 +store_temp([0]) -> ([0]); // 27 +store_temp([15]) -> ([15]); // 28 +store_temp([21]) -> ([21]); // 29 +return([0], [15], [21]); // 30 +branch_align() -> (); // 31 +drop>([6]) -> (); // 32 +redeposit_gas([0]) -> ([23]); // 33 +store_temp([23]) -> ([23]); // 34 +store_temp([1]) -> ([1]); // 35 +store_temp([2]) -> ([2]); // 36 +return([23], [1], [2]); // 37 test::foo@0([0]: GasBuiltin, [1]: Bitwise, [2]: Pedersen, [3]: felt252) -> (GasBuiltin, Bitwise, Pedersen); diff --git a/tests/e2e_test_data/metadata_computation b/tests/e2e_test_data/metadata_computation index ac566c65e7a..23c7b84ee99 100644 --- a/tests/e2e_test_data/metadata_computation +++ b/tests/e2e_test_data/metadata_computation @@ -30,48 +30,48 @@ fn two() -> u32 { } //! > gas_solution_lp -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 340, Step: 3, Hole: 0, RangeCheck: 1}) -#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 6, RangeCheck: 0}) -#14: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) -#30: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 260, Step: 3, Hole: 0, RangeCheck: 0}) -#37: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 90, Step: 1, Hole: 0, RangeCheck: 0}) -#41: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 1, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 1470, Step: 14, Hole: 7, RangeCheck: 1}) -test::holes: OrderedHashMap({Const: 500, Step: 5, Hole: 4, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 250, Step: 2, Hole: 0, RangeCheck: 1}) +#10: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 5, RangeCheck: 0}) +#20: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) +#36: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 260, Step: 3, Hole: 0, RangeCheck: 0}) +#43: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 90, Step: 1, Hole: 0, RangeCheck: 0}) +#47: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 1, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 1570, Step: 15, Hole: 6, RangeCheck: 1}) +test::holes: OrderedHashMap({Const: 600, Step: 6, Hole: 4, RangeCheck: 0}) test::use_rc: OrderedHashMap({Const: 1070, Step: 10, Hole: 1, RangeCheck: 1}) test::two: OrderedHashMap({Const: 100, Step: 1, Hole: 0, RangeCheck: 0}) //! > gas_solution_linear -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 340, Step: 3, Hole: 0, RangeCheck: 1}) -#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 6, RangeCheck: 0}) -#14: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) -#30: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 260, Step: 3, Hole: 0, RangeCheck: 0}) -#37: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 90, Step: 1, Hole: 0, RangeCheck: 0}) -#41: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 1, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 1470, Step: 14, Hole: 7, RangeCheck: 1}) -test::holes: OrderedHashMap({Const: 500, Step: 5, Hole: 4, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 250, Step: 2, Hole: 0, RangeCheck: 1}) +#10: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 5, RangeCheck: 0}) +#20: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) +#36: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 260, Step: 3, Hole: 0, RangeCheck: 0}) +#43: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 90, Step: 1, Hole: 0, RangeCheck: 0}) +#47: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 1, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 1570, Step: 15, Hole: 6, RangeCheck: 1}) +test::holes: OrderedHashMap({Const: 600, Step: 6, Hole: 4, RangeCheck: 0}) test::use_rc: OrderedHashMap({Const: 1070, Step: 10, Hole: 1, RangeCheck: 1}) test::two: OrderedHashMap({Const: 100, Step: 1, Hole: 0, RangeCheck: 0}) //! > ap_solution_lp -#2: 3 -#30: 4 -#37: 1 +#5: 2 +#36: 4 +#43: 1 -test::holes: 4 -test::foo: 11 +test::holes: 5 +test::foo: 12 test::use_rc: 8 test::two: 1 //! > ap_solution_linear -#2: 3 -#30: 4 -#37: 1 +#5: 2 +#36: 4 +#43: 1 -test::foo: 11 -test::holes: 4 +test::foo: 12 +test::holes: 5 test::use_rc: 8 test::two: 1 @@ -88,11 +88,14 @@ type Const = Const [storable: false, drop: false, dup: f type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; type RangeCheck = RangeCheck [storable: true, drop: false, dup: false, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; libfunc dup = dup; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; -libfunc store_temp = store_temp; libfunc function_call = function_call; libfunc store_temp = store_temp; libfunc drop> = drop>; @@ -111,71 +114,79 @@ libfunc u32_overflowing_sub = u32_overflowing_sub; libfunc drop = drop; libfunc const_as_immediate> = const_as_immediate>; -dup([1]) -> ([1], [2]); // 0 -felt252_is_zero([2]) { fallthrough() 7([3]) }; // 1 -branch_align() -> (); // 2 -store_temp([1]) -> ([1]); // 3 -function_call([1]) -> (); // 4 -store_temp([0]) -> ([0]); // 5 -return([0]); // 6 -branch_align() -> (); // 7 -drop>([3]) -> (); // 8 -drop([1]) -> (); // 9 -store_temp([0]) -> ([0]); // 10 -function_call([0]) -> ([4]); // 11 -return([4]); // 12 -felt252_is_zero([0]) { fallthrough() 30([1]) }; // 13 -branch_align() -> (); // 14 -const_as_immediate>() -> ([2]); // 15 -const_as_immediate>() -> ([3]); // 16 -store_temp([2]) -> ([2]); // 17 -felt252_add([2], [3]) -> ([4]); // 18 -const_as_immediate>() -> ([5]); // 19 -store_temp([4]) -> ([4]); // 20 -felt252_add([4], [5]) -> ([6]); // 21 -const_as_immediate>() -> ([7]); // 22 -store_temp([6]) -> ([6]); // 23 -felt252_add([6], [7]) -> ([8]); // 24 -const_as_immediate>() -> ([9]); // 25 -store_temp([8]) -> ([8]); // 26 -felt252_add([8], [9]) -> ([10]); // 27 -drop([10]) -> (); // 28 -return(); // 29 -branch_align() -> (); // 30 -drop>([1]) -> (); // 31 -return(); // 32 -function_call() -> ([1]); // 33 -const_as_immediate>() -> ([2]); // 34 -store_temp([2]) -> ([2]); // 35 -u32_overflowing_sub([0], [2], [1]) { fallthrough([3], [4]) 41([5], [6]) }; // 36 -branch_align() -> (); // 37 -drop([4]) -> (); // 38 -store_temp([3]) -> ([3]); // 39 -return([3]); // 40 -branch_align() -> (); // 41 -drop([6]) -> (); // 42 -store_temp([5]) -> ([5]); // 43 -return([5]); // 44 -const_as_immediate>() -> ([0]); // 45 -store_temp([0]) -> ([0]); // 46 -return([0]); // 47 +const_as_immediate>() -> ([2]); // 0 +dup([1]) -> ([1], [3]); // 1 +felt252_sub([3], [2]) -> ([4]); // 2 +store_temp([4]) -> ([4]); // 3 +felt252_is_zero([4]) { fallthrough() 10([5]) }; // 4 +branch_align() -> (); // 5 +store_temp([1]) -> ([1]); // 6 +function_call([1]) -> (); // 7 +store_temp([0]) -> ([0]); // 8 +return([0]); // 9 +branch_align() -> (); // 10 +drop>([5]) -> (); // 11 +drop([1]) -> (); // 12 +store_temp([0]) -> ([0]); // 13 +function_call([0]) -> ([6]); // 14 +return([6]); // 15 +const_as_immediate>() -> ([1]); // 16 +felt252_sub([0], [1]) -> ([2]); // 17 +store_temp([2]) -> ([2]); // 18 +felt252_is_zero([2]) { fallthrough() 36([3]) }; // 19 +branch_align() -> (); // 20 +const_as_immediate>() -> ([4]); // 21 +const_as_immediate>() -> ([5]); // 22 +store_temp([4]) -> ([4]); // 23 +felt252_add([4], [5]) -> ([6]); // 24 +const_as_immediate>() -> ([7]); // 25 +store_temp([6]) -> ([6]); // 26 +felt252_add([6], [7]) -> ([8]); // 27 +const_as_immediate>() -> ([9]); // 28 +store_temp([8]) -> ([8]); // 29 +felt252_add([8], [9]) -> ([10]); // 30 +const_as_immediate>() -> ([11]); // 31 +store_temp([10]) -> ([10]); // 32 +felt252_add([10], [11]) -> ([12]); // 33 +drop([12]) -> (); // 34 +return(); // 35 +branch_align() -> (); // 36 +drop>([3]) -> (); // 37 +return(); // 38 +function_call() -> ([1]); // 39 +const_as_immediate>() -> ([2]); // 40 +store_temp([2]) -> ([2]); // 41 +u32_overflowing_sub([0], [2], [1]) { fallthrough([3], [4]) 47([5], [6]) }; // 42 +branch_align() -> (); // 43 +drop([4]) -> (); // 44 +store_temp([3]) -> ([3]); // 45 +return([3]); // 46 +branch_align() -> (); // 47 +drop([6]) -> (); // 48 +store_temp([5]) -> ([5]); // 49 +return([5]); // 50 +const_as_immediate>() -> ([0]); // 51 +store_temp([0]) -> ([0]); // 52 +return([0]); // 53 test::foo@0([0]: RangeCheck, [1]: felt252) -> (RangeCheck); -test::holes@13([0]: felt252) -> (); -test::use_rc@33([0]: RangeCheck) -> (RangeCheck); -test::two@45() -> (u32); +test::holes@16([0]: felt252) -> (); +test::use_rc@39([0]: RangeCheck) -> (RangeCheck); +test::two@51() -> (u32); //! > casm -jmp rel 9 if [fp + -3] != 0; -ap += 3; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 9 if [ap + -1] != 0; +ap += 2; [ap + 0] = [fp + -3], ap++; call rel 8; [ap + 0] = [fp + -4], ap++; ret; [ap + 0] = [fp + -4], ap++; -call rel 17; +call rel 19; ret; -jmp rel 11 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 11 if [ap + -1] != 0; [ap + 0] = 1, ap++; [ap + 0] = [ap + -1] + 2, ap++; [ap + 0] = [ap + -1] + 3, ap++; @@ -241,41 +252,41 @@ fn bar() { test::bar 10000 //! > gas_solution_lp -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9880, Step: 0, Hole: 0, RangeCheck: 0}) -#8: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9880, Step: 0, Hole: 0, RangeCheck: 0}) -#13: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#17: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#22: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 2, RangeCheck: 0}) -#29: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) -#37: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 30800, Step: 11, Hole: 4, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9880, Step: 0, Hole: 0, RangeCheck: 0}) +#11: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9880, Step: 0, Hole: 0, RangeCheck: 0}) +#16: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#20: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#25: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 2, RangeCheck: 0}) +#32: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) +#40: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 30900, Step: 12, Hole: 4, RangeCheck: 0}) test::bar: OrderedHashMap({Const: 10000, Step: 1, Hole: 0, RangeCheck: 0}) //! > gas_solution_linear -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#8: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#13: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 19760, Step: 0, Hole: 0, RangeCheck: 0}) -#17: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 19760, Step: 0, Hole: 0, RangeCheck: 0}) -#22: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9880, Step: 0, Hole: 2, RangeCheck: 0}) -#29: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) -#37: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 30800, Step: 11, Hole: 4, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#11: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#16: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 19760, Step: 0, Hole: 0, RangeCheck: 0}) +#20: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 19760, Step: 0, Hole: 0, RangeCheck: 0}) +#25: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9880, Step: 0, Hole: 2, RangeCheck: 0}) +#32: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) +#40: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 30900, Step: 12, Hole: 4, RangeCheck: 0}) test::bar: OrderedHashMap({Const: 10000, Step: 1, Hole: 0, RangeCheck: 0}) //! > ap_solution_lp -#2: 2 -#8: 2 +#5: 2 +#11: 2 test::bar: 1 -test::foo: 10 +test::foo: 11 //! > ap_solution_linear -#2: 2 -#8: 2 +#5: 2 +#11: 2 -test::foo: 10 +test::foo: 11 test::bar: 1 //! > sierra_code @@ -285,13 +296,15 @@ type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_size type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; libfunc dup = dup; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; libfunc const_as_immediate> = const_as_immediate>; -libfunc felt252_sub = felt252_sub; -libfunc store_temp = store_temp; libfunc const_as_immediate> = const_as_immediate>; libfunc store_temp = store_temp; libfunc function_call = function_call; @@ -299,52 +312,56 @@ libfunc drop> = drop>; libfunc drop = drop; libfunc redeposit_gas = redeposit_gas; -dup([1]) -> ([1], [2]); // 0 -felt252_is_zero([2]) { fallthrough() 29([3]) }; // 1 -branch_align() -> (); // 2 -const_as_immediate>() -> ([4]); // 3 -dup([1]) -> ([1], [5]); // 4 -felt252_sub([5], [4]) -> ([6]); // 5 -store_temp([6]) -> ([6]); // 6 -felt252_is_zero([6]) { fallthrough() 22([7]) }; // 7 -branch_align() -> (); // 8 -const_as_immediate>() -> ([8]); // 9 -felt252_sub([1], [8]) -> ([9]); // 10 -store_temp([9]) -> ([9]); // 11 -felt252_is_zero([9]) { fallthrough() 17([10]) }; // 12 -branch_align() -> (); // 13 -store_temp([0]) -> ([0]); // 14 -function_call([0]) -> ([11]); // 15 -return([11]); // 16 -branch_align() -> (); // 17 -drop>([10]) -> (); // 18 -store_temp([0]) -> ([0]); // 19 -function_call([0]) -> ([12]); // 20 -return([12]); // 21 -branch_align() -> (); // 22 -drop>([7]) -> (); // 23 -drop([1]) -> (); // 24 -store_temp([0]) -> ([0]); // 25 -function_call([0]) -> ([13]); // 26 -function_call([13]) -> ([14]); // 27 -return([14]); // 28 -branch_align() -> (); // 29 -drop>([3]) -> (); // 30 -drop([1]) -> (); // 31 -store_temp([0]) -> ([0]); // 32 -function_call([0]) -> ([15]); // 33 -function_call([15]) -> ([16]); // 34 -function_call([16]) -> ([17]); // 35 -return([17]); // 36 -redeposit_gas([0]) -> ([1]); // 37 -store_temp([1]) -> ([1]); // 38 -return([1]); // 39 +const_as_immediate>() -> ([2]); // 0 +dup([1]) -> ([1], [3]); // 1 +felt252_sub([3], [2]) -> ([4]); // 2 +store_temp([4]) -> ([4]); // 3 +felt252_is_zero([4]) { fallthrough() 32([5]) }; // 4 +branch_align() -> (); // 5 +const_as_immediate>() -> ([6]); // 6 +dup([1]) -> ([1], [7]); // 7 +felt252_sub([7], [6]) -> ([8]); // 8 +store_temp([8]) -> ([8]); // 9 +felt252_is_zero([8]) { fallthrough() 25([9]) }; // 10 +branch_align() -> (); // 11 +const_as_immediate>() -> ([10]); // 12 +felt252_sub([1], [10]) -> ([11]); // 13 +store_temp([11]) -> ([11]); // 14 +felt252_is_zero([11]) { fallthrough() 20([12]) }; // 15 +branch_align() -> (); // 16 +store_temp([0]) -> ([0]); // 17 +function_call([0]) -> ([13]); // 18 +return([13]); // 19 +branch_align() -> (); // 20 +drop>([12]) -> (); // 21 +store_temp([0]) -> ([0]); // 22 +function_call([0]) -> ([14]); // 23 +return([14]); // 24 +branch_align() -> (); // 25 +drop>([9]) -> (); // 26 +drop([1]) -> (); // 27 +store_temp([0]) -> ([0]); // 28 +function_call([0]) -> ([15]); // 29 +function_call([15]) -> ([16]); // 30 +return([16]); // 31 +branch_align() -> (); // 32 +drop>([5]) -> (); // 33 +drop([1]) -> (); // 34 +store_temp([0]) -> ([0]); // 35 +function_call([0]) -> ([17]); // 36 +function_call([17]) -> ([18]); // 37 +function_call([18]) -> ([19]); // 38 +return([19]); // 39 +redeposit_gas([0]) -> ([1]); // 40 +store_temp([1]) -> ([1]); // 41 +return([1]); // 42 test::foo@0([0]: GasBuiltin, [1]: felt252) -> (GasBuiltin); -test::bar@37([0]: GasBuiltin) -> (GasBuiltin); +test::bar@40([0]: GasBuiltin) -> (GasBuiltin); //! > casm -jmp rel 28 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 28 if [ap + -1] != 0; ap += 2; [fp + -3] = [ap + 0] + 1, ap++; jmp rel 16 if [ap + -1] != 0; @@ -415,45 +432,47 @@ fn bar() { test::bar 10000 //! > gas_solution_lp -#0: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 1}) -#1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9730, Step: 0, Hole: 0, RangeCheck: 0}) -#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 1, Hole: 0, RangeCheck: 0}) -#6: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) -#12: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 10060, Step: 1, Hole: 0, RangeCheck: 0}) -#16: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 250, Step: 1, Hole: 2, RangeCheck: 1}) -#23: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#31: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 21170, Step: 13, Hole: 0, RangeCheck: 1}) +#0: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 3, RangeCheck: 1}) +#1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9740, Step: 0, Hole: 0, RangeCheck: 0}) +#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#8: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 1, Hole: 0, RangeCheck: 0}) +#9: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 0}) +#15: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 10060, Step: 1, Hole: 0, RangeCheck: 0}) +#19: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 250, Step: 1, Hole: 2, RangeCheck: 1}) +#26: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#34: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 21280, Step: 14, Hole: 1, RangeCheck: 1}) test::bar: OrderedHashMap({Const: 10000, Step: 1, Hole: 0, RangeCheck: 0}) //! > gas_solution_linear -#0: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 4, RangeCheck: 1}) +#0: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 3, RangeCheck: 1}) #1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 1, Hole: 0, RangeCheck: 0}) -#6: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9730, Step: 0, Hole: 4, RangeCheck: 0}) -#12: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 19790, Step: 1, Hole: 0, RangeCheck: 0}) -#16: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9980, Step: 1, Hole: 2, RangeCheck: 1}) -#23: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#31: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 21170, Step: 13, Hole: 0, RangeCheck: 1}) +#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#8: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 1, Hole: 0, RangeCheck: 0}) +#9: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9740, Step: 0, Hole: 4, RangeCheck: 0}) +#15: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 19800, Step: 1, Hole: 0, RangeCheck: 0}) +#19: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9990, Step: 1, Hole: 2, RangeCheck: 1}) +#26: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#34: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 21280, Step: 14, Hole: 1, RangeCheck: 1}) test::bar: OrderedHashMap({Const: 10000, Step: 1, Hole: 0, RangeCheck: 0}) //! > ap_solution_lp -#12: 4 -#16: 2 +#15: 4 +#19: 2 +#26: 1 test::bar: 1 -test::foo: 11 +test::foo: 12 //! > ap_solution_linear -#12: 4 -#16: 2 +#15: 4 +#19: 2 +#26: 1 -test::foo: 11 +test::foo: 12 test::bar: 1 //! > sierra_code @@ -461,10 +480,14 @@ type RangeCheck = RangeCheck [storable: true, drop: false, dup: false, zero_size type Unit = Struct [storable: true, drop: true, dup: true, zero_sized: true]; type felt252 = felt252 [storable: true, drop: true, dup: true, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_sized: false]; libfunc withdraw_gas = withdraw_gas; libfunc branch_align = branch_align; +libfunc const_as_immediate> = const_as_immediate>; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc store_temp = store_temp; @@ -473,76 +496,81 @@ libfunc drop> = drop>; libfunc drop = drop; libfunc redeposit_gas = redeposit_gas; -withdraw_gas([0], [1]) { fallthrough([3], [4]) 23([5], [6]) }; // 0 +withdraw_gas([0], [1]) { fallthrough([3], [4]) 26([5], [6]) }; // 0 branch_align() -> (); // 1 -store_temp([3]) -> ([3]); // 2 -felt252_is_zero([2]) { fallthrough() 16([7]) }; // 3 -branch_align() -> (); // 4 -withdraw_gas([3], [4]) { fallthrough([8], [9]) 12([10], [11]) }; // 5 -branch_align() -> (); // 6 -store_temp([9]) -> ([9]); // 7 -function_call([9]) -> ([12]); // 8 -store_temp([8]) -> ([8]); // 9 -store_temp([12]) -> ([12]); // 10 -return([8], [12]); // 11 -branch_align() -> (); // 12 -store_temp([10]) -> ([10]); // 13 -store_temp([11]) -> ([11]); // 14 -return([10], [11]); // 15 -branch_align() -> (); // 16 -drop>([7]) -> (); // 17 -store_temp([4]) -> ([4]); // 18 -function_call([4]) -> ([13]); // 19 -store_temp([3]) -> ([3]); // 20 -store_temp([13]) -> ([13]); // 21 -return([3], [13]); // 22 -branch_align() -> (); // 23 -drop([2]) -> (); // 24 -store_temp([6]) -> ([6]); // 25 -function_call([6]) -> ([14]); // 26 -function_call([14]) -> ([15]); // 27 -store_temp([5]) -> ([5]); // 28 -store_temp([15]) -> ([15]); // 29 -return([5], [15]); // 30 -redeposit_gas([0]) -> ([1]); // 31 -store_temp([1]) -> ([1]); // 32 -return([1]); // 33 +const_as_immediate>() -> ([7]); // 2 +felt252_sub([2], [7]) -> ([8]); // 3 +store_temp([8]) -> ([8]); // 4 +store_temp([3]) -> ([3]); // 5 +felt252_is_zero([8]) { fallthrough() 19([9]) }; // 6 +branch_align() -> (); // 7 +withdraw_gas([3], [4]) { fallthrough([10], [11]) 15([12], [13]) }; // 8 +branch_align() -> (); // 9 +store_temp([11]) -> ([11]); // 10 +function_call([11]) -> ([14]); // 11 +store_temp([10]) -> ([10]); // 12 +store_temp([14]) -> ([14]); // 13 +return([10], [14]); // 14 +branch_align() -> (); // 15 +store_temp([12]) -> ([12]); // 16 +store_temp([13]) -> ([13]); // 17 +return([12], [13]); // 18 +branch_align() -> (); // 19 +drop>([9]) -> (); // 20 +store_temp([4]) -> ([4]); // 21 +function_call([4]) -> ([15]); // 22 +store_temp([3]) -> ([3]); // 23 +store_temp([15]) -> ([15]); // 24 +return([3], [15]); // 25 +branch_align() -> (); // 26 +drop([2]) -> (); // 27 +store_temp([6]) -> ([6]); // 28 +function_call([6]) -> ([16]); // 29 +function_call([16]) -> ([17]); // 30 +store_temp([5]) -> ([5]); // 31 +store_temp([17]) -> ([17]); // 32 +return([5], [17]); // 33 +redeposit_gas([0]) -> ([1]); // 34 +store_temp([1]) -> ([1]); // 35 +return([1]); // 36 test::foo@0([0]: RangeCheck, [1]: GasBuiltin, [2]: felt252) -> (RangeCheck, GasBuiltin); -test::bar@31([0]: GasBuiltin) -> (GasBuiltin); +test::bar@34([0]: GasBuiltin) -> (GasBuiltin); //! > casm %{ memory[ap + 0] = 0 <= memory[fp + -4] %} jmp rel 7 if [ap + 0] != 0, ap++; [ap + 0] = [fp + -4] + 340282366920938463463374607431768211456, ap++; [ap + -1] = [[fp + -5] + 0]; -jmp rel 40; +jmp rel 42; [fp + -4] = [ap + 0] + 0, ap++; [ap + -1] = [[fp + -5] + 0]; +[fp + -3] = [ap + 0] + 0, ap++; [ap + 0] = [fp + -5] + 1, ap++; -jmp rel 25 if [fp + -3] != 0; -%{ memory[ap + 0] = 0 <= memory[ap + -2] %} +jmp rel 25 if [ap + -2] != 0; +%{ memory[ap + 0] = 0 <= memory[ap + -3] %} jmp rel 7 if [ap + 0] != 0, ap++; -[ap + 0] = [ap + -3] + 340282366920938463463374607431768211456, ap++; +[ap + 0] = [ap + -4] + 340282366920938463463374607431768211456, ap++; [ap + -1] = [[ap + -3] + 0]; jmp rel 12; -[ap + -3] = [ap + 0] + 0, ap++; +[ap + -4] = [ap + 0] + 0, ap++; [ap + -1] = [[ap + -3] + 0]; [ap + 0] = [ap + -1], ap++; -call rel 29; +call rel 31; [ap + 0] = [ap + -7] + 1, ap++; [ap + 0] = [ap + -2], ap++; ret; ap += 4; [ap + 0] = [ap + -7] + 1, ap++; -[ap + 0] = [ap + -9], ap++; +[ap + 0] = [ap + -10], ap++; ret; ap += 2; -[ap + 0] = [ap + -4], ap++; -call rel 14; +[ap + 0] = [ap + -5], ap++; +call rel 16; [ap + 0] = [ap + -7], ap++; [ap + 0] = [ap + -2], ap++; ret; +ap += 1; [ap + 0] = [fp + -4], ap++; call rel 8; call rel 6; @@ -593,47 +621,47 @@ fn bar() { test::bar 2000 //! > gas_solution_lp -#1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 3, Hole: 0, RangeCheck: 1}) -#3: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 600, Step: 2, Hole: 0, RangeCheck: 0}) -#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 6, RangeCheck: 0}) -#11: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1460, Step: 0, Hole: 2, RangeCheck: 0}) -#15: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1810, Step: 0, Hole: 0, RangeCheck: 0}) -#19: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 2, RangeCheck: 1}) -#26: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 2740, Step: 8, Hole: 6, RangeCheck: 1}) +#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 3, Hole: 0, RangeCheck: 1}) +#6: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 600, Step: 2, Hole: 0, RangeCheck: 0}) +#8: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 6, RangeCheck: 0}) +#14: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1460, Step: 0, Hole: 2, RangeCheck: 0}) +#18: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1810, Step: 0, Hole: 0, RangeCheck: 0}) +#22: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 2, RangeCheck: 1}) +#29: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 2840, Step: 9, Hole: 6, RangeCheck: 1}) test::bar: OrderedHashMap({Const: 2000, Step: 1, Hole: 0, RangeCheck: 0}) //! > gas_solution_linear -#1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 3, Hole: 0, RangeCheck: 1}) -#3: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 600, Step: 2, Hole: 0, RangeCheck: 0}) -#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 6, RangeCheck: 0}) -#11: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1460, Step: 0, Hole: 2, RangeCheck: 0}) -#15: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1810, Step: 0, Hole: 0, RangeCheck: 0}) -#19: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 2, RangeCheck: 1}) -#26: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 2740, Step: 8, Hole: 6, RangeCheck: 1}) +#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 3, Hole: 0, RangeCheck: 1}) +#6: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 600, Step: 2, Hole: 0, RangeCheck: 0}) +#8: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 6, RangeCheck: 0}) +#14: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1460, Step: 0, Hole: 2, RangeCheck: 0}) +#18: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1810, Step: 0, Hole: 0, RangeCheck: 0}) +#22: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 2, RangeCheck: 1}) +#29: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 2840, Step: 9, Hole: 6, RangeCheck: 1}) test::bar: OrderedHashMap({Const: 2000, Step: 1, Hole: 0, RangeCheck: 0}) //! > ap_solution_lp -#11: 4 -#15: 6 -#19: 4 +#14: 4 +#18: 6 +#22: 4 test::bar: 1 -test::foo: 10 +test::foo: 11 //! > ap_solution_linear -#11: 4 -#15: 6 -#19: 4 +#14: 4 +#18: 6 +#22: 4 -test::foo: 10 +test::foo: 11 test::bar: 1 //! > sierra_code @@ -642,7 +670,11 @@ type Unit = Struct [storable: true, drop: true, dup: true, zero_sized: type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_sized: false]; type RangeCheck = RangeCheck [storable: true, drop: false, dup: false, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; libfunc withdraw_gas = withdraw_gas; @@ -652,41 +684,45 @@ libfunc store_temp = store_temp; libfunc drop> = drop>; libfunc redeposit_gas = redeposit_gas; -felt252_is_zero([2]) { fallthrough() 19([3]) }; // 0 -branch_align() -> (); // 1 -withdraw_gas([0], [1]) { fallthrough([4], [5]) 15([6], [7]) }; // 2 -branch_align() -> (); // 3 -withdraw_gas([4], [5]) { fallthrough([8], [9]) 11([10], [11]) }; // 4 -branch_align() -> (); // 5 -store_temp([9]) -> ([9]); // 6 -function_call([9]) -> ([12]); // 7 -store_temp([8]) -> ([8]); // 8 -store_temp([12]) -> ([12]); // 9 -return([8], [12]); // 10 -branch_align() -> (); // 11 -store_temp([10]) -> ([10]); // 12 -store_temp([11]) -> ([11]); // 13 -return([10], [11]); // 14 -branch_align() -> (); // 15 -store_temp([6]) -> ([6]); // 16 -store_temp([7]) -> ([7]); // 17 -return([6], [7]); // 18 -branch_align() -> (); // 19 -drop>([3]) -> (); // 20 -store_temp([1]) -> ([1]); // 21 -function_call([1]) -> ([13]); // 22 -store_temp([0]) -> ([0]); // 23 -store_temp([13]) -> ([13]); // 24 -return([0], [13]); // 25 -redeposit_gas([0]) -> ([1]); // 26 -store_temp([1]) -> ([1]); // 27 -return([1]); // 28 +const_as_immediate>() -> ([3]); // 0 +felt252_sub([2], [3]) -> ([4]); // 1 +store_temp([4]) -> ([4]); // 2 +felt252_is_zero([4]) { fallthrough() 22([5]) }; // 3 +branch_align() -> (); // 4 +withdraw_gas([0], [1]) { fallthrough([6], [7]) 18([8], [9]) }; // 5 +branch_align() -> (); // 6 +withdraw_gas([6], [7]) { fallthrough([10], [11]) 14([12], [13]) }; // 7 +branch_align() -> (); // 8 +store_temp([11]) -> ([11]); // 9 +function_call([11]) -> ([14]); // 10 +store_temp([10]) -> ([10]); // 11 +store_temp([14]) -> ([14]); // 12 +return([10], [14]); // 13 +branch_align() -> (); // 14 +store_temp([12]) -> ([12]); // 15 +store_temp([13]) -> ([13]); // 16 +return([12], [13]); // 17 +branch_align() -> (); // 18 +store_temp([8]) -> ([8]); // 19 +store_temp([9]) -> ([9]); // 20 +return([8], [9]); // 21 +branch_align() -> (); // 22 +drop>([5]) -> (); // 23 +store_temp([1]) -> ([1]); // 24 +function_call([1]) -> ([15]); // 25 +store_temp([0]) -> ([0]); // 26 +store_temp([15]) -> ([15]); // 27 +return([0], [15]); // 28 +redeposit_gas([0]) -> ([1]); // 29 +store_temp([1]) -> ([1]); // 30 +return([1]); // 31 test::foo@0([0]: RangeCheck, [1]: GasBuiltin, [2]: felt252) -> (RangeCheck, GasBuiltin); -test::bar@26([0]: GasBuiltin) -> (GasBuiltin); +test::bar@29([0]: GasBuiltin) -> (GasBuiltin); //! > casm -jmp rel 41 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 41 if [ap + -1] != 0; %{ memory[ap + 0] = 0 <= memory[fp + -4] %} jmp rel 7 if [ap + 0] != 0, ap++; [ap + 0] = [fp + -4] + 340282366920938463463374607431768211456, ap++; @@ -761,43 +797,43 @@ test::bar 10000 test::foo 100000 //! > gas_solution_lp -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 79300, Step: 0, Hole: 5, RangeCheck: 0}) -#10: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#12: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 89180, Step: 0, Hole: 0, RangeCheck: 0}) -#18: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 3, RangeCheck: 0}) -#22: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#24: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 10070, Step: 2, Hole: 0, RangeCheck: 0}) -#27: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 100000, Step: 9, Hole: 5, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#10: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 79200, Step: 0, Hole: 5, RangeCheck: 0}) +#13: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#15: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 89080, Step: 0, Hole: 0, RangeCheck: 0}) +#21: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 3, RangeCheck: 0}) +#25: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#27: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 10070, Step: 2, Hole: 0, RangeCheck: 0}) +#30: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 100000, Step: 10, Hole: 5, RangeCheck: 0}) test::bar: OrderedHashMap({Const: 10000, Step: 1, Hole: 0, RangeCheck: 0}) //! > gas_solution_linear -#2: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#7: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 79300, Step: 0, Hole: 5, RangeCheck: 0}) -#10: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#12: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 89180, Step: 0, Hole: 0, RangeCheck: 0}) -#18: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 3, RangeCheck: 0}) -#22: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#24: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 10070, Step: 2, Hole: 0, RangeCheck: 0}) -#27: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) - -test::foo: OrderedHashMap({Const: 100000, Step: 9, Hole: 5, RangeCheck: 0}) +#5: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#10: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 79200, Step: 0, Hole: 5, RangeCheck: 0}) +#13: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#15: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 89080, Step: 0, Hole: 0, RangeCheck: 0}) +#21: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 3, RangeCheck: 0}) +#25: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#27: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 10070, Step: 2, Hole: 0, RangeCheck: 0}) +#30: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 9900, Step: 0, Hole: 0, RangeCheck: 0}) + +test::foo: OrderedHashMap({Const: 100000, Step: 10, Hole: 5, RangeCheck: 0}) test::bar: OrderedHashMap({Const: 10000, Step: 1, Hole: 0, RangeCheck: 0}) //! > ap_solution_lp -#10: 2 -#22: 3 +#13: 2 +#25: 3 test::bar: 1 -test::foo: 8 +test::foo: 9 //! > ap_solution_linear -#10: 2 -#22: 3 +#13: 2 +#25: 3 -test::foo: 8 +test::foo: 9 test::bar: 1 //! > sierra_code @@ -806,8 +842,12 @@ type Unit = Struct [storable: true, drop: true, dup: true, zero_sized: type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; libfunc dup = dup; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; libfunc drop = drop; @@ -816,53 +856,55 @@ libfunc function_call = function_call; libfunc redeposit_gas = redeposit_gas; libfunc drop> = drop>; libfunc const_as_immediate> = const_as_immediate>; -libfunc felt252_sub = felt252_sub; -libfunc store_temp = store_temp; -dup([1]) -> ([1], [2]); // 0 -felt252_is_zero([2]) { fallthrough() 10([3]) }; // 1 -branch_align() -> (); // 2 -drop([1]) -> (); // 3 -store_temp([0]) -> ([0]); // 4 -function_call([0]) -> ([4]); // 5 -function_call([4]) -> ([5]); // 6 -redeposit_gas([5]) -> ([6]); // 7 -store_temp([6]) -> ([6]); // 8 -return([6]); // 9 -branch_align() -> (); // 10 -drop>([3]) -> (); // 11 -redeposit_gas([0]) -> ([7]); // 12 -const_as_immediate>() -> ([8]); // 13 -felt252_sub([1], [8]) -> ([9]); // 14 -store_temp([9]) -> ([9]); // 15 -store_temp([7]) -> ([7]); // 16 -felt252_is_zero([9]) { fallthrough() 22([10]) }; // 17 -branch_align() -> (); // 18 -store_temp([7]) -> ([7]); // 19 -function_call([7]) -> ([11]); // 20 -return([11]); // 21 -branch_align() -> (); // 22 -drop>([10]) -> (); // 23 -redeposit_gas([7]) -> ([12]); // 24 -store_temp([12]) -> ([12]); // 25 -return([12]); // 26 -redeposit_gas([0]) -> ([1]); // 27 -store_temp([1]) -> ([1]); // 28 -return([1]); // 29 +const_as_immediate>() -> ([2]); // 0 +dup([1]) -> ([1], [3]); // 1 +felt252_sub([3], [2]) -> ([4]); // 2 +store_temp([4]) -> ([4]); // 3 +felt252_is_zero([4]) { fallthrough() 13([5]) }; // 4 +branch_align() -> (); // 5 +drop([1]) -> (); // 6 +store_temp([0]) -> ([0]); // 7 +function_call([0]) -> ([6]); // 8 +function_call([6]) -> ([7]); // 9 +redeposit_gas([7]) -> ([8]); // 10 +store_temp([8]) -> ([8]); // 11 +return([8]); // 12 +branch_align() -> (); // 13 +drop>([5]) -> (); // 14 +redeposit_gas([0]) -> ([9]); // 15 +const_as_immediate>() -> ([10]); // 16 +felt252_sub([1], [10]) -> ([11]); // 17 +store_temp([11]) -> ([11]); // 18 +store_temp([9]) -> ([9]); // 19 +felt252_is_zero([11]) { fallthrough() 25([12]) }; // 20 +branch_align() -> (); // 21 +store_temp([9]) -> ([9]); // 22 +function_call([9]) -> ([13]); // 23 +return([13]); // 24 +branch_align() -> (); // 25 +drop>([12]) -> (); // 26 +redeposit_gas([9]) -> ([14]); // 27 +store_temp([14]) -> ([14]); // 28 +return([14]); // 29 +redeposit_gas([0]) -> ([1]); // 30 +store_temp([1]) -> ([1]); // 31 +return([1]); // 32 test::foo@0([0]: GasBuiltin, [1]: felt252) -> (GasBuiltin); -test::bar@27([0]: GasBuiltin) -> (GasBuiltin); +test::bar@30([0]: GasBuiltin) -> (GasBuiltin); //! > casm -jmp rel 10 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 10 if [ap + -1] != 0; [ap + 0] = [fp + -4], ap++; call rel 24; call rel 22; -[ap + 0] = [ap + -1] + 79300, ap++; +[ap + 0] = [ap + -1] + 79200, ap++; ret; ap += 2; [fp + -3] = [ap + 0] + 1, ap++; -[ap + 0] = [fp + -4] + 89180, ap++; +[ap + 0] = [fp + -4] + 89080, ap++; jmp rel 6 if [ap + -2] != 0; [ap + 0] = [ap + -1], ap++; call rel 8; @@ -1016,31 +1058,31 @@ fn bar() { } //! > gas_solution_lp -#1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 9, RangeCheck: 0}) -#9: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#11: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 3, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1310, Step: 14, Hole: 0, RangeCheck: 0}) +#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 9, RangeCheck: 0}) +#12: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#14: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 3, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1310, Step: 14, Hole: 0, RangeCheck: 0}) -test::foo: OrderedHashMap({Bitwise: 3, Const: 2500, Step: 25, Hole: 9, RangeCheck: 0}) +test::foo: OrderedHashMap({Bitwise: 3, Const: 2600, Step: 26, Hole: 9, RangeCheck: 0}) test::bar: OrderedHashMap({Bitwise: 1, Const: 500, Step: 5, Hole: 0, RangeCheck: 0}) //! > gas_solution_linear -#1: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 9, RangeCheck: 0}) -#9: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) -#11: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 3, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1310, Step: 14, Hole: 0, RangeCheck: 0}) +#4: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 9, RangeCheck: 0}) +#12: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 0, EcOp: 0, AddMod: 0, MulMod: 0, Const: 0, Step: 0, Hole: 0, RangeCheck: 0}) +#14: OrderedHashMap({Pedersen: 0, Poseidon: 0, Bitwise: 3, EcOp: 0, AddMod: 0, MulMod: 0, Const: 1310, Step: 14, Hole: 0, RangeCheck: 0}) -test::foo: OrderedHashMap({Bitwise: 3, Const: 2500, Step: 25, Hole: 9, RangeCheck: 0}) +test::foo: OrderedHashMap({Bitwise: 3, Const: 2600, Step: 26, Hole: 9, RangeCheck: 0}) test::bar: OrderedHashMap({Bitwise: 1, Const: 500, Step: 5, Hole: 0, RangeCheck: 0}) //! > ap_solution_lp -#9: 9 +#12: 9 test::bar: 3 -test::foo: 18 +test::foo: 19 //! > ap_solution_linear -#9: 9 +#12: 9 -test::foo: 18 +test::foo: 19 test::bar: 3 //! > sierra_code @@ -1052,7 +1094,11 @@ type u128 = u128 [storable: true, drop: true, dup: true, zero_sized: false]; type GasBuiltin = GasBuiltin [storable: true, drop: false, dup: false, zero_sized: false]; type Bitwise = Bitwise [storable: true, drop: false, dup: false, zero_sized: false]; type NonZero = NonZero [storable: true, drop: true, dup: true, zero_sized: false]; +type Const = Const [storable: false, drop: false, dup: false, zero_sized: false]; +libfunc const_as_immediate> = const_as_immediate>; +libfunc felt252_sub = felt252_sub; +libfunc store_temp = store_temp; libfunc felt252_is_zero = felt252_is_zero; libfunc branch_align = branch_align; libfunc store_temp = store_temp; @@ -1066,37 +1112,41 @@ libfunc store_temp = store_temp; libfunc bitwise = bitwise; libfunc drop = drop; -felt252_is_zero([2]) { fallthrough() 9([3]) }; // 0 -branch_align() -> (); // 1 -store_temp([1]) -> ([1]); // 2 -function_call([1]) -> ([4]); // 3 -function_call([4]) -> ([5]); // 4 -function_call([5]) -> ([6]); // 5 -store_temp([0]) -> ([0]); // 6 -store_temp([6]) -> ([6]); // 7 -return([0], [6]); // 8 -branch_align() -> (); // 9 -drop>([3]) -> (); // 10 -redeposit_gas([0]) -> ([7]); // 11 -store_temp([7]) -> ([7]); // 12 -store_temp([1]) -> ([1]); // 13 -return([7], [1]); // 14 -const_as_immediate>() -> ([1]); // 15 -const_as_immediate>() -> ([2]); // 16 -store_temp([1]) -> ([1]); // 17 -store_temp([2]) -> ([2]); // 18 -bitwise([0], [1], [2]) -> ([3], [4], [5], [6]); // 19 -drop([4]) -> (); // 20 -drop([5]) -> (); // 21 -drop([6]) -> (); // 22 -store_temp([3]) -> ([3]); // 23 -return([3]); // 24 +const_as_immediate>() -> ([3]); // 0 +felt252_sub([2], [3]) -> ([4]); // 1 +store_temp([4]) -> ([4]); // 2 +felt252_is_zero([4]) { fallthrough() 12([5]) }; // 3 +branch_align() -> (); // 4 +store_temp([1]) -> ([1]); // 5 +function_call([1]) -> ([6]); // 6 +function_call([6]) -> ([7]); // 7 +function_call([7]) -> ([8]); // 8 +store_temp([0]) -> ([0]); // 9 +store_temp([8]) -> ([8]); // 10 +return([0], [8]); // 11 +branch_align() -> (); // 12 +drop>([5]) -> (); // 13 +redeposit_gas([0]) -> ([9]); // 14 +store_temp([9]) -> ([9]); // 15 +store_temp([1]) -> ([1]); // 16 +return([9], [1]); // 17 +const_as_immediate>() -> ([1]); // 18 +const_as_immediate>() -> ([2]); // 19 +store_temp([1]) -> ([1]); // 20 +store_temp([2]) -> ([2]); // 21 +bitwise([0], [1], [2]) -> ([3], [4], [5], [6]); // 22 +drop([4]) -> (); // 23 +drop([5]) -> (); // 24 +drop([6]) -> (); // 25 +store_temp([3]) -> ([3]); // 26 +return([3]); // 27 test::foo@0([0]: GasBuiltin, [1]: Bitwise, [2]: felt252) -> (GasBuiltin, Bitwise); -test::bar@15([0]: Bitwise) -> (Bitwise); +test::bar@18([0]: Bitwise) -> (Bitwise); //! > casm -jmp rel 12 if [fp + -3] != 0; +[fp + -3] = [ap + 0] + 0, ap++; +jmp rel 12 if [ap + -1] != 0; [ap + 0] = [fp + -4], ap++; call rel 24; call rel 22;