Skip to content

Commit 23cb152

Browse files
committed
flow_control: Update changed_members in the root block.
commit-id:d1a5121c
1 parent a6bc71d commit 23cb152

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

crates/cairo-lang-lowering/src/lower/block_builder.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ use semantic::{ConcreteTypeId, ExprVarMemberPath, TypeLongId};
1515
use super::context::{LoweredExpr, LoweringContext, LoweringFlowError, LoweringResult, VarRequest};
1616
use super::generators;
1717
use super::generators::StatementsBuilder;
18-
use super::refs::{SemanticLoweringMapping, StructRecomposer, merge_semantics};
18+
use super::refs::{
19+
SemanticLoweringMapping, StructRecomposer, find_changed_members, merge_semantics,
20+
};
1921
use crate::db::LoweringGroup;
2022
use crate::diagnostic::{LoweringDiagnosticKind, LoweringDiagnosticsBuilder};
2123
use crate::ids::LocationId;
@@ -397,6 +399,15 @@ impl<'db> BlockBuilder<'db> {
397399
closure_info,
398400
)
399401
}
402+
403+
/// Marks the following as changed members:
404+
/// (1) the changed members of `parent_builder`,
405+
/// (2) the members whose value was changed between `parent_builder` and `self`.
406+
pub fn set_changed_member_paths(&mut self, parent_builder: &Self) {
407+
self.changed_member_paths.extend(parent_builder.changed_member_paths.iter().cloned());
408+
self.changed_member_paths
409+
.extend(find_changed_members(&parent_builder.semantics, &self.semantics));
410+
}
400411
}
401412

402413
impl<'db> DebugWithDb<'db> for BlockBuilder<'db> {
@@ -559,8 +570,9 @@ impl<'db> StructRecomposer<'db> for BlockStructRecomposer<'_, '_, 'db> {
559570
/// * Variables mapped to the same lowered variable across all input blocks are kept as-is.
560571
/// * Local variables that appear in only a subset of the blocks are removed.
561572
/// * Variables with different mappings across blocks are remapped to a new lowered variable.
562-
// TODO(lior): Remove `allow(dead_code)` once the function is used.
563-
#[allow(dead_code)]
573+
///
574+
/// Note that the returned [BlockBuilder] has an empty [BlockBuilder::changed_member_paths].
575+
/// Use [BlockBuilder::set_changed_member_paths] to set it if necessary.
564576
pub fn merge_sealed_block_builders<'db>(
565577
ctx: &mut LoweringContext<'db, '_>,
566578
sealed_blocks: Vec<SealedGotoCallsite<'db>>,

crates/cairo-lang-lowering/src/lower/flow_control/lower_graph.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,10 @@ impl<'mt, 'db, 'a> LowerGraphContext<'db, 'mt, 'a> {
203203

204204
match match_info {
205205
Ok(match_info) => {
206-
if let Some((new_builder, lowered_expr)) =
206+
if let Some((mut new_builder, lowered_expr)) =
207207
merge_sealed_block_builders(self.ctx, self.sealed_blocks, self.location)
208208
{
209+
new_builder.set_changed_member_paths(&builder);
209210
builder.finalize(self.ctx, BlockEnd::Match { info: match_info });
210211
(Ok(lowered_expr), new_builder)
211212
} else {

crates/cairo-lang-lowering/src/lower/refs.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,22 @@ fn compute_remapped_variables<'db>(
308308
Value::Scattered(Box::new(Scattered { concrete_struct_id, members }))
309309
}
310310

311+
/// Returns an iterator to all the [MemberPath]s that appear in both mappings and have different
312+
/// values.
313+
pub fn find_changed_members<'db, 'a>(
314+
semantics0: &'a SemanticLoweringMapping<'db>,
315+
semantics1: &'a SemanticLoweringMapping<'db>,
316+
) -> impl Iterator<Item = MemberPath<'db>> + 'a {
317+
semantics0.scattered.iter().filter_map(|(path, value0)| {
318+
if let Some(value1) = semantics1.scattered.get(path) {
319+
if value0 != value1 {
320+
return Some(path.clone());
321+
}
322+
}
323+
None
324+
})
325+
}
326+
311327
/// A trait for deconstructing and constructing structs.
312328
pub trait StructRecomposer<'db> {
313329
fn deconstruct(

0 commit comments

Comments
 (0)