Skip to content

Commit 09be466

Browse files
Uninline storage_base_address_from_felt252 to reduce code size.
1 parent 7d254d4 commit 09be466

File tree

29 files changed

+26863
-33805
lines changed

29 files changed

+26863
-33805
lines changed

corelib/src/starknet/storage_access.cairo

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

71-
/// Returns a `StorageBaseAddress` given a `felt252` value.
72-
///
73-
/// 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;
71+
72+
mod internal {
73+
/// Returns a `StorageBaseAddress` given a `felt252` value.
74+
///
75+
/// Wraps around the value if it is not in the range `[0, 2**251 - 256)`.
76+
pub extern fn storage_base_address_from_felt252(
77+
addr: felt252,
78+
) -> super::StorageBaseAddress implicits(super::RangeCheck) nopanic;
79+
}
80+
81+
82+
#[inline(never)]
83+
pub fn storage_base_address_from_felt252(addr: felt252) -> StorageBaseAddress nopanic {
84+
internal::storage_base_address_from_felt252(addr)
85+
}
86+
7787

7888
pub(crate) extern fn storage_address_to_felt252(address: StorageAddress) -> felt252 nopanic;
7989

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

+19-18
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,21 @@ impl ConstFoldingContext<'_> {
288288
)
289289
.lowered(self.db);
290290
return None;
291+
} else if stmt.function == self.storage_base_address_from_felt252 {
292+
let input_var = stmt.inputs[0].var_id;
293+
if let Some(ConstValue::Int(val, ty)) = self.as_const(input_var) {
294+
stmt.inputs.clear();
295+
stmt.function =
296+
ModuleHelper { db: self.db.upcast(), id: self.storage_access_module }
297+
.function_id(
298+
"storage_base_address_const",
299+
vec![GenericArgumentId::Constant(
300+
ConstValue::Int(val.clone(), *ty).intern(self.db),
301+
)],
302+
)
303+
.lowered(self.db);
304+
}
305+
return None;
291306
}
292307
let (id, _generic_args) = stmt.function.get_extern(self.db)?;
293308
if id == self.felt_sub {
@@ -329,21 +344,6 @@ impl ConstFoldingContext<'_> {
329344
self.var_info.insert(r_output, VarInfo::Const(r_value.clone()));
330345
additional_consts.push(StatementConst { value: r_value, output: r_output });
331346
Some(StatementConst { value: q_value, output: q_output })
332-
} else if id == self.storage_base_address_from_felt252 {
333-
let input_var = stmt.inputs[0].var_id;
334-
if let Some(ConstValue::Int(val, ty)) = self.as_const(input_var) {
335-
stmt.inputs.clear();
336-
stmt.function =
337-
ModuleHelper { db: self.db.upcast(), id: self.storage_access_module }
338-
.function_id(
339-
"storage_base_address_const",
340-
vec![GenericArgumentId::Constant(
341-
ConstValue::Int(val.clone(), *ty).intern(self.db),
342-
)],
343-
)
344-
.lowered(self.db);
345-
}
346-
None
347347
} else if id == self.into_box {
348348
let const_value = match self.var_info.get(&stmt.inputs[0].var_id)? {
349349
VarInfo::Const(val) => val,
@@ -647,7 +647,7 @@ pub struct ConstFoldingLibfuncInfo {
647647
/// The storage access module.
648648
storage_access_module: ModuleId,
649649
/// The `storage_base_address_from_felt252` libfunc.
650-
storage_base_address_from_felt252: ExternFunctionId,
650+
storage_base_address_from_felt252: FunctionId,
651651
/// The `core::panic_with_felt252` function.
652652
panic_with_felt252: FunctionId,
653653
/// The `core::panic_with_const_felt252` function.
@@ -669,8 +669,9 @@ impl ConstFoldingLibfuncInfo {
669669
let array_get = array_module.extern_function_id("array_get");
670670
let starknet_module = core.submodule("starknet");
671671
let storage_access_module = starknet_module.submodule("storage_access");
672-
let storage_base_address_from_felt252 =
673-
storage_access_module.extern_function_id("storage_base_address_from_felt252");
672+
let storage_base_address_from_felt252 = storage_access_module
673+
.function_id("storage_base_address_from_felt252", vec![])
674+
.lowered(db);
674675
let nz_fns = OrderedHashSet::<_>::from_iter(chain!(
675676
[
676677
core.extern_function_id("felt252_is_zero"),

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

+61-50
Original file line numberDiff line numberDiff line change
@@ -820,10 +820,7 @@ erc20_transfer
820820

821821
//! > expected_profiling_info
822822
Weight by sierra statement:
823-
statement 331: 10 (storage_base_address_from_felt252([0], [31]) -> ([32], [33]))
824-
statement 427: 10 (storage_base_address_from_felt252([95], [116]) -> ([117], [118]))
825-
statement 462: 10 (storage_base_address_from_felt252([117], [148]) -> ([149], [150]))
826-
statement 558: 10 (storage_base_address_from_felt252([212], [233]) -> ([234], [235]))
823+
statement 933: 40 (storage_base_address_from_felt252([0], [1]) -> ([2], [3]))
827824
statement 599: 9 (emit_event_syscall([255], [251], [268], [269]) { fallthrough([270], [271]) 612([272], [273], [274]) })
828825
statement 437: 8 (storage_write_syscall([108], [59], [123], [121], [119]) { fallthrough([124], [125]) 782([126], [127], [128]) })
829826
statement 447: 8 (storage_write_syscall([129], [125], [122], [132], [130]) { fallthrough([133], [134]) 766([135], [136], [137]) })
@@ -837,6 +834,9 @@ Weight by sierra statement:
837834
statement 124: 6 (withdraw_gas_all([39], [51], [52]) { fallthrough([53], [54]) 194([55], [56]) })
838835
statement 129: 5 (get_execution_info_v2_syscall([57], [3]) { fallthrough([58], [59], [60]) 179([61], [62], [63]) })
839836
statement 588: 5 (store_temp<test::erc_20::Event>([261]) -> ([261]))
837+
statement 934: 4 (store_temp<RangeCheck>([2]) -> ([2]))
838+
statement 935: 4 (store_temp<StorageBaseAddress>([3]) -> ([3]))
839+
statement 936: 4 (return([2], [3]))
840840
statement 43: 3 (store_temp<core::panics::PanicResult::<((),)>>([33]) -> ([33]))
841841
statement 57: 3 (withdraw_gas([1], [2]) { fallthrough([5], [6]) 262([7], [8]) })
842842
statement 102: 3 (array_snapshot_pop_front<felt252>([33]) { fallthrough([45], [46]) 118([47]) })
@@ -868,8 +868,8 @@ Weight by sierra statement:
868868
statement 556: 2 (pedersen([147], [231], [227]) -> ([232], [233]))
869869
statement 589: 2 (store_temp<Array<felt252>>([256]) -> ([256]))
870870
statement 590: 2 (store_temp<Array<felt252>>([257]) -> ([257]))
871-
statement 966: 2 (store_temp<Array<felt252>>([6]) -> ([6]))
872-
statement 967: 2 (store_temp<Array<felt252>>([34]) -> ([34]))
871+
statement 970: 2 (store_temp<Array<felt252>>([6]) -> ([6]))
872+
statement 971: 2 (store_temp<Array<felt252>>([34]) -> ([34]))
873873
statement 6: 1 (store_temp<Tuple<felt252>>([8]) -> ([8]))
874874
statement 7: 1 (into_box<Tuple<felt252>>([8]) -> ([9]))
875875
statement 11: 1 (cheatcode<10052436086942832998170947883001859293934451>([11]) -> ([12]))
@@ -929,11 +929,12 @@ Weight by sierra statement:
929929
statement 301: 1 (store_temp<GasBuiltin>([14]) -> ([14]))
930930
statement 302: 1 (felt252_is_zero([16]) { fallthrough() 317([17]) })
931931
statement 328: 1 (store_temp<felt252>([29]) -> ([29]))
932-
statement 330: 1 (store_temp<felt252>([31]) -> ([31]))
933-
statement 341: 1 (store_temp<GasBuiltin>([21]) -> ([21]))
934-
statement 342: 1 (store_temp<u32>([42]) -> ([42]))
935-
statement 343: 1 (store_temp<Pedersen>([30]) -> ([30]))
936-
statement 344: 1 (store_temp<RangeCheck>([32]) -> ([32]))
932+
statement 330: 1 (store_temp<RangeCheck>([0]) -> ([0]))
933+
statement 331: 1 (store_temp<felt252>([31]) -> ([31]))
934+
statement 332: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([0], [31]) -> ([32], [33]))
935+
statement 342: 1 (store_temp<GasBuiltin>([21]) -> ([21]))
936+
statement 343: 1 (store_temp<u32>([42]) -> ([42]))
937+
statement 344: 1 (store_temp<Pedersen>([30]) -> ([30]))
937938
statement 347: 1 (store_temp<GasBuiltin>([43]) -> ([43]))
938939
statement 349: 1 (store_temp<felt252>([45]) -> ([45]))
939940
statement 350: 1 (store_temp<System>([44]) -> ([44]))
@@ -961,22 +962,24 @@ Weight by sierra statement:
961962
statement 401: 1 (jump() { 414() })
962963
statement 414: 1 (enum_match<core::bool>([86]) { fallthrough([106]) 801([107]) })
963964
statement 424: 1 (store_temp<felt252>([114]) -> ([114]))
964-
statement 426: 1 (store_temp<felt252>([116]) -> ([116]))
965-
statement 433: 1 (store_temp<GasBuiltin>([108]) -> ([108]))
966-
statement 434: 1 (store_temp<u32>([123]) -> ([123]))
967-
statement 435: 1 (store_temp<Pedersen>([115]) -> ([115]))
968-
statement 436: 1 (store_temp<RangeCheck>([117]) -> ([117]))
965+
statement 426: 1 (store_temp<RangeCheck>([95]) -> ([95]))
966+
statement 427: 1 (store_temp<felt252>([116]) -> ([116]))
967+
statement 428: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([95], [116]) -> ([117], [118]))
968+
statement 434: 1 (store_temp<GasBuiltin>([108]) -> ([108]))
969+
statement 435: 1 (store_temp<u32>([123]) -> ([123]))
970+
statement 436: 1 (store_temp<Pedersen>([115]) -> ([115]))
969971
statement 439: 1 (store_temp<GasBuiltin>([124]) -> ([124]))
970972
statement 444: 1 (store_temp<GasBuiltin>([129]) -> ([129]))
971973
statement 445: 1 (store_temp<u32>([122]) -> ([122]))
972974
statement 446: 1 (store_temp<StorageAddress>([132]) -> ([132]))
973975
statement 449: 1 (store_temp<GasBuiltin>([133]) -> ([133]))
974976
statement 459: 1 (store_temp<felt252>([146]) -> ([146]))
975-
statement 461: 1 (store_temp<felt252>([148]) -> ([148]))
976-
statement 472: 1 (store_temp<GasBuiltin>([138]) -> ([138]))
977-
statement 473: 1 (store_temp<u32>([159]) -> ([159]))
978-
statement 474: 1 (store_temp<Pedersen>([147]) -> ([147]))
979-
statement 475: 1 (store_temp<RangeCheck>([149]) -> ([149]))
977+
statement 461: 1 (store_temp<RangeCheck>([117]) -> ([117]))
978+
statement 462: 1 (store_temp<felt252>([148]) -> ([148]))
979+
statement 463: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([117], [148]) -> ([149], [150]))
980+
statement 473: 1 (store_temp<GasBuiltin>([138]) -> ([138]))
981+
statement 474: 1 (store_temp<u32>([159]) -> ([159]))
982+
statement 475: 1 (store_temp<Pedersen>([147]) -> ([147]))
980983
statement 478: 1 (store_temp<GasBuiltin>([160]) -> ([160]))
981984
statement 480: 1 (store_temp<felt252>([162]) -> ([162]))
982985
statement 481: 1 (store_temp<System>([161]) -> ([161]))
@@ -1004,11 +1007,12 @@ Weight by sierra statement:
10041007
statement 532: 1 (jump() { 545() })
10051008
statement 545: 1 (enum_match<core::bool>([203]) { fallthrough([223]) 660([224]) })
10061009
statement 555: 1 (store_temp<felt252>([231]) -> ([231]))
1007-
statement 557: 1 (store_temp<felt252>([233]) -> ([233]))
1008-
statement 564: 1 (store_temp<GasBuiltin>([225]) -> ([225]))
1009-
statement 565: 1 (store_temp<u32>([240]) -> ([240]))
1010-
statement 566: 1 (store_temp<Pedersen>([232]) -> ([232]))
1011-
statement 567: 1 (store_temp<RangeCheck>([234]) -> ([234]))
1010+
statement 557: 1 (store_temp<RangeCheck>([212]) -> ([212]))
1011+
statement 558: 1 (store_temp<felt252>([233]) -> ([233]))
1012+
statement 559: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([212], [233]) -> ([234], [235]))
1013+
statement 565: 1 (store_temp<GasBuiltin>([225]) -> ([225]))
1014+
statement 566: 1 (store_temp<u32>([240]) -> ([240]))
1015+
statement 567: 1 (store_temp<Pedersen>([232]) -> ([232]))
10121016
statement 570: 1 (store_temp<GasBuiltin>([241]) -> ([241]))
10131017
statement 575: 1 (store_temp<GasBuiltin>([246]) -> ([246]))
10141018
statement 576: 1 (store_temp<u32>([239]) -> ([239]))
@@ -1024,20 +1028,20 @@ Weight by sierra statement:
10241028
statement 608: 1 (store_temp<Pedersen>([232]) -> ([232]))
10251029
statement 609: 1 (store_temp<System>([271]) -> ([271]))
10261030
statement 611: 1 (return([234], [275], [232], [271], [278]))
1027-
statement 933: 1 (enum_match<test::erc_20::Event>([0]) { fallthrough([3]) 969([4]) })
1028-
statement 936: 1 (store_temp<felt252>([5]) -> ([5]))
1029-
statement 937: 1 (array_append<felt252>([1], [5]) -> ([6]))
1030-
statement 944: 1 (array_append<felt252>([2], [12]) -> ([13]))
1031-
statement 951: 1 (array_append<felt252>([13], [19]) -> ([20]))
1032-
statement 960: 1 (array_append<felt252>([20], [28]) -> ([29]))
1033-
statement 965: 1 (array_append<felt252>([29], [33]) -> ([34]))
1034-
statement 968: 1 (return([6], [34]))
1031+
statement 937: 1 (enum_match<test::erc_20::Event>([0]) { fallthrough([3]) 973([4]) })
1032+
statement 940: 1 (store_temp<felt252>([5]) -> ([5]))
1033+
statement 941: 1 (array_append<felt252>([1], [5]) -> ([6]))
1034+
statement 948: 1 (array_append<felt252>([2], [12]) -> ([13]))
1035+
statement 955: 1 (array_append<felt252>([13], [19]) -> ([20]))
1036+
statement 964: 1 (array_append<felt252>([20], [28]) -> ([29]))
1037+
statement 969: 1 (array_append<felt252>([29], [33]) -> ([34]))
1038+
statement 972: 1 (return([6], [34]))
10351039
Weight by concrete libfunc:
10361040
libfunc store_temp<GasBuiltin>: 44
10371041
libfunc storage_base_address_from_felt252: 40
10381042
libfunc storage_write_syscall: 32
10391043
libfunc storage_read_syscall: 28
1040-
libfunc store_temp<RangeCheck>: 20
1044+
libfunc store_temp<RangeCheck>: 24
10411045
libfunc store_temp<felt252>: 19
10421046
libfunc u128s_from_felt252: 12
10431047
libfunc array_snapshot_pop_front<felt252>: 9
@@ -1058,8 +1062,10 @@ Weight by concrete libfunc:
10581062
libfunc store_temp<test::erc_20::Event>: 5
10591063
libfunc array_new<felt252>: 4
10601064
libfunc branch_align: 4
1065+
libfunc function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>: 4
10611066
libfunc jump: 4
10621067
libfunc store_temp<StorageAddress>: 4
1068+
libfunc store_temp<StorageBaseAddress>: 4
10631069
libfunc store_temp<core::array::Span::<core::felt252>>: 4
10641070
libfunc store_temp<core::panics::PanicResult::<((),)>>: 3
10651071
libfunc store_temp<core::panics::PanicResult::<(core::array::Span::<core::felt252>,)>>: 3
@@ -1082,9 +1088,9 @@ Weight by concrete libfunc:
10821088
libfunc store_temp<Box<core::starknet::info::v2::ExecutionInfo>>: 1
10831089
libfunc store_temp<BuiltinCosts>: 1
10841090
libfunc store_temp<Tuple<felt252>>: 1
1085-
return: 4
1091+
return: 8
10861092
Weight by generic libfunc:
1087-
libfunc store_temp: 160
1093+
libfunc store_temp: 168
10881094
libfunc storage_base_address_from_felt252: 40
10891095
libfunc storage_write_syscall: 32
10901096
libfunc storage_read_syscall: 28
@@ -1094,6 +1100,7 @@ Weight by generic libfunc:
10941100
libfunc array_append: 8
10951101
libfunc pedersen: 8
10961102
libfunc contract_address_try_from_felt252: 7
1103+
libfunc function_call: 7
10971104
libfunc u128_overflowing_add: 6
10981105
libfunc u128_overflowing_sub: 6
10991106
libfunc withdraw_gas_all: 6
@@ -1102,37 +1109,39 @@ Weight by generic libfunc:
11021109
libfunc array_new: 4
11031110
libfunc branch_align: 4
11041111
libfunc jump: 4
1105-
libfunc function_call: 3
11061112
libfunc withdraw_gas: 3
11071113
libfunc felt252_is_zero: 2
11081114
libfunc get_builtin_costs: 2
11091115
libfunc cheatcode: 1
11101116
libfunc into_box: 1
1111-
return: 4
1117+
return: 8
11121118
Weight by user function (inc. generated):
1113-
function test::erc_20::StorageImpl::transfer_helper: 248
1119+
function test::erc_20::StorageImpl::transfer_helper: 212
11141120
function test::erc_20::__wrapper__IERC20Impl__transfer: 81
1121+
function core::starknet::storage_access::storage_base_address_from_felt252: 52
11151122
function test::erc20_transfer: 28
11161123
function test::erc_20::EventIsEvent::append_keys_and_data: 12
11171124
Weight by original user function (exc. generated):
1118-
function test::erc_20::StorageImpl::transfer_helper: 248
1125+
function test::erc_20::StorageImpl::transfer_helper: 212
11191126
function test::erc_20::__wrapper__IERC20Impl__transfer: 81
1127+
function core::starknet::storage_access::storage_base_address_from_felt252: 52
11201128
function test::erc20_transfer: 28
11211129
function test::erc_20::EventIsEvent::append_keys_and_data: 12
11221130
Weight by Cairo function:
1123-
function core::starknet::storage::StoragePathImpl::finalize: 44
1131+
function core::starknet::storage_access::storage_base_address_from_felt252: 52
11241132
function core::integer::u128_try_from_felt252: 32
11251133
function contract::ContractStateEventEmitter::emit: 29
1126-
function core::starknet::storage_access::StoreFelt252::write: 26
1127-
function core::starknet::storage_access::StoreFelt252::read: 24
11281134
function core::starknet::storage_access::StoreFelt252::read_at_offset: 24
1135+
function core::starknet::storage_access::StoreFelt252::write: 24
11291136
function core::starknet::storage_access::StoreFelt252::write_at_offset: 24
11301137
function contract::__wrapper__IERC20Impl__transfer: 22
1138+
function core::starknet::storage_access::StoreFelt252::read: 22
11311139
function core::integer::u256_overflowing_add: 19
11321140
function core::integer::u256_overflowing_sub: 19
11331141
function core::array::ArrayImpl::append: 17
11341142
function lib.cairo::erc20_transfer: 16
11351143
function core::pedersen::HashStateImpl::update: 12
1144+
function core::starknet::storage::StoragePathImpl::finalize: 12
11361145
function core::starknet::contract_address::ContractAddressSerde::deserialize: 11
11371146
function lib.cairo::erc_20::IERC20Impl::transfer: 9
11381147
function core::array::SpanImpl::pop_front: 8
@@ -1148,12 +1157,14 @@ Weight by Cairo function:
11481157
function core::integer::u256_checked_sub: 1
11491158
function starknet_derive::EventIsEvent::append_keys_and_data: 1
11501159
Weight by Sierra stack trace:
1151-
test::erc20_transfer: 369
1152-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 341
1153-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 260
1160+
test::erc20_transfer: 385
1161+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 357
1162+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 276
1163+
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
11541164
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> test::erc_20::EventIsEvent::append_keys_and_data: 12
11551165
Weight by Cairo stack trace:
1156-
test::erc20_transfer: 369
1157-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 341
1158-
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 260
1166+
test::erc20_transfer: 385
1167+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 357
1168+
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 276
1169+
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
11591170
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> test::erc_20::EventIsEvent::append_keys_and_data: 12

crates/cairo-lang-starknet-classes/src/casm_contract_class_test.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ fn test_contract_libfuncs_coverage(name: &str) {
100100

101101
/// Tests that compiled_class_hash() returns the correct hash, by comparing it to hard-coded
102102
/// constant that was computed by other implementations.
103-
#[test_case("account__account", "66856a0972716664cfeb5014960b9b7cac5fb450272b9e6e2b6d26c9615a9d9")]
103+
#[test_case("account__account", "30c095e5747d94d32038f621c4576980728c2e6ba90eb9bf3690650e954338f")]
104104
fn test_compiled_class_hash(name: &str, expected_hash: &str) {
105105
let compiled_json_path =
106106
get_example_file_path(format!("{name}.compiled_contract_class.json").as_str());

0 commit comments

Comments
 (0)