Skip to content

Commit 39449b8

Browse files
Enable function specialization.
1 parent c71e53c commit 39449b8

File tree

32 files changed

+1808
-1500
lines changed

32 files changed

+1808
-1500
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ foo
6868
Parameters:
6969
blk0 (root):
7070
Statements:
71-
(v0: core::integer::u32) <- 10
72-
(v1: (core::integer::u32,)) <- struct_construct(v0)
73-
(v2: core::panics::PanicResult::<(core::integer::u32,)>) <- PanicResult::Ok(v1)
71+
(v0: {[email protected]:2:13: 2:16}) <- struct_construct()
72+
(v1: {[email protected]:2:13: 2:16}, v2: @{[email protected]:2:13: 2:16}) <- snapshot(v0)
73+
(v3: core::panics::PanicResult::<(core::integer::u32,)>) <- "Generated `core::ops::function::Fn::call` for {[email protected]:2:13: 2:16}"{None, { 5: core::integer::u32 }, }(v2)
7474
End:
75-
Return(v2)
75+
Return(v3)
7676

7777
//! > ==========================================================================
7878

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

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe};
99
use cairo_lang_filesystem::ids::FileId;
1010
use cairo_lang_semantic::db::SemanticGroup;
1111
use cairo_lang_semantic::items::enm::SemanticEnumEx;
12-
use cairo_lang_semantic::{self as semantic, ConcreteTypeId, TypeId, TypeLongId, corelib};
12+
use cairo_lang_semantic::{
13+
self as semantic, ConcreteTypeId, TypeId, TypeLongId, corelib,
14+
};
1315
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
1416
use cairo_lang_utils::ordered_hash_set::OrderedHashSet;
1517
use cairo_lang_utils::unordered_hash_map::UnorderedHashMap;
@@ -475,23 +477,7 @@ fn priv_concrete_function_with_body_lowered_flat(
475477
db: &dyn LoweringGroup,
476478
function: ids::ConcreteFunctionWithBodyId,
477479
) -> Maybe<Arc<FlatLowered>> {
478-
let semantic_db = db;
479-
480-
let generic_function_id = function.function_with_body_id(db);
481-
db.function_with_body_lowering_diagnostics(generic_function_id)?.check_error_free()?;
482-
let mut lowered = (*db.function_with_body_lowering(generic_function_id)?).clone();
483-
concretize_lowered(db, &mut lowered, &function.substitution(semantic_db)?)?;
484-
Ok(Arc::new(lowered))
485-
}
486-
487-
// * Adds `withdraw_gas` calls.
488-
// * Adds panics.
489-
// * Adds destructor calls.
490-
fn concrete_function_with_body_postpanic_lowered(
491-
db: &dyn LoweringGroup,
492-
function: ids::ConcreteFunctionWithBodyId,
493-
) -> Maybe<Arc<FlatLowered>> {
494-
let mut lowered = if let ids::ConcreteFunctionWithBodyLongId::Specialized(specialized) =
480+
if let ids::ConcreteFunctionWithBodyLongId::Specialized(specialized) =
495481
function.lookup_intern(db)
496482
{
497483
let base = db.concrete_function_with_body_postpanic_lowered(specialized.base)?;
@@ -545,20 +531,35 @@ fn concrete_function_with_body_postpanic_lowered(
545531
statements: statement,
546532
end: FlatBlockEnd::Return(ret_usage, location),
547533
});
548-
FlatLowered {
534+
return Ok(Arc::new(FlatLowered {
549535
signature: function.signature(db)?,
550536
variables: variables.variables,
551537
blocks: block_builder.build().unwrap(),
552538
parameters,
553539
diagnostics: Default::default(),
554-
}
555-
} else {
556-
let mut lowered = (*db.priv_concrete_function_with_body_lowered_flat(function)?).clone();
557-
add_withdraw_gas(db, function, &mut lowered)?;
558-
lower_panics(db, function, &mut lowered)?;
559-
add_destructs(db, function, &mut lowered);
560-
lowered
540+
}));
561541
};
542+
543+
let semantic_db = db;
544+
545+
let generic_function_id = function.function_with_body_id(db);
546+
db.function_with_body_lowering_diagnostics(generic_function_id)?.check_error_free()?;
547+
let mut lowered = (*db.function_with_body_lowering(generic_function_id)?).clone();
548+
concretize_lowered(db, &mut lowered, &function.substitution(semantic_db)?)?;
549+
Ok(Arc::new(lowered))
550+
}
551+
552+
// * Adds `withdraw_gas` calls.
553+
// * Adds panics.
554+
// * Adds destructor calls.
555+
fn concrete_function_with_body_postpanic_lowered(
556+
db: &dyn LoweringGroup,
557+
function: ids::ConcreteFunctionWithBodyId,
558+
) -> Maybe<Arc<FlatLowered>> {
559+
let mut lowered = (*db.priv_concrete_function_with_body_lowered_flat(function)?).clone();
560+
add_withdraw_gas(db, function, &mut lowered)?;
561+
lower_panics(db, function, &mut lowered)?;
562+
add_destructs(db, function, &mut lowered);
562563
scrub_units(db, &mut lowered);
563564

564565
Ok(Arc::new(lowered))

crates/cairo-lang-lowering/src/inline/mod.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ mod statements_weights;
55

66
use std::collections::{HashMap, VecDeque};
77

8+
use cairo_lang_debug::DebugWithDb;
89
use cairo_lang_defs::diagnostic_utils::StableLocation;
910
use cairo_lang_defs::ids::LanguageElementId;
1011
use cairo_lang_diagnostics::{Diagnostics, Maybe};
@@ -21,15 +22,15 @@ use crate::db::LoweringGroup;
2122
use crate::diagnostic::{
2223
LoweringDiagnostic, LoweringDiagnosticKind, LoweringDiagnostics, LoweringDiagnosticsBuilder,
2324
};
25+
use crate::fmt::LoweredFormatter;
2426
use crate::ids::{
2527
ConcreteFunctionWithBodyId, FunctionWithBodyId, FunctionWithBodyLongId, LocationId,
2628
};
2729
use crate::lower::context::{VarRequest, VariableAllocator};
2830
use crate::utils::{InliningStrategy, Rebuilder, RebuilderEx};
2931
use crate::{
3032
BlockId, FlatBlock, FlatBlockEnd, FlatLowered, Statement, StatementCall, VarRemapping,
31-
VariableId,
32-
};
33+
VariableId};
3334

3435
pub fn get_inline_diagnostics(
3536
db: &dyn LoweringGroup,
@@ -217,6 +218,21 @@ impl Rebuilder for Mapper<'_, '_> {
217218
fn transform_end(&mut self, end: &mut FlatBlockEnd) {
218219
match end {
219220
FlatBlockEnd::Return(returns, _location) => {
221+
if self.outputs.len() != returns.len() {
222+
let db = self.variables.db;
223+
let lowered = self.lowered;
224+
let fmt = LoweredFormatter::new(db, &lowered.variables);
225+
226+
eprintln!(
227+
"{:?}",
228+
self.inlining_location.diagnostic_location(db).debug(db.elongate())
229+
);
230+
eprintln!("{:?}", self.outputs);
231+
eprintln!("{:?}", returns);
232+
233+
eprintln!("{:?}", lowered.debug(&fmt));
234+
}
235+
220236
let remapping = VarRemapping {
221237
remapping: OrderedHashMap::from_iter(zip_eq(
222238
self.outputs.iter().cloned(),

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

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,9 @@ End:
3737

3838
blk2:
3939
Statements:
40-
(v2: core::felt252) <- -1
41-
(v3: core::felt252) <- core::felt252_mul(v0, v2)
40+
(v2: core::felt252) <- "core::Felt252Mul::mul"{None, -1, }(v0)
4241
End:
43-
Goto(blk1, {v3 -> v1})
42+
Goto(blk1, {v2 -> v1})
4443

4544
//! > lowering_diagnostics
4645

@@ -890,15 +889,19 @@ End:
890889

891890
blk8:
892891
Statements:
893-
(v15: (core::integer::u128,)) <- struct_construct(v13)
894-
(v16: core::panics::PanicResult::<(core::integer::u128,)>) <- PanicResult::Ok(v15)
892+
(v15: core::result::Result::<core::integer::u128, core::integer::u128>) <- Result::Ok(v13)
895893
End:
896-
Goto(blk4, {v16 -> v3})
894+
Goto(blk10, {v15 -> v16})
897895

898896
blk9:
899897
Statements:
900-
(v17: (core::panics::Panic, core::array::Array::<core::felt252>)) <- core::panic_with_const_felt252::<39878429859757942499084499860145094553463>()
901-
(v18: core::panics::PanicResult::<(core::integer::u128,)>) <- PanicResult::Err(v17)
898+
(v17: core::result::Result::<core::integer::u128, core::integer::u128>) <- Result::Err(v14)
899+
End:
900+
Goto(blk10, {v17 -> v16})
901+
902+
blk10:
903+
Statements:
904+
(v18: core::panics::PanicResult::<(core::integer::u128,)>) <- "core::result::ResultTraitImpl::expect::<core::traits::PanicDestructForDestruct::<core::integer::u128, core::traits::DestructFromDrop::<core::integer::u128, core::integer::u128Drop>>>"{None, 39878429859757942499084499860145094553463, }(v16)
902905
End:
903906
Goto(blk4, {v18 -> v3})
904907

@@ -1113,19 +1116,18 @@ End:
11131116

11141117
blk8:
11151118
Statements:
1116-
(v13: core::felt252) <- 1
1117-
(v14: core::felt252) <- core::felt252_sub(v0, v13)
1118-
(v15: core::panics::PanicResult::<(core::felt252,)>) <- test::foo(v14)
1119+
(v13: core::felt252) <- "core::Felt252Sub::sub"{None, 1, }(v0)
1120+
(v14: core::panics::PanicResult::<(core::felt252,)>) <- test::foo(v13)
11191121
End:
1120-
Goto(blk6, {v15 -> v3})
1122+
Goto(blk6, {v14 -> v3})
11211123

11221124
blk9:
11231125
Statements:
1124-
(v16: core::felt252) <- 1
1125-
(v17: (core::felt252,)) <- struct_construct(v16)
1126-
(v18: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Ok(v17)
1126+
(v15: core::felt252) <- 1
1127+
(v16: (core::felt252,)) <- struct_construct(v15)
1128+
(v17: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Ok(v16)
11271129
End:
1128-
Goto(blk6, {v18 -> v3})
1130+
Goto(blk6, {v17 -> v3})
11291131

11301132
//! > lowering_diagnostics
11311133

@@ -1668,19 +1670,18 @@ End:
16681670

16691671
blk8:
16701672
Statements:
1671-
(v13: core::felt252) <- 1
1672-
(v14: core::felt252) <- core::felt252_sub(v0, v13)
1673-
(v15: core::panics::PanicResult::<(core::felt252,)>) <- test::foo(v14)
1673+
(v13: core::felt252) <- "core::Felt252Sub::sub"{None, 1, }(v0)
1674+
(v14: core::panics::PanicResult::<(core::felt252,)>) <- test::foo(v13)
16741675
End:
1675-
Goto(blk6, {v15 -> v3})
1676+
Goto(blk6, {v14 -> v3})
16761677

16771678
blk9:
16781679
Statements:
1679-
(v16: core::felt252) <- 1
1680-
(v17: (core::felt252,)) <- struct_construct(v16)
1681-
(v18: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Ok(v17)
1680+
(v15: core::felt252) <- 1
1681+
(v16: (core::felt252,)) <- struct_construct(v15)
1682+
(v17: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Ok(v16)
16821683
End:
1683-
Goto(blk6, {v18 -> v3})
1684+
Goto(blk6, {v17 -> v3})
16841685

16851686
//! > lowering_diagnostics
16861687

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

Lines changed: 14 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -143,21 +143,17 @@ Final lowering:
143143
Parameters: v0: test::PanicDestructable
144144
blk0 (root):
145145
Statements:
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
150-
(v5: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v3, v4)
151-
(v6: core::felt252) <- 0
152-
(v7: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v5, v6)
153-
(v8: core::felt252) <- 345232009571
154-
(v9: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v7, v8)
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)
158-
(v13: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v12)
146+
(v1: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
147+
(v2: core::array::Array::<core::felt252>) <- "core::array::ArrayImpl::append"{None, 1997209042069643135709344952807065910992472029923670688473712229447419591075, }(v1)
148+
(v3: core::array::Array::<core::felt252>) <- "core::array::ArrayImpl::append"{None, 0, }(v2)
149+
(v4: core::array::Array::<core::felt252>) <- "core::array::ArrayImpl::append"{None, 345232009571, }(v3)
150+
(v5: core::array::Array::<core::felt252>) <- "core::array::ArrayImpl::append"{None, 5, }(v4)
151+
(v6: {[email protected]:11:5: 11:7}) <- struct_construct(v0)
152+
(v7: core::panics::Panic) <- "Generated `core::traits::PanicDestruct::panic_destruct` for {[email protected]:11:5: 11:7}"{None, {}, }(v6)
153+
(v8: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v7, v5)
154+
(v9: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v8)
159155
End:
160-
Return(v13)
156+
Return(v9)
161157

162158

163159
Generated core::traits::PanicDestruct::panic_destruct lowering for source location:
@@ -348,22 +344,9 @@ Final lowering:
348344
Parameters: v0: core::integer::u32
349345
blk0 (root):
350346
Statements:
351-
(v1: core::felt252) <- 1
352-
(v2: core::felt252) <- 2
353-
(v3: core::felt252) <- core::felt252_sub(v1, v2)
354-
End:
355-
Match(match core::felt252_is_zero(v3) {
356-
IsZeroResult::Zero => blk1,
357-
IsZeroResult::NonZero(v4) => blk2,
358-
})
359-
360-
blk1:
361-
Statements:
362-
End:
363-
Return()
364-
365-
blk2:
366-
Statements:
347+
(v1: {[email protected]:2:13: 2:25}) <- struct_construct()
348+
(v2: {[email protected]:2:13: 2:25}, v3: @{[email protected]:2:13: 2:25}) <- snapshot(v1)
349+
() <- "Generated `core::ops::function::Fn::call` for {[email protected]:2:13: 2:25}"{None, { 0: core::felt252 }, }(v3)
367350
End:
368351
Return()
369352

@@ -505,11 +488,7 @@ Final lowering:
505488
Parameters:
506489
blk0 (root):
507490
Statements:
508-
(v0: core::felt252) <- 2
509-
(v1: {[email protected]:5:29: 5:36}) <- struct_construct()
510-
(v2: {[email protected]:5:29: 5:36}, v3: @{[email protected]:5:29: 5:36}) <- snapshot(v1)
511-
(v4: (core::felt252,)) <- struct_construct(v0)
512-
(v5: core::felt252) <- Generated `core::ops::function::Fn::call` for {[email protected]:5:29: 5:36}(v3, v4)
491+
() <- "test::apply::<{[email protected]:5:29: 5:36}, Generated core::traits::Drop::<{[email protected]:5:29: 5:36}>, core::ops::function::FnOnceImpl::<{[email protected]:5:29: 5:36}, (core::felt252,), core::traits::DestructFromDrop::<{[email protected]:5:29: 5:36}, Generated core::traits::Drop::<{[email protected]:5:29: 5:36}>>, Generated core::ops::function::Fn::<{[email protected]:5:29: 5:36}, (core::felt252,)>>, core::felt252Drop>"{{}, }()
513492
End:
514493
Return()
515494

0 commit comments

Comments
 (0)