Skip to content

Commit 284e492

Browse files
Uninline storage_base_address_from_felt252 to reduce code size.
1 parent 7395387 commit 284e492

28 files changed

+25804
-32740
lines changed

corelib/src/starknet/storage_access.cairo

+15-3
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,24 @@ impl StorageBaseAddressDrop of Drop<StorageBaseAddress>;
6868
/// ```
6969
pub extern fn storage_base_address_const<const address: felt252>() -> StorageBaseAddress nopanic;
7070

71+
72+
mod internal {
73+
/// Internal libfunc declaration, the wrapper function below is used to reduce code size.
74+
pub extern fn storage_base_address_from_felt252(
75+
addr: felt252,
76+
) -> super::StorageBaseAddress implicits(super::RangeCheck) nopanic;
77+
}
78+
79+
7180
/// Returns a `StorageBaseAddress` given a `felt252` value.
7281
///
7382
/// Wraps around the value if it is not in the range `[0, 2**251 - 256)`.
74-
pub extern fn storage_base_address_from_felt252(
75-
addr: felt252,
76-
) -> StorageBaseAddress implicits(RangeCheck) nopanic;
83+
/// `inline(never)` is used to reduce code size.
84+
#[inline(never)]
85+
pub fn storage_base_address_from_felt252(addr: felt252) -> StorageBaseAddress nopanic {
86+
internal::storage_base_address_from_felt252(addr)
87+
}
88+
7789

7890
pub(crate) extern fn storage_address_to_felt252(address: StorageAddress) -> felt252 nopanic;
7991

crates/cairo-lang-lowering/src/optimizations/const_folding.rs

+15-13
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,15 @@ impl ConstFoldingContext<'_> {
286286
.concretize(db, vec![GenericArgumentId::Constant(val.clone().intern(db))])
287287
.lowered(db);
288288
return None;
289+
} else if stmt.function == self.storage_base_address_from_felt252 {
290+
let input_var = stmt.inputs[0].var_id;
291+
if let Some(ConstValue::Int(val, ty)) = self.as_const(input_var) {
292+
stmt.inputs.clear();
293+
let arg = GenericArgumentId::Constant(ConstValue::Int(val.clone(), *ty).intern(db));
294+
stmt.function =
295+
self.storage_base_address_const.concretize(db, vec![arg]).lowered(db);
296+
}
297+
return None;
289298
}
290299
let (id, _generic_args) = stmt.function.get_extern(db)?;
291300
if id == self.felt_sub {
@@ -327,15 +336,6 @@ impl ConstFoldingContext<'_> {
327336
self.var_info.insert(r_output, VarInfo::Const(r_value.clone()));
328337
additional_consts.push(StatementConst { value: r_value, output: r_output });
329338
Some(StatementConst { value: q_value, output: q_output })
330-
} else if id == self.storage_base_address_from_felt252 {
331-
let input_var = stmt.inputs[0].var_id;
332-
if let Some(ConstValue::Int(val, ty)) = self.as_const(input_var) {
333-
stmt.inputs.clear();
334-
let arg = GenericArgumentId::Constant(ConstValue::Int(val.clone(), *ty).intern(db));
335-
stmt.function =
336-
self.storage_base_address_const.concretize(db, vec![arg]).lowered(db);
337-
}
338-
None
339339
} else if id == self.into_box {
340340
let const_value = match self.var_info.get(&stmt.inputs[0].var_id)? {
341341
VarInfo::Const(val) => val,
@@ -662,10 +662,10 @@ pub struct ConstFoldingLibfuncInfo {
662662
array_get: ExternFunctionId,
663663
/// The `array_snapshot_pop_front` libfunc.
664664
array_snapshot_pop_front: GenericFunctionId,
665-
/// The `storage_base_address_from_felt252` libfunc.
666-
storage_base_address_from_felt252: ExternFunctionId,
667665
/// The `storage_base_address_const` libfunc.
668666
storage_base_address_const: GenericFunctionId,
667+
/// The `storage_base_address_from_felt252` function.
668+
storage_base_address_from_felt252: FunctionId,
669669
/// The `core::panic_with_felt252` function.
670670
panic_with_felt252: FunctionId,
671671
/// The `core::panic_with_const_felt252` function.
@@ -684,6 +684,9 @@ impl ConstFoldingLibfuncInfo {
684684
let array_module = core.submodule("array");
685685
let starknet_module = core.submodule("starknet");
686686
let storage_access_module = starknet_module.submodule("storage_access");
687+
let storage_base_address_from_felt252 = storage_access_module
688+
.function_id("storage_base_address_from_felt252", vec![])
689+
.lowered(db);
687690
let nz_fns = OrderedHashSet::<_>::from_iter(chain!(
688691
[
689692
core.extern_function_id("felt252_is_zero"),
@@ -769,8 +772,7 @@ impl ConstFoldingLibfuncInfo {
769772
bounded_int_constrain: bounded_int_module.extern_function_id("bounded_int_constrain"),
770773
array_get: array_module.extern_function_id("array_get"),
771774
array_snapshot_pop_front: array_module.generic_function_id("array_snapshot_pop_front"),
772-
storage_base_address_from_felt252: storage_access_module
773-
.extern_function_id("storage_base_address_from_felt252"),
775+
storage_base_address_from_felt252,
774776
storage_base_address_const: storage_access_module
775777
.generic_function_id("storage_base_address_const"),
776778
panic_with_felt252: core.function_id("panic_with_felt252", vec![]).lowered(db),

crates/cairo-lang-runner/src/profiling_test_data/major_test_cases

+58-47
Original file line numberDiff line numberDiff line change
@@ -799,10 +799,7 @@ erc20_transfer
799799

800800
//! > expected_profiling_info
801801
Weight by sierra statement:
802-
statement 295: 10 (storage_base_address_from_felt252([0], [27]) -> ([28], [29]))
803-
statement 379: 10 (storage_base_address_from_felt252([87], [106]) -> ([107], [108]))
804-
statement 409: 10 (storage_base_address_from_felt252([107], [136]) -> ([137], [138]))
805-
statement 494: 10 (storage_base_address_from_felt252([196], [215]) -> ([216], [217]))
802+
statement 846: 40 (storage_base_address_from_felt252([0], [1]) -> ([2], [3]))
806803
statement 530: 9 (emit_event_syscall([231], [232], [248], [249]) { fallthrough([250], [251]) 543([252], [253], [254]) })
807804
statement 388: 8 (storage_write_syscall([88], [53], [113], [111], [109]) { fallthrough([114], [115]) 701([116], [117], [118]) })
808805
statement 396: 8 (storage_write_syscall([114], [115], [112], [121], [119]) { fallthrough([122], [123]) 687([124], [125], [126]) })
@@ -816,6 +813,9 @@ Weight by sierra statement:
816813
statement 100: 6 (withdraw_gas_all([33], [6], [43]) { fallthrough([44], [45]) 163([46], [47]) })
817814
statement 103: 5 (get_execution_info_v2_syscall([45], [3]) { fallthrough([48], [49], [50]) 150([51], [52], [53]) })
818815
statement 519: 5 (store_temp<test::erc_20::Event>([241]) -> ([241]))
816+
statement 847: 4 (store_temp<RangeCheck>([2]) -> ([2]))
817+
statement 848: 4 (store_temp<StorageBaseAddress>([3]) -> ([3]))
818+
statement 849: 4 (return([2], [3]))
819819
statement 37: 3 (store_temp<core::panics::PanicResult::<((),)>>([28]) -> ([28]))
820820
statement 50: 3 (withdraw_gas([1], [2]) { fallthrough([5], [6]) 231([7], [8]) })
821821
statement 81: 3 (array_snapshot_pop_front<felt252>([28]) { fallthrough([38], [39]) 96([40]) })
@@ -848,8 +848,8 @@ Weight by sierra statement:
848848
statement 492: 2 (pedersen([135], [213], [209]) -> ([214], [215]))
849849
statement 520: 2 (store_temp<Array<felt252>>([236]) -> ([236]))
850850
statement 521: 2 (store_temp<Array<felt252>>([237]) -> ([237]))
851-
statement 879: 2 (store_temp<Array<felt252>>([6]) -> ([6]))
852-
statement 880: 2 (store_temp<Array<felt252>>([34]) -> ([34]))
851+
statement 883: 2 (store_temp<Array<felt252>>([6]) -> ([6]))
852+
statement 884: 2 (store_temp<Array<felt252>>([34]) -> ([34]))
853853
statement 5: 1 (cheatcode<10052436086942832998170947883001859293934451>([6]) -> ([7]))
854854
statement 7: 1 (array_new<felt252>() -> ([8]))
855855
statement 9: 1 (store_temp<felt252>([9]) -> ([9]))
@@ -896,10 +896,11 @@ Weight by sierra statement:
896896
statement 250: 1 (felt252_is_zero([9]) { fallthrough() 264([10]) })
897897
statement 268: 1 (felt252_is_zero([14]) { fallthrough() 282([15]) })
898898
statement 292: 1 (store_temp<felt252>([25]) -> ([25]))
899-
statement 294: 1 (store_temp<felt252>([27]) -> ([27]))
900-
statement 305: 1 (store_temp<u32>([38]) -> ([38]))
901-
statement 306: 1 (store_temp<Pedersen>([26]) -> ([26]))
902-
statement 307: 1 (store_temp<RangeCheck>([28]) -> ([28]))
899+
statement 294: 1 (store_temp<RangeCheck>([0]) -> ([0]))
900+
statement 295: 1 (store_temp<felt252>([27]) -> ([27]))
901+
statement 296: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([0], [27]) -> ([28], [29]))
902+
statement 306: 1 (store_temp<u32>([38]) -> ([38]))
903+
statement 307: 1 (store_temp<Pedersen>([26]) -> ([26]))
903904
statement 310: 1 (store_temp<felt252>([41]) -> ([41]))
904905
statement 311: 1 (store_temp<GasBuiltin>([39]) -> ([39]))
905906
statement 312: 1 (store_temp<System>([40]) -> ([40]))
@@ -923,19 +924,21 @@ Weight by sierra statement:
923924
statement 356: 1 (jump() { 367() })
924925
statement 367: 1 (enum_match<core::bool>([78]) { fallthrough([97]) 718([98]) })
925926
statement 376: 1 (store_temp<felt252>([104]) -> ([104]))
926-
statement 378: 1 (store_temp<felt252>([106]) -> ([106]))
927-
statement 385: 1 (store_temp<u32>([113]) -> ([113]))
928-
statement 386: 1 (store_temp<Pedersen>([105]) -> ([105]))
929-
statement 387: 1 (store_temp<RangeCheck>([107]) -> ([107]))
927+
statement 378: 1 (store_temp<RangeCheck>([87]) -> ([87]))
928+
statement 379: 1 (store_temp<felt252>([106]) -> ([106]))
929+
statement 380: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([87], [106]) -> ([107], [108]))
930+
statement 386: 1 (store_temp<u32>([113]) -> ([113]))
931+
statement 387: 1 (store_temp<Pedersen>([105]) -> ([105]))
930932
statement 393: 1 (store_temp<GasBuiltin>([114]) -> ([114]))
931933
statement 394: 1 (store_temp<u32>([112]) -> ([112]))
932934
statement 395: 1 (store_temp<StorageAddress>([121]) -> ([121]))
933935
statement 406: 1 (store_temp<felt252>([134]) -> ([134]))
934-
statement 408: 1 (store_temp<felt252>([136]) -> ([136]))
935-
statement 419: 1 (store_temp<GasBuiltin>([122]) -> ([122]))
936-
statement 420: 1 (store_temp<u32>([147]) -> ([147]))
937-
statement 421: 1 (store_temp<Pedersen>([135]) -> ([135]))
938-
statement 422: 1 (store_temp<RangeCheck>([137]) -> ([137]))
936+
statement 408: 1 (store_temp<RangeCheck>([107]) -> ([107]))
937+
statement 409: 1 (store_temp<felt252>([136]) -> ([136]))
938+
statement 410: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([107], [136]) -> ([137], [138]))
939+
statement 420: 1 (store_temp<GasBuiltin>([122]) -> ([122]))
940+
statement 421: 1 (store_temp<u32>([147]) -> ([147]))
941+
statement 422: 1 (store_temp<Pedersen>([135]) -> ([135]))
939942
statement 425: 1 (store_temp<felt252>([150]) -> ([150]))
940943
statement 426: 1 (store_temp<GasBuiltin>([148]) -> ([148]))
941944
statement 427: 1 (store_temp<System>([149]) -> ([149]))
@@ -959,10 +962,11 @@ Weight by sierra statement:
959962
statement 471: 1 (jump() { 482() })
960963
statement 482: 1 (enum_match<core::bool>([187]) { fallthrough([206]) 585([207]) })
961964
statement 491: 1 (store_temp<felt252>([213]) -> ([213]))
962-
statement 493: 1 (store_temp<felt252>([215]) -> ([215]))
963-
statement 500: 1 (store_temp<u32>([222]) -> ([222]))
964-
statement 501: 1 (store_temp<Pedersen>([214]) -> ([214]))
965-
statement 502: 1 (store_temp<RangeCheck>([216]) -> ([216]))
965+
statement 493: 1 (store_temp<RangeCheck>([196]) -> ([196]))
966+
statement 494: 1 (store_temp<felt252>([215]) -> ([215]))
967+
statement 495: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([196], [215]) -> ([216], [217]))
968+
statement 501: 1 (store_temp<u32>([222]) -> ([222]))
969+
statement 502: 1 (store_temp<Pedersen>([214]) -> ([214]))
966970
statement 508: 1 (store_temp<GasBuiltin>([223]) -> ([223]))
967971
statement 509: 1 (store_temp<u32>([221]) -> ([221]))
968972
statement 510: 1 (store_temp<StorageAddress>([230]) -> ([230]))
@@ -976,19 +980,19 @@ Weight by sierra statement:
976980
statement 539: 1 (store_temp<Pedersen>([214]) -> ([214]))
977981
statement 540: 1 (store_temp<System>([251]) -> ([251]))
978982
statement 542: 1 (return([216], [255], [214], [251], [258]))
979-
statement 846: 1 (enum_match<test::erc_20::Event>([0]) { fallthrough([3]) 882([4]) })
980-
statement 849: 1 (store_temp<felt252>([5]) -> ([5]))
981-
statement 850: 1 (array_append<felt252>([1], [5]) -> ([6]))
982-
statement 857: 1 (array_append<felt252>([2], [12]) -> ([13]))
983-
statement 864: 1 (array_append<felt252>([13], [19]) -> ([20]))
984-
statement 873: 1 (array_append<felt252>([20], [28]) -> ([29]))
985-
statement 878: 1 (array_append<felt252>([29], [33]) -> ([34]))
986-
statement 881: 1 (return([6], [34]))
983+
statement 850: 1 (enum_match<test::erc_20::Event>([0]) { fallthrough([3]) 886([4]) })
984+
statement 853: 1 (store_temp<felt252>([5]) -> ([5]))
985+
statement 854: 1 (array_append<felt252>([1], [5]) -> ([6]))
986+
statement 861: 1 (array_append<felt252>([2], [12]) -> ([13]))
987+
statement 868: 1 (array_append<felt252>([13], [19]) -> ([20]))
988+
statement 877: 1 (array_append<felt252>([20], [28]) -> ([29]))
989+
statement 882: 1 (array_append<felt252>([29], [33]) -> ([34]))
990+
statement 885: 1 (return([6], [34]))
987991
Weight by concrete libfunc:
988992
libfunc storage_base_address_from_felt252: 40
989993
libfunc storage_write_syscall: 32
990994
libfunc storage_read_syscall: 28
991-
libfunc store_temp<RangeCheck>: 20
995+
libfunc store_temp<RangeCheck>: 24
992996
libfunc store_temp<felt252>: 19
993997
libfunc store_temp<GasBuiltin>: 18
994998
libfunc u128s_from_felt252: 12
@@ -1010,8 +1014,10 @@ Weight by concrete libfunc:
10101014
libfunc store_temp<test::erc_20::Event>: 5
10111015
libfunc array_new<felt252>: 4
10121016
libfunc branch_align: 4
1017+
libfunc function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>: 4
10131018
libfunc jump: 4
10141019
libfunc store_temp<StorageAddress>: 4
1020+
libfunc store_temp<StorageBaseAddress>: 4
10151021
libfunc store_temp<core::array::Span::<core::felt252>>: 4
10161022
libfunc store_temp<core::panics::PanicResult::<((),)>>: 3
10171023
libfunc store_temp<core::panics::PanicResult::<(core::array::Span::<core::felt252>,)>>: 3
@@ -1033,9 +1039,9 @@ Weight by concrete libfunc:
10331039
libfunc function_call<user@test::erc_20::__wrapper__IERC20Impl__transfer>: 1
10341040
libfunc store_temp<Box<core::starknet::info::v2::ExecutionInfo>>: 1
10351041
libfunc store_temp<BuiltinCosts>: 1
1036-
return: 4
1042+
return: 8
10371043
Weight by generic libfunc:
1038-
libfunc store_temp: 133
1044+
libfunc store_temp: 141
10391045
libfunc storage_base_address_from_felt252: 40
10401046
libfunc storage_write_syscall: 32
10411047
libfunc storage_read_syscall: 28
@@ -1045,6 +1051,7 @@ Weight by generic libfunc:
10451051
libfunc array_append: 8
10461052
libfunc pedersen: 8
10471053
libfunc contract_address_try_from_felt252: 7
1054+
libfunc function_call: 7
10481055
libfunc u128_overflowing_add: 6
10491056
libfunc u128_overflowing_sub: 6
10501057
libfunc withdraw_gas_all: 6
@@ -1053,37 +1060,39 @@ Weight by generic libfunc:
10531060
libfunc array_new: 4
10541061
libfunc branch_align: 4
10551062
libfunc jump: 4
1056-
libfunc function_call: 3
10571063
libfunc withdraw_gas: 3
10581064
libfunc const_as_box: 2
10591065
libfunc felt252_is_zero: 2
10601066
libfunc get_builtin_costs: 2
10611067
libfunc cheatcode: 1
1062-
return: 4
1068+
return: 8
10631069
Weight by user function (inc. generated):
1064-
function test::erc_20::StorageImpl::transfer_helper: 232
1070+
function test::erc_20::StorageImpl::transfer_helper: 196
10651071
function test::erc_20::__wrapper__IERC20Impl__transfer: 71
1072+
function core::starknet::storage_access::storage_base_address_from_felt252: 52
10661073
function test::erc20_transfer: 28
10671074
function test::erc_20::EventIsEvent::append_keys_and_data: 12
10681075
Weight by original user function (exc. generated):
1069-
function test::erc_20::StorageImpl::transfer_helper: 232
1076+
function test::erc_20::StorageImpl::transfer_helper: 196
10701077
function test::erc_20::__wrapper__IERC20Impl__transfer: 71
1078+
function core::starknet::storage_access::storage_base_address_from_felt252: 52
10711079
function test::erc20_transfer: 28
10721080
function test::erc_20::EventIsEvent::append_keys_and_data: 12
10731081
Weight by Cairo function:
1074-
function core::starknet::storage::StoragePathImpl::finalize: 44
1082+
function core::starknet::storage_access::storage_base_address_from_felt252: 52
10751083
function core::integer::u128_try_from_felt252: 30
10761084
function contract::ContractStateEventEmitter::emit: 29
1077-
function core::starknet::storage_access::StoreFelt252::write: 22
10781085
function core::starknet::storage_access::StoreFelt252::write_at_offset: 22
10791086
function contract::__wrapper__IERC20Impl__transfer: 21
1080-
function core::starknet::storage_access::StoreFelt252::read: 21
10811087
function core::starknet::storage_access::StoreFelt252::read_at_offset: 20
1088+
function core::starknet::storage_access::StoreFelt252::write: 20
1089+
function core::starknet::storage_access::StoreFelt252::read: 19
10821090
function core::integer::u256_overflowing_add: 18
10831091
function core::integer::u256_overflowing_sub: 18
10841092
function core::array::ArrayImpl::append: 17
10851093
function lib.cairo::erc20_transfer: 16
10861094
function core::pedersen::HashStateImpl::update: 12
1095+
function core::starknet::storage::StoragePathImpl::finalize: 12
10871096
function core::starknet::contract_address::ContractAddressSerde::deserialize: 10
10881097
function lib.cairo::erc_20::IERC20Impl::transfer: 9
10891098
function core::array::SpanImpl::pop_front: 6
@@ -1099,12 +1108,14 @@ Weight by Cairo function:
10991108
function core::integer::u256_checked_sub: 1
11001109
function starknet_derive::EventIsEvent::append_keys_and_data: 1
11011110
Weight by Sierra stack trace:
1102-
test::erc20_transfer: 343
1103-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 315
1104-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 244
1111+
test::erc20_transfer: 359
1112+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 331
1113+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 260
1114+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> core::starknet::storage_access::storage_base_address_from_felt252: 52
11051115
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> test::erc_20::EventIsEvent::append_keys_and_data: 12
11061116
Weight by Cairo stack trace:
1107-
test::erc20_transfer: 343
1108-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 315
1109-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 244
1117+
test::erc20_transfer: 359
1118+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 331
1119+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 260
1120+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> core::starknet::storage_access::storage_base_address_from_felt252: 52
11101121
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> test::erc_20::EventIsEvent::append_keys_and_data: 12

0 commit comments

Comments
 (0)