Skip to content

Uninline storage_base_address_from_felt252 to reduce code size. #7679

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions corelib/src/starknet/storage_access.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,24 @@ impl StorageBaseAddressDrop of Drop<StorageBaseAddress>;
/// ```
pub extern fn storage_base_address_const<const address: felt252>() -> StorageBaseAddress nopanic;


mod internal {
/// Internal libfunc declaration, the wrapper function below is used to reduce code size.
pub extern fn storage_base_address_from_felt252(
addr: felt252,
) -> super::StorageBaseAddress implicits(super::RangeCheck) nopanic;
}


/// Returns a `StorageBaseAddress` given a `felt252` value.
///
/// Wraps around the value if it is not in the range `[0, 2**251 - 256)`.
pub extern fn storage_base_address_from_felt252(
addr: felt252,
) -> StorageBaseAddress implicits(RangeCheck) nopanic;
/// `inline(never)` is used to reduce code size.
#[inline(never)]
pub fn storage_base_address_from_felt252(addr: felt252) -> StorageBaseAddress nopanic {
internal::storage_base_address_from_felt252(addr)
}


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

Expand Down
28 changes: 15 additions & 13 deletions crates/cairo-lang-lowering/src/optimizations/const_folding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,15 @@ impl ConstFoldingContext<'_> {
.concretize(db, vec![GenericArgumentId::Constant(val.clone().intern(db))])
.lowered(db);
return None;
} else if stmt.function == self.storage_base_address_from_felt252 {
let input_var = stmt.inputs[0].var_id;
if let Some(ConstValue::Int(val, ty)) = self.as_const(input_var) {
stmt.inputs.clear();
let arg = GenericArgumentId::Constant(ConstValue::Int(val.clone(), *ty).intern(db));
stmt.function =
self.storage_base_address_const.concretize(db, vec![arg]).lowered(db);
}
return None;
}
let (id, _generic_args) = stmt.function.get_extern(db)?;
if id == self.felt_sub {
Expand Down Expand Up @@ -327,15 +336,6 @@ impl ConstFoldingContext<'_> {
self.var_info.insert(r_output, VarInfo::Const(r_value.clone()));
additional_consts.push(StatementConst { value: r_value, output: r_output });
Some(StatementConst { value: q_value, output: q_output })
} else if id == self.storage_base_address_from_felt252 {
let input_var = stmt.inputs[0].var_id;
if let Some(ConstValue::Int(val, ty)) = self.as_const(input_var) {
stmt.inputs.clear();
let arg = GenericArgumentId::Constant(ConstValue::Int(val.clone(), *ty).intern(db));
stmt.function =
self.storage_base_address_const.concretize(db, vec![arg]).lowered(db);
}
None
} else if id == self.into_box {
let const_value = match self.var_info.get(&stmt.inputs[0].var_id)? {
VarInfo::Const(val) => val,
Expand Down Expand Up @@ -662,10 +662,10 @@ pub struct ConstFoldingLibfuncInfo {
array_get: ExternFunctionId,
/// The `array_snapshot_pop_front` libfunc.
array_snapshot_pop_front: GenericFunctionId,
/// The `storage_base_address_from_felt252` libfunc.
storage_base_address_from_felt252: ExternFunctionId,
/// The `storage_base_address_const` libfunc.
storage_base_address_const: GenericFunctionId,
/// The `storage_base_address_from_felt252` function.
storage_base_address_from_felt252: FunctionId,
/// The `core::panic_with_felt252` function.
panic_with_felt252: FunctionId,
/// The `core::panic_with_const_felt252` function.
Expand All @@ -684,6 +684,9 @@ impl ConstFoldingLibfuncInfo {
let array_module = core.submodule("array");
let starknet_module = core.submodule("starknet");
let storage_access_module = starknet_module.submodule("storage_access");
let storage_base_address_from_felt252 = storage_access_module
.function_id("storage_base_address_from_felt252", vec![])
.lowered(db);
let nz_fns = OrderedHashSet::<_>::from_iter(chain!(
[
core.extern_function_id("felt252_is_zero"),
Expand Down Expand Up @@ -769,8 +772,7 @@ impl ConstFoldingLibfuncInfo {
bounded_int_constrain: bounded_int_module.extern_function_id("bounded_int_constrain"),
array_get: array_module.extern_function_id("array_get"),
array_snapshot_pop_front: array_module.generic_function_id("array_snapshot_pop_front"),
storage_base_address_from_felt252: storage_access_module
.extern_function_id("storage_base_address_from_felt252"),
storage_base_address_from_felt252,
storage_base_address_const: storage_access_module
.generic_function_id("storage_base_address_const"),
panic_with_felt252: core.function_id("panic_with_felt252", vec![]).lowered(db),
Expand Down
105 changes: 58 additions & 47 deletions crates/cairo-lang-runner/src/profiling_test_data/major_test_cases
Original file line number Diff line number Diff line change
Expand Up @@ -799,10 +799,7 @@ erc20_transfer

//! > expected_profiling_info
Weight by sierra statement:
statement 295: 10 (storage_base_address_from_felt252([0], [27]) -> ([28], [29]))
statement 379: 10 (storage_base_address_from_felt252([87], [106]) -> ([107], [108]))
statement 409: 10 (storage_base_address_from_felt252([107], [136]) -> ([137], [138]))
statement 494: 10 (storage_base_address_from_felt252([196], [215]) -> ([216], [217]))
statement 846: 40 (storage_base_address_from_felt252([0], [1]) -> ([2], [3]))
statement 530: 9 (emit_event_syscall([231], [232], [248], [249]) { fallthrough([250], [251]) 543([252], [253], [254]) })
statement 388: 8 (storage_write_syscall([88], [53], [113], [111], [109]) { fallthrough([114], [115]) 701([116], [117], [118]) })
statement 396: 8 (storage_write_syscall([114], [115], [112], [121], [119]) { fallthrough([122], [123]) 687([124], [125], [126]) })
Expand All @@ -816,6 +813,9 @@ Weight by sierra statement:
statement 100: 6 (withdraw_gas_all([33], [6], [43]) { fallthrough([44], [45]) 163([46], [47]) })
statement 103: 5 (get_execution_info_v2_syscall([45], [3]) { fallthrough([48], [49], [50]) 150([51], [52], [53]) })
statement 519: 5 (store_temp<test::erc_20::Event>([241]) -> ([241]))
statement 847: 4 (store_temp<RangeCheck>([2]) -> ([2]))
statement 848: 4 (store_temp<StorageBaseAddress>([3]) -> ([3]))
statement 849: 4 (return([2], [3]))
statement 37: 3 (store_temp<core::panics::PanicResult::<((),)>>([28]) -> ([28]))
statement 50: 3 (withdraw_gas([1], [2]) { fallthrough([5], [6]) 231([7], [8]) })
statement 81: 3 (array_snapshot_pop_front<felt252>([28]) { fallthrough([38], [39]) 96([40]) })
Expand Down Expand Up @@ -848,8 +848,8 @@ Weight by sierra statement:
statement 492: 2 (pedersen([135], [213], [209]) -> ([214], [215]))
statement 520: 2 (store_temp<Array<felt252>>([236]) -> ([236]))
statement 521: 2 (store_temp<Array<felt252>>([237]) -> ([237]))
statement 879: 2 (store_temp<Array<felt252>>([6]) -> ([6]))
statement 880: 2 (store_temp<Array<felt252>>([34]) -> ([34]))
statement 883: 2 (store_temp<Array<felt252>>([6]) -> ([6]))
statement 884: 2 (store_temp<Array<felt252>>([34]) -> ([34]))
statement 5: 1 (cheatcode<10052436086942832998170947883001859293934451>([6]) -> ([7]))
statement 7: 1 (array_new<felt252>() -> ([8]))
statement 9: 1 (store_temp<felt252>([9]) -> ([9]))
Expand Down Expand Up @@ -896,10 +896,11 @@ Weight by sierra statement:
statement 250: 1 (felt252_is_zero([9]) { fallthrough() 264([10]) })
statement 268: 1 (felt252_is_zero([14]) { fallthrough() 282([15]) })
statement 292: 1 (store_temp<felt252>([25]) -> ([25]))
statement 294: 1 (store_temp<felt252>([27]) -> ([27]))
statement 305: 1 (store_temp<u32>([38]) -> ([38]))
statement 306: 1 (store_temp<Pedersen>([26]) -> ([26]))
statement 307: 1 (store_temp<RangeCheck>([28]) -> ([28]))
statement 294: 1 (store_temp<RangeCheck>([0]) -> ([0]))
statement 295: 1 (store_temp<felt252>([27]) -> ([27]))
statement 296: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([0], [27]) -> ([28], [29]))
statement 306: 1 (store_temp<u32>([38]) -> ([38]))
statement 307: 1 (store_temp<Pedersen>([26]) -> ([26]))
statement 310: 1 (store_temp<felt252>([41]) -> ([41]))
statement 311: 1 (store_temp<GasBuiltin>([39]) -> ([39]))
statement 312: 1 (store_temp<System>([40]) -> ([40]))
Expand All @@ -923,19 +924,21 @@ Weight by sierra statement:
statement 356: 1 (jump() { 367() })
statement 367: 1 (enum_match<core::bool>([78]) { fallthrough([97]) 718([98]) })
statement 376: 1 (store_temp<felt252>([104]) -> ([104]))
statement 378: 1 (store_temp<felt252>([106]) -> ([106]))
statement 385: 1 (store_temp<u32>([113]) -> ([113]))
statement 386: 1 (store_temp<Pedersen>([105]) -> ([105]))
statement 387: 1 (store_temp<RangeCheck>([107]) -> ([107]))
statement 378: 1 (store_temp<RangeCheck>([87]) -> ([87]))
statement 379: 1 (store_temp<felt252>([106]) -> ([106]))
statement 380: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([87], [106]) -> ([107], [108]))
statement 386: 1 (store_temp<u32>([113]) -> ([113]))
statement 387: 1 (store_temp<Pedersen>([105]) -> ([105]))
statement 393: 1 (store_temp<GasBuiltin>([114]) -> ([114]))
statement 394: 1 (store_temp<u32>([112]) -> ([112]))
statement 395: 1 (store_temp<StorageAddress>([121]) -> ([121]))
statement 406: 1 (store_temp<felt252>([134]) -> ([134]))
statement 408: 1 (store_temp<felt252>([136]) -> ([136]))
statement 419: 1 (store_temp<GasBuiltin>([122]) -> ([122]))
statement 420: 1 (store_temp<u32>([147]) -> ([147]))
statement 421: 1 (store_temp<Pedersen>([135]) -> ([135]))
statement 422: 1 (store_temp<RangeCheck>([137]) -> ([137]))
statement 408: 1 (store_temp<RangeCheck>([107]) -> ([107]))
statement 409: 1 (store_temp<felt252>([136]) -> ([136]))
statement 410: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([107], [136]) -> ([137], [138]))
statement 420: 1 (store_temp<GasBuiltin>([122]) -> ([122]))
statement 421: 1 (store_temp<u32>([147]) -> ([147]))
statement 422: 1 (store_temp<Pedersen>([135]) -> ([135]))
statement 425: 1 (store_temp<felt252>([150]) -> ([150]))
statement 426: 1 (store_temp<GasBuiltin>([148]) -> ([148]))
statement 427: 1 (store_temp<System>([149]) -> ([149]))
Expand All @@ -959,10 +962,11 @@ Weight by sierra statement:
statement 471: 1 (jump() { 482() })
statement 482: 1 (enum_match<core::bool>([187]) { fallthrough([206]) 585([207]) })
statement 491: 1 (store_temp<felt252>([213]) -> ([213]))
statement 493: 1 (store_temp<felt252>([215]) -> ([215]))
statement 500: 1 (store_temp<u32>([222]) -> ([222]))
statement 501: 1 (store_temp<Pedersen>([214]) -> ([214]))
statement 502: 1 (store_temp<RangeCheck>([216]) -> ([216]))
statement 493: 1 (store_temp<RangeCheck>([196]) -> ([196]))
statement 494: 1 (store_temp<felt252>([215]) -> ([215]))
statement 495: 1 (function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>([196], [215]) -> ([216], [217]))
statement 501: 1 (store_temp<u32>([222]) -> ([222]))
statement 502: 1 (store_temp<Pedersen>([214]) -> ([214]))
statement 508: 1 (store_temp<GasBuiltin>([223]) -> ([223]))
statement 509: 1 (store_temp<u32>([221]) -> ([221]))
statement 510: 1 (store_temp<StorageAddress>([230]) -> ([230]))
Expand All @@ -976,19 +980,19 @@ Weight by sierra statement:
statement 539: 1 (store_temp<Pedersen>([214]) -> ([214]))
statement 540: 1 (store_temp<System>([251]) -> ([251]))
statement 542: 1 (return([216], [255], [214], [251], [258]))
statement 846: 1 (enum_match<test::erc_20::Event>([0]) { fallthrough([3]) 882([4]) })
statement 849: 1 (store_temp<felt252>([5]) -> ([5]))
statement 850: 1 (array_append<felt252>([1], [5]) -> ([6]))
statement 857: 1 (array_append<felt252>([2], [12]) -> ([13]))
statement 864: 1 (array_append<felt252>([13], [19]) -> ([20]))
statement 873: 1 (array_append<felt252>([20], [28]) -> ([29]))
statement 878: 1 (array_append<felt252>([29], [33]) -> ([34]))
statement 881: 1 (return([6], [34]))
statement 850: 1 (enum_match<test::erc_20::Event>([0]) { fallthrough([3]) 886([4]) })
statement 853: 1 (store_temp<felt252>([5]) -> ([5]))
statement 854: 1 (array_append<felt252>([1], [5]) -> ([6]))
statement 861: 1 (array_append<felt252>([2], [12]) -> ([13]))
statement 868: 1 (array_append<felt252>([13], [19]) -> ([20]))
statement 877: 1 (array_append<felt252>([20], [28]) -> ([29]))
statement 882: 1 (array_append<felt252>([29], [33]) -> ([34]))
statement 885: 1 (return([6], [34]))
Weight by concrete libfunc:
libfunc storage_base_address_from_felt252: 40
libfunc storage_write_syscall: 32
libfunc storage_read_syscall: 28
libfunc store_temp<RangeCheck>: 20
libfunc store_temp<RangeCheck>: 24
libfunc store_temp<felt252>: 19
libfunc store_temp<GasBuiltin>: 18
libfunc u128s_from_felt252: 12
Expand All @@ -1010,8 +1014,10 @@ Weight by concrete libfunc:
libfunc store_temp<test::erc_20::Event>: 5
libfunc array_new<felt252>: 4
libfunc branch_align: 4
libfunc function_call<user@core::starknet::storage_access::storage_base_address_from_felt252>: 4
libfunc jump: 4
libfunc store_temp<StorageAddress>: 4
libfunc store_temp<StorageBaseAddress>: 4
libfunc store_temp<core::array::Span::<core::felt252>>: 4
libfunc store_temp<core::panics::PanicResult::<((),)>>: 3
libfunc store_temp<core::panics::PanicResult::<(core::array::Span::<core::felt252>,)>>: 3
Expand All @@ -1033,9 +1039,9 @@ Weight by concrete libfunc:
libfunc function_call<user@test::erc_20::__wrapper__IERC20Impl__transfer>: 1
libfunc store_temp<Box<core::starknet::info::v2::ExecutionInfo>>: 1
libfunc store_temp<BuiltinCosts>: 1
return: 4
return: 8
Weight by generic libfunc:
libfunc store_temp: 133
libfunc store_temp: 141
libfunc storage_base_address_from_felt252: 40
libfunc storage_write_syscall: 32
libfunc storage_read_syscall: 28
Expand All @@ -1045,6 +1051,7 @@ Weight by generic libfunc:
libfunc array_append: 8
libfunc pedersen: 8
libfunc contract_address_try_from_felt252: 7
libfunc function_call: 7
libfunc u128_overflowing_add: 6
libfunc u128_overflowing_sub: 6
libfunc withdraw_gas_all: 6
Expand All @@ -1053,37 +1060,39 @@ Weight by generic libfunc:
libfunc array_new: 4
libfunc branch_align: 4
libfunc jump: 4
libfunc function_call: 3
libfunc withdraw_gas: 3
libfunc const_as_box: 2
libfunc felt252_is_zero: 2
libfunc get_builtin_costs: 2
libfunc cheatcode: 1
return: 4
return: 8
Weight by user function (inc. generated):
function test::erc_20::StorageImpl::transfer_helper: 232
function test::erc_20::StorageImpl::transfer_helper: 196
function test::erc_20::__wrapper__IERC20Impl__transfer: 71
function core::starknet::storage_access::storage_base_address_from_felt252: 52
function test::erc20_transfer: 28
function test::erc_20::EventIsEvent::append_keys_and_data: 12
Weight by original user function (exc. generated):
function test::erc_20::StorageImpl::transfer_helper: 232
function test::erc_20::StorageImpl::transfer_helper: 196
function test::erc_20::__wrapper__IERC20Impl__transfer: 71
function core::starknet::storage_access::storage_base_address_from_felt252: 52
function test::erc20_transfer: 28
function test::erc_20::EventIsEvent::append_keys_and_data: 12
Weight by Cairo function:
function core::starknet::storage::StoragePathImpl::finalize: 44
function core::starknet::storage_access::storage_base_address_from_felt252: 52
function core::integer::u128_try_from_felt252: 30
function contract::ContractStateEventEmitter::emit: 29
function core::starknet::storage_access::StoreFelt252::write: 22
function core::starknet::storage_access::StoreFelt252::write_at_offset: 22
function contract::__wrapper__IERC20Impl__transfer: 21
function core::starknet::storage_access::StoreFelt252::read: 21
function core::starknet::storage_access::StoreFelt252::read_at_offset: 20
function core::starknet::storage_access::StoreFelt252::write: 20
function core::starknet::storage_access::StoreFelt252::read: 19
function core::integer::u256_overflowing_add: 18
function core::integer::u256_overflowing_sub: 18
function core::array::ArrayImpl::append: 17
function lib.cairo::erc20_transfer: 16
function core::pedersen::HashStateImpl::update: 12
function core::starknet::storage::StoragePathImpl::finalize: 12
function core::starknet::contract_address::ContractAddressSerde::deserialize: 10
function lib.cairo::erc_20::IERC20Impl::transfer: 9
function core::array::SpanImpl::pop_front: 6
Expand All @@ -1099,12 +1108,14 @@ Weight by Cairo function:
function core::integer::u256_checked_sub: 1
function starknet_derive::EventIsEvent::append_keys_and_data: 1
Weight by Sierra stack trace:
test::erc20_transfer: 343
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 315
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 244
test::erc20_transfer: 359
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 331
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 260
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
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> test::erc_20::EventIsEvent::append_keys_and_data: 12
Weight by Cairo stack trace:
test::erc20_transfer: 343
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 315
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 244
test::erc20_transfer: 359
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer: 331
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper: 260
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
test::erc20_transfer -> test::erc_20::__wrapper__IERC20Impl__transfer -> test::erc_20::StorageImpl::transfer_helper -> test::erc_20::EventIsEvent::append_keys_and_data: 12
Loading