Skip to content

Commit 2472499

Browse files
Adding support to felt add mul and sub in constant propogation
1 parent 3694b3e commit 2472499

File tree

13 files changed

+372
-1300
lines changed

13 files changed

+372
-1300
lines changed

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

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -343,22 +343,6 @@ End:
343343
Final lowering:
344344
Parameters: v0: core::integer::u32
345345
blk0 (root):
346-
Statements:
347-
(v1: core::felt252) <- 1
348-
(v2: core::felt252) <- 2
349-
(v3: core::felt252) <- core::felt252_sub(v1, v2)
350-
End:
351-
Match(match core::felt252_is_zero(v3) {
352-
IsZeroResult::Zero => blk1,
353-
IsZeroResult::NonZero(v4) => blk2,
354-
})
355-
356-
blk1:
357-
Statements:
358-
End:
359-
Return()
360-
361-
blk2:
362346
Statements:
363347
End:
364348
Return()
@@ -430,22 +414,6 @@ End:
430414
Final lowering:
431415
Parameters: v0: @{[email protected]:2:13: 2:25}, v1: (core::felt252,)
432416
blk0 (root):
433-
Statements:
434-
(v2: core::felt252) <- 1
435-
(v3: core::felt252) <- 2
436-
(v4: core::felt252) <- core::felt252_sub(v2, v3)
437-
End:
438-
Match(match core::felt252_is_zero(v4) {
439-
IsZeroResult::Zero => blk1,
440-
IsZeroResult::NonZero(v5) => blk2,
441-
})
442-
443-
blk1:
444-
Statements:
445-
End:
446-
Return()
447-
448-
blk2:
449417
Statements:
450418
End:
451419
Return()

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin
5555
blk0 (root):
5656
Statements:
5757
(v2: core::felt252) <- 1
58-
(v3: core::felt252) <- core::felt252_add(v2, v2)
58+
(v3: core::felt252) <- 2
5959
(v4: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
6060
(v5: core::felt252) <- 10
6161
(v6: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v4, v5)

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

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use cairo_lang_semantic::types::{TypeSizeInformation, TypesSemantic};
1818
use cairo_lang_semantic::{
1919
ConcreteTypeId, GenericArgumentId, MatchArmSelector, TypeId, TypeLongId, corelib,
2020
};
21+
use cairo_lang_utils::bigint::{CAIRO_PRIME_BIGINT, felt252_mod};
2122
use cairo_lang_utils::byte_array::BYTE_ARRAY_MAGIC;
2223
use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
2324
use cairo_lang_utils::ordered_hash_set::OrderedHashSet;
@@ -493,10 +494,37 @@ impl<'db, 'mt> ConstFoldingContext<'db, 'mt> {
493494
}
494495
let (id, _generic_args) = stmt.function.get_extern(db)?;
495496
if id == self.felt_sub {
496-
// (a - 0) can be replaced by a.
497-
let val = self.as_int(stmt.inputs[1].var_id)?;
498-
if val.is_zero() {
499-
self.var_info.insert(stmt.outputs[0], VarInfo::Var(stmt.inputs[0]));
497+
if let Some(rhs) = self.as_int(stmt.inputs[1].var_id) {
498+
if rhs.is_zero() {
499+
self.var_info.insert(stmt.outputs[0], VarInfo::Var(stmt.inputs[0]));
500+
return None;
501+
}
502+
}
503+
if let (Some(lhs), Some(rhs)) =
504+
(self.as_int(stmt.inputs[0].var_id), self.as_int(stmt.inputs[1].var_id))
505+
{
506+
let value = felt252_mod(&(lhs - rhs));
507+
return Some(self.propagate_const_and_get_statement(value, stmt.outputs[0], false));
508+
}
509+
None
510+
} else if id == self.felt_add {
511+
if let (Some(lhs), Some(rhs)) =
512+
(self.as_int(stmt.inputs[0].var_id), self.as_int(stmt.inputs[1].var_id))
513+
{
514+
let value = felt252_mod(&(lhs + rhs));
515+
return Some(self.propagate_const_and_get_statement(value, stmt.outputs[0], false));
516+
}
517+
None
518+
} else if id == self.felt_mul {
519+
let lhs = self.as_int_ex(stmt.inputs[0].var_id);
520+
let rhs = self.as_int_ex(stmt.inputs[1].var_id);
521+
if lhs.map(|(v, _)| v.is_zero()).unwrap_or_default() || rhs.map(|(v, _)| v.is_zero()).unwrap_or_default() {
522+
return Some(self.propagate_zero_and_get_statement(stmt.outputs[0]));
523+
}
524+
if let (Some((lhs_val, lhs_nz)), Some((rhs_val, rhs_nz))) = (lhs, rhs) {
525+
let value = felt252_mod(&(lhs_val * rhs_val));
526+
let nz_ty = lhs_nz && rhs_nz;
527+
return Some(self.propagate_const_and_get_statement(value, stmt.outputs[0], nz_ty));
500528
}
501529
None
502530
} else if self.wide_mul_fns.contains(&id) {
@@ -1211,6 +1239,10 @@ fn priv_const_folding_info<'db>(
12111239
pub struct ConstFoldingLibfuncInfo<'db> {
12121240
/// The `felt252_sub` libfunc.
12131241
felt_sub: ExternFunctionId<'db>,
1242+
/// The `felt252_add` libfunc.
1243+
felt_add: ExternFunctionId<'db>,
1244+
/// The `felt252_mul` libfunc.
1245+
felt_mul: ExternFunctionId<'db>,
12141246
/// The `into_box` libfunc.
12151247
into_box: ExternFunctionId<'db>,
12161248
/// The `unbox` libfunc.
@@ -1380,6 +1412,8 @@ impl<'db> ConstFoldingLibfuncInfo<'db> {
13801412
);
13811413
Self {
13821414
felt_sub: core.extern_function_id("felt252_sub"),
1415+
felt_add: core.extern_function_id("felt252_add"),
1416+
felt_mul: core.extern_function_id("felt252_mul"),
13831417
into_box: box_module.extern_function_id("into_box"),
13841418
unbox: box_module.extern_function_id("unbox"),
13851419
box_forward_snapshot: box_module.generic_function_id("box_forward_snapshot"),

crates/cairo-lang-lowering/src/optimizations/test_data/const_folding

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6150,3 +6150,175 @@ End:
61506150
Return(v7)
61516151

61526152
//! > lowering_diagnostics
6153+
6154+
//! > ==========================================================================
6155+
6156+
//! > Felt252 add const fold.
6157+
6158+
//! > test_runner_name
6159+
test_match_optimizer
6160+
6161+
//! > function
6162+
fn foo() -> felt252 {
6163+
1 + 2
6164+
}
6165+
6166+
//! > function_name
6167+
foo
6168+
6169+
//! > module_code
6170+
6171+
//! > semantic_diagnostics
6172+
6173+
//! > before
6174+
Parameters:
6175+
blk0 (root):
6176+
Statements:
6177+
(v0: core::felt252) <- 1
6178+
(v1: core::felt252) <- 2
6179+
(v2: core::felt252) <- core::felt252_add(v0, v1)
6180+
End:
6181+
Return(v2)
6182+
6183+
//! > after
6184+
Parameters:
6185+
blk0 (root):
6186+
Statements:
6187+
(v0: core::felt252) <- 1
6188+
(v1: core::felt252) <- 2
6189+
(v2: core::felt252) <- 3
6190+
End:
6191+
Return(v2)
6192+
6193+
//! > lowering_diagnostics
6194+
6195+
//! > ==========================================================================
6196+
6197+
//! > Felt252 sub const fold.
6198+
6199+
//! > test_runner_name
6200+
test_match_optimizer
6201+
6202+
//! > function
6203+
fn foo() -> felt252 {
6204+
5 - 3
6205+
}
6206+
6207+
//! > function_name
6208+
foo
6209+
6210+
//! > module_code
6211+
6212+
//! > semantic_diagnostics
6213+
6214+
//! > before
6215+
Parameters:
6216+
blk0 (root):
6217+
Statements:
6218+
(v0: core::felt252) <- 5
6219+
(v1: core::felt252) <- 3
6220+
(v2: core::felt252) <- core::felt252_sub(v0, v1)
6221+
End:
6222+
Return(v2)
6223+
6224+
//! > after
6225+
Parameters:
6226+
blk0 (root):
6227+
Statements:
6228+
(v0: core::felt252) <- 5
6229+
(v1: core::felt252) <- 3
6230+
(v2: core::felt252) <- 2
6231+
End:
6232+
Return(v2)
6233+
6234+
//! > lowering_diagnostics
6235+
6236+
//! > ==========================================================================
6237+
6238+
//! > Felt252 mul const fold.
6239+
6240+
//! > test_runner_name
6241+
test_match_optimizer
6242+
6243+
//! > function
6244+
fn foo() -> felt252 {
6245+
2 * 3
6246+
}
6247+
6248+
//! > function_name
6249+
foo
6250+
6251+
//! > module_code
6252+
6253+
//! > semantic_diagnostics
6254+
6255+
//! > before
6256+
Parameters:
6257+
blk0 (root):
6258+
Statements:
6259+
(v0: core::felt252) <- 2
6260+
(v1: core::felt252) <- 3
6261+
(v2: core::felt252) <- core::felt252_mul(v0, v1)
6262+
End:
6263+
Return(v2)
6264+
6265+
//! > after
6266+
Parameters:
6267+
blk0 (root):
6268+
Statements:
6269+
(v0: core::felt252) <- 2
6270+
(v1: core::felt252) <- 3
6271+
(v2: core::felt252) <- 6
6272+
End:
6273+
Return(v2)
6274+
6275+
//! > lowering_diagnostics
6276+
6277+
//! > ==========================================================================
6278+
6279+
//! > Felt252 combined operations const fold.
6280+
6281+
//! > test_runner_name
6282+
test_match_optimizer
6283+
6284+
//! > function
6285+
fn foo() -> felt252 {
6286+
1 + 2 * 3 - 4
6287+
}
6288+
6289+
//! > function_name
6290+
foo
6291+
6292+
//! > module_code
6293+
6294+
//! > semantic_diagnostics
6295+
6296+
//! > before
6297+
Parameters:
6298+
blk0 (root):
6299+
Statements:
6300+
(v0: core::felt252) <- 1
6301+
(v1: core::felt252) <- 2
6302+
(v2: core::felt252) <- 3
6303+
(v3: core::felt252) <- core::felt252_mul(v1, v2)
6304+
(v4: core::felt252) <- core::felt252_add(v0, v3)
6305+
(v5: core::felt252) <- 4
6306+
(v6: core::felt252) <- core::felt252_sub(v4, v5)
6307+
End:
6308+
Return(v6)
6309+
6310+
//! > after
6311+
Parameters:
6312+
blk0 (root):
6313+
Statements:
6314+
(v0: core::felt252) <- 1
6315+
(v1: core::felt252) <- 2
6316+
(v2: core::felt252) <- 3
6317+
(v3: core::felt252) <- 6
6318+
(v4: core::felt252) <- 7
6319+
(v5: core::felt252) <- 4
6320+
(v6: core::felt252) <- 3
6321+
End:
6322+
Return(v6)
6323+
6324+
//! > lowering_diagnostics

crates/cairo-lang-lowering/src/optimizations/test_data/reorder_statements

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ End:
7474

7575
blk4:
7676
Statements:
77-
(v12: core::felt252) <- core::felt252_add(v7, v8)
77+
(v12: core::felt252) <- 3
7878
End:
7979
Goto(blk9, {v12 -> v13})
8080

@@ -89,7 +89,7 @@ End:
8989

9090
blk6:
9191
Statements:
92-
(v17: core::felt252) <- core::felt252_add(v9, v14)
92+
(v17: core::felt252) <- 7
9393
End:
9494
Goto(blk8, {v17 -> v18})
9595

@@ -133,7 +133,6 @@ End:
133133

134134
blk3:
135135
Statements:
136-
(v7: core::felt252) <- 1
137136
End:
138137
Match(match_enum(v2) {
139138
Option::Some(v10) => blk4,
@@ -142,8 +141,7 @@ End:
142141

143142
blk4:
144143
Statements:
145-
(v8: core::felt252) <- 2
146-
(v12: core::felt252) <- core::felt252_add(v7, v8)
144+
(v12: core::felt252) <- 3
147145
End:
148146
Goto(blk9, {v12 -> v13})
149147

@@ -157,14 +155,13 @@ End:
157155

158156
blk6:
159157
Statements:
160-
(v9: core::felt252) <- 3
161-
(v14: core::felt252) <- 4
162-
(v17: core::felt252) <- core::felt252_add(v9, v14)
158+
(v17: core::felt252) <- 7
163159
End:
164160
Goto(blk8, {v17 -> v18})
165161

166162
blk7:
167163
Statements:
164+
(v7: core::felt252) <- 1
168165
End:
169166
Goto(blk8, {v7 -> v18})
170167

@@ -356,16 +353,14 @@ Statements:
356353
(v2: core::felt252) <- 5
357354
(v3: ()) <- struct_construct()
358355
(v4: core::felt252) <- 3
359-
(v5: core::felt252) <- core::felt252_add(v2, v4)
356+
(v5: core::felt252) <- 8
360357
End:
361358
Return(v5)
362359

363360
//! > after
364361
Parameters:
365362
blk0 (root):
366363
Statements:
367-
(v2: core::felt252) <- 5
368-
(v4: core::felt252) <- 3
369-
(v5: core::felt252) <- core::felt252_add(v2, v4)
364+
(v5: core::felt252) <- 8
370365
End:
371366
Return(v5)

0 commit comments

Comments
 (0)