Skip to content

Commit 29bcce7

Browse files
committed
Added some constfolding for array-pops.
commit-id:7f3fce8a
1 parent ecfb59d commit 29bcce7

File tree

3 files changed

+363
-11
lines changed

3 files changed

+363
-11
lines changed

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

+26
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,32 @@ impl ConstFoldingContext<'_> {
680680
}
681681
}
682682
None
683+
} else if id == self.array_pop_front {
684+
let VarInfo::Array(var_infos) = self.var_info.get(&info.inputs[0].var_id)? else {
685+
return None;
686+
};
687+
if let Some(first) = var_infos.first().cloned() {
688+
let arm = &info.arms[0];
689+
self.var_info.insert(arm.var_ids[0], VarInfo::Array(var_infos[1..].to_vec()));
690+
self.var_info.insert(arm.var_ids[1], VarInfo::Box(first.into()));
691+
None
692+
} else {
693+
let arm = &info.arms[1];
694+
self.var_info.insert(arm.var_ids[0], VarInfo::Array(vec![]));
695+
Some((vec![], FlatBlockEnd::Goto(arm.block_id, Default::default())))
696+
}
697+
} else if id == self.array_snapshot_pop_back || id == self.array_snapshot_pop_front {
698+
let var_info = self.var_info.get(&info.inputs[0].var_id)?;
699+
let desnapped = try_extract_matches!(var_info, VarInfo::Snapshot)?;
700+
let element_var_infos = try_extract_matches!(desnapped.as_ref(), VarInfo::Array)?;
701+
// TODO(orizi): Propagate success values as well.
702+
if element_var_infos.is_empty() {
703+
let arm = &info.arms[1];
704+
self.var_info.insert(arm.var_ids[0], VarInfo::Array(vec![]));
705+
Some((vec![], FlatBlockEnd::Goto(arm.block_id, Default::default())))
706+
} else {
707+
None
708+
}
683709
} else {
684710
None
685711
}

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

+327
Original file line numberDiff line numberDiff line change
@@ -4791,3 +4791,330 @@ End:
47914791
Return(v6)
47924792

47934793
//! > lowering_diagnostics
4794+
4795+
//! > ==========================================================================
4796+
4797+
//! > Array pop_front known empty array.
4798+
4799+
//! > test_runner_name
4800+
test_match_optimizer
4801+
4802+
//! > function
4803+
fn foo() -> Option<felt252> {
4804+
let mut arr = array![];
4805+
arr.pop_front()
4806+
}
4807+
4808+
//! > function_name
4809+
foo
4810+
4811+
//! > module_code
4812+
4813+
//! > semantic_diagnostics
4814+
4815+
//! > before
4816+
Parameters:
4817+
blk0 (root):
4818+
Statements:
4819+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
4820+
End:
4821+
Match(match core::array::array_pop_front::<core::felt252>(v0) {
4822+
Option::Some(v1, v2) => blk1,
4823+
Option::None(v3) => blk2,
4824+
})
4825+
4826+
blk1:
4827+
Statements:
4828+
(v4: core::felt252) <- core::box::unbox::<core::felt252>(v2)
4829+
(v5: core::option::Option::<core::felt252>) <- Option::Some(v4)
4830+
End:
4831+
Goto(blk3, {v5 -> v6})
4832+
4833+
blk2:
4834+
Statements:
4835+
(v7: ()) <- struct_construct()
4836+
(v8: core::option::Option::<core::felt252>) <- Option::None(v7)
4837+
End:
4838+
Goto(blk3, {v8 -> v6})
4839+
4840+
blk3:
4841+
Statements:
4842+
End:
4843+
Return(v6)
4844+
4845+
//! > after
4846+
Parameters:
4847+
blk0 (root):
4848+
Statements:
4849+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
4850+
End:
4851+
Goto(blk2, {})
4852+
4853+
blk1:
4854+
Statements:
4855+
(v4: core::felt252) <- core::box::unbox::<core::felt252>(v2)
4856+
(v5: core::option::Option::<core::felt252>) <- Option::Some(v4)
4857+
End:
4858+
Goto(blk3, {v5 -> v6})
4859+
4860+
blk2:
4861+
Statements:
4862+
(v7: ()) <- struct_construct()
4863+
(v8: core::option::Option::<core::felt252>) <- Option::None(v7)
4864+
End:
4865+
Goto(blk3, {v8 -> v6})
4866+
4867+
blk3:
4868+
Statements:
4869+
End:
4870+
Return(v6)
4871+
4872+
//! > lowering_diagnostics
4873+
4874+
//! > ==========================================================================
4875+
4876+
//! > Array pop_front known non-empty array.
4877+
4878+
//! > test_runner_name
4879+
test_match_optimizer
4880+
4881+
//! > function
4882+
fn foo() -> Option<felt252> {
4883+
let mut arr = array![1];
4884+
arr.pop_front()
4885+
}
4886+
4887+
//! > function_name
4888+
foo
4889+
4890+
//! > module_code
4891+
4892+
//! > semantic_diagnostics
4893+
4894+
//! > before
4895+
Parameters:
4896+
blk0 (root):
4897+
Statements:
4898+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
4899+
(v1: core::felt252) <- 1
4900+
(v2: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v0, v1)
4901+
End:
4902+
Match(match core::array::array_pop_front::<core::felt252>(v2) {
4903+
Option::Some(v3, v4) => blk1,
4904+
Option::None(v5) => blk2,
4905+
})
4906+
4907+
blk1:
4908+
Statements:
4909+
(v6: core::felt252) <- core::box::unbox::<core::felt252>(v4)
4910+
(v7: core::option::Option::<core::felt252>) <- Option::Some(v6)
4911+
End:
4912+
Goto(blk3, {v7 -> v8})
4913+
4914+
blk2:
4915+
Statements:
4916+
(v9: ()) <- struct_construct()
4917+
(v10: core::option::Option::<core::felt252>) <- Option::None(v9)
4918+
End:
4919+
Goto(blk3, {v10 -> v8})
4920+
4921+
blk3:
4922+
Statements:
4923+
End:
4924+
Return(v8)
4925+
4926+
//! > after
4927+
Parameters:
4928+
blk0 (root):
4929+
Statements:
4930+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
4931+
(v1: core::felt252) <- 1
4932+
(v2: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v0, v1)
4933+
End:
4934+
Match(match core::array::array_pop_front::<core::felt252>(v2) {
4935+
Option::Some(v3, v4) => blk1,
4936+
Option::None(v5) => blk2,
4937+
})
4938+
4939+
blk1:
4940+
Statements:
4941+
(v6: core::felt252) <- 1
4942+
(v7: core::option::Option::<core::felt252>) <- Option::Some(v6)
4943+
End:
4944+
Goto(blk3, {v7 -> v8})
4945+
4946+
blk2:
4947+
Statements:
4948+
(v9: ()) <- struct_construct()
4949+
(v10: core::option::Option::<core::felt252>) <- Option::None(v9)
4950+
End:
4951+
Goto(blk3, {v10 -> v8})
4952+
4953+
blk3:
4954+
Statements:
4955+
End:
4956+
Return(v8)
4957+
4958+
//! > lowering_diagnostics
4959+
4960+
//! > ==========================================================================
4961+
4962+
//! > Span pop_front known empty.
4963+
4964+
//! > test_runner_name
4965+
test_match_optimizer
4966+
4967+
//! > function
4968+
fn foo() -> Option<@felt252> {
4969+
let mut span = array![].span();
4970+
span.pop_front()
4971+
}
4972+
4973+
//! > function_name
4974+
foo
4975+
4976+
//! > module_code
4977+
4978+
//! > semantic_diagnostics
4979+
4980+
//! > before
4981+
Parameters:
4982+
blk0 (root):
4983+
Statements:
4984+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
4985+
(v1: core::array::Array::<core::felt252>, v2: @core::array::Array::<core::felt252>) <- snapshot(v0)
4986+
End:
4987+
Match(match core::array::array_snapshot_pop_front::<core::felt252>(v2) {
4988+
Option::Some(v3, v4) => blk1,
4989+
Option::None(v5) => blk2,
4990+
})
4991+
4992+
blk1:
4993+
Statements:
4994+
(v6: @core::felt252) <- core::box::unbox::<@core::felt252>(v4)
4995+
(v7: core::option::Option::<@core::felt252>) <- Option::Some(v6)
4996+
End:
4997+
Goto(blk3, {v7 -> v8})
4998+
4999+
blk2:
5000+
Statements:
5001+
(v9: ()) <- struct_construct()
5002+
(v10: core::option::Option::<@core::felt252>) <- Option::None(v9)
5003+
End:
5004+
Goto(blk3, {v10 -> v8})
5005+
5006+
blk3:
5007+
Statements:
5008+
End:
5009+
Return(v8)
5010+
5011+
//! > after
5012+
Parameters:
5013+
blk0 (root):
5014+
Statements:
5015+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
5016+
(v1: core::array::Array::<core::felt252>, v2: @core::array::Array::<core::felt252>) <- snapshot(v0)
5017+
End:
5018+
Goto(blk2, {})
5019+
5020+
blk1:
5021+
Statements:
5022+
(v6: @core::felt252) <- core::box::unbox::<@core::felt252>(v4)
5023+
(v7: core::option::Option::<@core::felt252>) <- Option::Some(v6)
5024+
End:
5025+
Goto(blk3, {v7 -> v8})
5026+
5027+
blk2:
5028+
Statements:
5029+
(v9: ()) <- struct_construct()
5030+
(v10: core::option::Option::<@core::felt252>) <- Option::None(v9)
5031+
End:
5032+
Goto(blk3, {v10 -> v8})
5033+
5034+
blk3:
5035+
Statements:
5036+
End:
5037+
Return(v8)
5038+
5039+
//! > lowering_diagnostics
5040+
5041+
//! > ==========================================================================
5042+
5043+
//! > Span pop_back known empty.
5044+
5045+
//! > test_runner_name
5046+
test_match_optimizer
5047+
5048+
//! > function
5049+
fn foo() -> Option<@felt252> {
5050+
let mut span = array![].span();
5051+
span.pop_back()
5052+
}
5053+
5054+
//! > function_name
5055+
foo
5056+
5057+
//! > module_code
5058+
5059+
//! > semantic_diagnostics
5060+
5061+
//! > before
5062+
Parameters:
5063+
blk0 (root):
5064+
Statements:
5065+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
5066+
(v1: core::array::Array::<core::felt252>, v2: @core::array::Array::<core::felt252>) <- snapshot(v0)
5067+
End:
5068+
Match(match core::array::array_snapshot_pop_back::<core::felt252>(v2) {
5069+
Option::Some(v3, v4) => blk1,
5070+
Option::None(v5) => blk2,
5071+
})
5072+
5073+
blk1:
5074+
Statements:
5075+
(v6: @core::felt252) <- core::box::unbox::<@core::felt252>(v4)
5076+
(v7: core::option::Option::<@core::felt252>) <- Option::Some(v6)
5077+
End:
5078+
Goto(blk3, {v7 -> v8})
5079+
5080+
blk2:
5081+
Statements:
5082+
(v9: ()) <- struct_construct()
5083+
(v10: core::option::Option::<@core::felt252>) <- Option::None(v9)
5084+
End:
5085+
Goto(blk3, {v10 -> v8})
5086+
5087+
blk3:
5088+
Statements:
5089+
End:
5090+
Return(v8)
5091+
5092+
//! > after
5093+
Parameters:
5094+
blk0 (root):
5095+
Statements:
5096+
(v0: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
5097+
(v1: core::array::Array::<core::felt252>, v2: @core::array::Array::<core::felt252>) <- snapshot(v0)
5098+
End:
5099+
Goto(blk2, {})
5100+
5101+
blk1:
5102+
Statements:
5103+
(v6: @core::felt252) <- core::box::unbox::<@core::felt252>(v4)
5104+
(v7: core::option::Option::<@core::felt252>) <- Option::Some(v6)
5105+
End:
5106+
Goto(blk3, {v7 -> v8})
5107+
5108+
blk2:
5109+
Statements:
5110+
(v9: ()) <- struct_construct()
5111+
(v10: core::option::Option::<@core::felt252>) <- Option::None(v9)
5112+
End:
5113+
Goto(blk3, {v10 -> v8})
5114+
5115+
blk3:
5116+
Statements:
5117+
End:
5118+
Return(v8)
5119+
5120+
//! > lowering_diagnostics

0 commit comments

Comments
 (0)