Skip to content

Commit bf66a0e

Browse files
committed
Enabled moving and droping array fns.
commit-id:792add5c
1 parent 45ede10 commit bf66a0e

File tree

50 files changed

+19015
-19271
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+19015
-19271
lines changed

crates/cairo-lang-lowering/src/db.rs

+13-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use std::sync::Arc;
22

33
use cairo_lang_debug::DebugWithDb;
44
use cairo_lang_defs as defs;
5-
use cairo_lang_defs::ids::{LanguageElementId, ModuleId, ModuleItemId, NamedLanguageElementLongId};
5+
use cairo_lang_defs::ids::{
6+
ExternFunctionId, LanguageElementId, ModuleId, ModuleItemId, NamedLanguageElementLongId,
7+
};
68
use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe};
79
use cairo_lang_filesystem::ids::FileId;
810
use cairo_lang_semantic::db::SemanticGroup;
@@ -14,7 +16,7 @@ use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;
1416
use cairo_lang_utils::unordered_hash_set::UnorderedHashSet;
1517
use cairo_lang_utils::{Intern, LookupIntern, Upcast};
1618
use defs::ids::NamedLanguageElementId;
17-
use itertools::Itertools;
19+
use itertools::{Itertools, chain};
1820
use num_traits::ToPrimitive;
1921

2022
use crate::add_withdraw_gas::add_withdraw_gas;
@@ -332,7 +334,7 @@ pub trait LoweringGroup: SemanticGroup + Upcast<dyn SemanticGroup> {
332334

333335
/// Internal query for reorder_statements to cache the function ids that can be moved.
334336
#[salsa::invoke(crate::optimizations::config::priv_movable_function_ids)]
335-
fn priv_movable_function_ids(&self) -> Arc<UnorderedHashSet<ids::FunctionId>>;
337+
fn priv_movable_function_ids(&self) -> Arc<UnorderedHashSet<ExternFunctionId>>;
336338

337339
/// Internal query for the libfuncs information required for const folding.
338340
#[salsa::invoke(crate::optimizations::const_folding::priv_const_folding_info)]
@@ -366,13 +368,15 @@ pub fn init_lowering_group(
366368
db: &mut (dyn LoweringGroup + 'static),
367369
inlining_strategy: InliningStrategy,
368370
) {
369-
let mut moveable_functions: Vec<String> =
370-
["bool_not_impl", "felt252_add", "felt252_sub", "felt252_mul", "felt252_div"]
371-
.into_iter()
372-
.map(|s| s.to_string())
373-
.collect();
371+
let mut moveable_functions: Vec<String> = chain!(
372+
["bool_not_impl"],
373+
["felt252_add", "felt252_sub", "felt252_mul", "felt252_div"],
374+
["array::array_new", "array::array_append"],
375+
)
376+
.map(|s| s.to_string())
377+
.collect();
374378

375-
for ty in ["i8", "i16", "i32", "i64", "u8", "u16", "u32", "u64", "u128"] {
379+
for ty in ["i8", "i16", "i32", "i64", "u8", "u16", "u32", "u64"] {
376380
moveable_functions.push(format!("integer::{}_wide_mul", ty));
377381
}
378382

crates/cairo-lang-lowering/src/lower/test_data/closure

+9-9
Original file line numberDiff line numberDiff line change
@@ -143,18 +143,18 @@ Final lowering:
143143
Parameters: v0: test::PanicDestructable
144144
blk0 (root):
145145
Statements:
146-
(v1: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
147-
(v2: core::felt252) <- 1997209042069643135709344952807065910992472029923670688473712229447419591075
148-
(v3: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v1, v2)
149-
(v4: core::felt252) <- 0
146+
(v1: core::panics::Panic) <- struct_construct()
147+
(v2: core::panics::Panic) <- test::MyPanicDestruct::panic_destruct(v0, v1)
148+
(v3: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
149+
(v4: core::felt252) <- 1997209042069643135709344952807065910992472029923670688473712229447419591075
150150
(v5: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v3, v4)
151-
(v6: core::felt252) <- 345232009571
151+
(v6: core::felt252) <- 0
152152
(v7: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v5, v6)
153-
(v8: core::felt252) <- 5
153+
(v8: core::felt252) <- 345232009571
154154
(v9: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v7, v8)
155-
(v10: core::panics::Panic) <- struct_construct()
156-
(v11: core::panics::Panic) <- test::MyPanicDestruct::panic_destruct(v0, v10)
157-
(v12: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v11, v9)
155+
(v10: core::felt252) <- 5
156+
(v11: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v9, v10)
157+
(v12: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v2, v11)
158158
(v13: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v12)
159159
End:
160160
Return(v13)

crates/cairo-lang-lowering/src/lower/test_data/for

+14-14
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,22 @@ Final lowering:
5454
Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin
5555
blk0 (root):
5656
Statements:
57-
(v2: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
58-
(v3: core::felt252) <- 10
59-
(v4: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v2, v3)
60-
(v5: core::felt252) <- 11
61-
(v6: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v4, v5)
62-
(v7: core::felt252) <- 12
63-
(v8: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v6, v7)
64-
(v9: core::felt252) <- 13
65-
(v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
66-
(v11: core::felt252) <- 1
67-
(v12: core::felt252) <- 1
68-
(v13: core::felt252) <- core::felt252_add(v11, v12)
69-
(v14: core::array::Array::<core::felt252>, v15: @core::array::Array::<core::felt252>) <- snapshot(v10)
57+
(v2: core::felt252) <- 1
58+
(v3: core::felt252) <- 1
59+
(v4: core::felt252) <- core::felt252_add(v2, v3)
60+
(v5: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
61+
(v6: core::felt252) <- 10
62+
(v7: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v5, v6)
63+
(v8: core::felt252) <- 11
64+
(v9: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v7, v8)
65+
(v10: core::felt252) <- 12
66+
(v11: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v9, v10)
67+
(v12: core::felt252) <- 13
68+
(v13: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v11, v12)
69+
(v14: core::array::Array::<core::felt252>, v15: @core::array::Array::<core::felt252>) <- snapshot(v13)
7070
(v16: core::array::Span::<core::felt252>) <- struct_construct(v15)
7171
(v17: core::array::SpanIter::<core::felt252>) <- struct_construct(v16)
72-
(v18: core::RangeCheck, v19: core::gas::GasBuiltin, v20: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- test::foo[118-164](v0, v1, v17, v11, v13)
72+
(v18: core::RangeCheck, v19: core::gas::GasBuiltin, v20: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- test::foo[118-164](v0, v1, v17, v2, v4)
7373
End:
7474
Match(match_enum(v20) {
7575
PanicResult::Ok(v21) => blk1,

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

+8-16
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
use std::sync::Arc;
22

3-
use cairo_lang_semantic::corelib;
4-
use cairo_lang_semantic::db::SemanticGroup;
5-
use cairo_lang_utils::Intern;
3+
use cairo_lang_defs::ids::ExternFunctionId;
4+
use cairo_lang_semantic::helper::ModuleHelper;
65
use cairo_lang_utils::unordered_hash_set::UnorderedHashSet;
76

87
use crate::db::LoweringGroup;
9-
use crate::ids::{FunctionId, FunctionLongId};
108
use crate::utils::InliningStrategy;
119

1210
/// A configuration struct that controls the behavior of the optimization passes.
@@ -52,29 +50,23 @@ impl Default for OptimizationConfig {
5250
}
5351
}
5452

55-
pub fn priv_movable_function_ids(db: &dyn LoweringGroup) -> Arc<UnorderedHashSet<FunctionId>> {
56-
let semantic_db: &dyn SemanticGroup = db.elongate();
53+
pub fn priv_movable_function_ids(
54+
db: &dyn LoweringGroup,
55+
) -> Arc<UnorderedHashSet<ExternFunctionId>> {
5756
let libfunc_by_name = |name: &String| {
5857
let mut path_iter = name.split("::");
5958

60-
let mut module = db.core_module();
59+
let mut module = ModuleHelper::core(db);
6160

6261
let mut next = path_iter.next();
6362
while let Some(path_item) = next {
6463
next = path_iter.next();
6564
if next.is_some() {
66-
module = corelib::get_submodule(semantic_db, module, path_item)
67-
.unwrap_or_else(|| panic!("module not found: {}", path_item));
65+
module = module.submodule(path_item);
6866
continue;
6967
}
7068

71-
return FunctionLongId::Semantic(corelib::get_function_id(
72-
semantic_db,
73-
module,
74-
path_item.into(),
75-
vec![],
76-
))
77-
.intern(db);
69+
return module.extern_function_id(path_item);
7870
}
7971

8072
panic!("Got empty string as movable_function");

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

+6
Original file line numberDiff line numberDiff line change
@@ -772,12 +772,16 @@ pub struct ConstFoldingLibfuncInfo {
772772
array_get: ExternFunctionId,
773773
/// The `array_snapshot_pop_front` libfunc.
774774
array_snapshot_pop_front: ExternFunctionId,
775+
/// The `array_snapshot_pop_back` libfunc.
776+
array_snapshot_pop_back: ExternFunctionId,
775777
/// The `array_len` libfunc.
776778
array_len: ExternFunctionId,
777779
/// The `array_new` libfunc.
778780
array_new: ExternFunctionId,
779781
/// The `array_append` libfunc.
780782
array_append: ExternFunctionId,
783+
/// The `array_pop_front` libfunc.
784+
array_pop_front: ExternFunctionId,
781785
/// The `storage_base_address_from_felt252` libfunc.
782786
storage_base_address_from_felt252: ExternFunctionId,
783787
/// The `storage_base_address_const` libfunc.
@@ -887,9 +891,11 @@ impl ConstFoldingLibfuncInfo {
887891
bounded_int_constrain: bounded_int_module.extern_function_id("bounded_int_constrain"),
888892
array_get: array_module.extern_function_id("array_get"),
889893
array_snapshot_pop_front: array_module.extern_function_id("array_snapshot_pop_front"),
894+
array_snapshot_pop_back: array_module.extern_function_id("array_snapshot_pop_back"),
890895
array_len: array_module.extern_function_id("array_len"),
891896
array_new: array_module.extern_function_id("array_new"),
892897
array_append: array_module.extern_function_id("array_append"),
898+
array_pop_front: array_module.extern_function_id("array_pop_front"),
893899
storage_base_address_from_felt252: storage_access_module
894900
.extern_function_id("storage_base_address_from_felt252"),
895901
storage_base_address_const: storage_access_module

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

+9-3
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ mod test;
44

55
use std::cmp::Reverse;
66

7+
use cairo_lang_defs::ids::ExternFunctionId;
78
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
89
use cairo_lang_utils::unordered_hash_map::{Entry, UnorderedHashMap};
910
use cairo_lang_utils::unordered_hash_set::UnorderedHashSet;
1011
use itertools::{Itertools, zip_eq};
1112

1213
use crate::borrow_check::analysis::{Analyzer, BackAnalysis, StatementLocation};
1314
use crate::db::LoweringGroup;
14-
use crate::ids::FunctionId;
1515
use crate::{
1616
BlockId, FlatLowered, MatchInfo, Statement, StatementCall, VarRemapping, VarUsage, VariableId,
1717
};
@@ -27,6 +27,7 @@ pub fn reorder_statements(db: &dyn LoweringGroup, lowered: &mut FlatLowered) {
2727
return;
2828
}
2929
let ctx = ReorderStatementsContext {
30+
db,
3031
lowered: &*lowered,
3132
moveable_functions: &db.priv_movable_function_ids(),
3233
statement_to_move: vec![],
@@ -74,14 +75,19 @@ pub struct ReorderStatementsInfo {
7475
}
7576

7677
pub struct ReorderStatementsContext<'a> {
78+
db: &'a dyn LoweringGroup,
7779
lowered: &'a FlatLowered,
7880
// A list of function that can be moved.
79-
moveable_functions: &'a UnorderedHashSet<FunctionId>,
81+
moveable_functions: &'a UnorderedHashSet<ExternFunctionId>,
8082
statement_to_move: Vec<(StatementLocation, Option<StatementLocation>)>,
8183
}
8284
impl ReorderStatementsContext<'_> {
8385
fn call_can_be_moved(&mut self, stmt: &StatementCall) -> bool {
84-
self.moveable_functions.contains(&stmt.function)
86+
if let Some((extern_id, _)) = stmt.function.get_extern(self.db) {
87+
self.moveable_functions.contains(&extern_id)
88+
} else {
89+
false
90+
}
8591
}
8692
}
8793
impl Analyzer<'_> for ReorderStatementsContext<'_> {

crates/cairo-lang-lowering/src/test_data/strings

+19-19
Original file line numberDiff line numberDiff line change
@@ -193,34 +193,34 @@ Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin
193193
blk0 (root):
194194
Statements:
195195
(v2: core::array::Array::<core::bytes_31::bytes31>) <- core::array::array_new::<core::bytes_31::bytes31>()
196-
(v3: core::array::Array::<core::bytes_31::bytes31>) <- core::array::array_new::<core::bytes_31::bytes31>()
197-
(v4: core::array::Array::<core::bytes_31::bytes31>) <- core::array::array_new::<core::bytes_31::bytes31>()
198-
(v5: core::felt252) <- 448378203247
199-
(v6: core::integer::u32) <- 5
200-
(v7: core::byte_array::ByteArray) <- struct_construct(v2, v5, v6)
201-
(v8: core::byte_array::ByteArray, v9: @core::byte_array::ByteArray) <- snapshot(v7)
202-
(v10: @core::array::Array::<core::bytes_31::bytes31>, v11: @core::felt252, v12: @core::integer::u32) <- struct_destructure(v9)
203-
(v13: core::array::Span::<core::bytes_31::bytes31>) <- struct_construct(v10)
204-
(v14: core::RangeCheck, v15: core::gas::GasBuiltin, v16: core::panics::PanicResult::<(core::array::Span::<core::bytes_31::bytes31>, core::array::Array::<core::bytes_31::bytes31>, ())>) <- core::array::ArrayTCloneImpl::clone[120-295](v0, v1, v13, v4)
196+
(v3: core::felt252) <- 448378203247
197+
(v4: core::integer::u32) <- 5
198+
(v5: core::byte_array::ByteArray) <- struct_construct(v2, v3, v4)
199+
(v6: core::byte_array::ByteArray, v7: @core::byte_array::ByteArray) <- snapshot(v5)
200+
(v8: @core::array::Array::<core::bytes_31::bytes31>, v9: @core::felt252, v10: @core::integer::u32) <- struct_destructure(v7)
201+
(v11: core::array::Array::<core::bytes_31::bytes31>) <- core::array::array_new::<core::bytes_31::bytes31>()
202+
(v12: core::array::Span::<core::bytes_31::bytes31>) <- struct_construct(v8)
203+
(v13: core::RangeCheck, v14: core::gas::GasBuiltin, v15: core::panics::PanicResult::<(core::array::Span::<core::bytes_31::bytes31>, core::array::Array::<core::bytes_31::bytes31>, ())>) <- core::array::ArrayTCloneImpl::clone[120-295](v0, v1, v12, v11)
205204
End:
206-
Match(match_enum(v16) {
207-
PanicResult::Ok(v17) => blk1,
208-
PanicResult::Err(v18) => blk4,
205+
Match(match_enum(v15) {
206+
PanicResult::Ok(v16) => blk1,
207+
PanicResult::Err(v17) => blk4,
209208
})
210209

211210
blk1:
212211
Statements:
212+
(v18: core::array::Array::<core::bytes_31::bytes31>) <- core::array::array_new::<core::bytes_31::bytes31>()
213213
(v19: core::felt252) <- 35697342966884
214214
(v20: core::integer::u32) <- 6
215-
(v21: core::byte_array::ByteArray) <- struct_construct(v3, v19, v20)
215+
(v21: core::byte_array::ByteArray) <- struct_construct(v18, v19, v20)
216216
(v22: core::byte_array::ByteArray, v23: @core::byte_array::ByteArray) <- snapshot(v21)
217-
(v24: core::array::Span::<core::bytes_31::bytes31>, v25: core::array::Array::<core::bytes_31::bytes31>, v26: ()) <- struct_destructure(v17)
218-
(v27: @core::array::Array::<core::bytes_31::bytes31>, v28: @core::felt252, v29: @core::integer::u32) <- struct_destructure(v9)
217+
(v24: core::array::Span::<core::bytes_31::bytes31>, v25: core::array::Array::<core::bytes_31::bytes31>, v26: ()) <- struct_destructure(v16)
218+
(v27: @core::array::Array::<core::bytes_31::bytes31>, v28: @core::felt252, v29: @core::integer::u32) <- struct_destructure(v7)
219219
(v30: core::felt252) <- desnap(v28)
220-
(v31: @core::array::Array::<core::bytes_31::bytes31>, v32: @core::felt252, v33: @core::integer::u32) <- struct_destructure(v9)
220+
(v31: @core::array::Array::<core::bytes_31::bytes31>, v32: @core::felt252, v33: @core::integer::u32) <- struct_destructure(v7)
221221
(v34: core::integer::u32) <- desnap(v33)
222222
(v35: core::byte_array::ByteArray) <- struct_construct(v25, v30, v34)
223-
(v36: core::RangeCheck, v37: core::gas::GasBuiltin, v38: core::panics::PanicResult::<(core::byte_array::ByteArray, ())>) <- core::byte_array::ByteArrayImpl::append(v14, v15, v35, v23)
223+
(v36: core::RangeCheck, v37: core::gas::GasBuiltin, v38: core::panics::PanicResult::<(core::byte_array::ByteArray, ())>) <- core::byte_array::ByteArrayImpl::append(v13, v14, v35, v23)
224224
End:
225225
Match(match_enum(v38) {
226226
PanicResult::Ok(v39) => blk2,
@@ -244,6 +244,6 @@ End:
244244

245245
blk4:
246246
Statements:
247-
(v47: core::panics::PanicResult::<(core::byte_array::ByteArray,)>) <- PanicResult::Err(v18)
247+
(v47: core::panics::PanicResult::<(core::byte_array::ByteArray,)>) <- PanicResult::Err(v17)
248248
End:
249-
Return(v14, v15, v47)
249+
Return(v13, v14, v47)

0 commit comments

Comments
 (0)