Skip to content

Commit 1486cd8

Browse files
authored
Stopped updating snap-refs - and only introducing top level. (#8048)
1 parent e297562 commit 1486cd8

26 files changed

+7396
-7360
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,11 +341,12 @@ Statements:
341341
(v9: core::integer::u32) <- 2
342342
(v10: (core::integer::u32,)) <- struct_construct(v9{`2`})
343343
(v11: core::integer::u32) <- Generated `core::ops::function::Fn::call` for {[email protected]:3:13: 3:16}(v8{`c`}, v10{`c(2)`})
344-
(v12: core::integer::u32) <- 0
345-
(v13: @core::felt252) <- core::ops::index::DeprecatedIndexViewImpl::<core::array::Array::<core::felt252>, core::integer::u32, @core::felt252, core::array::ArrayIndex::<core::felt252>>::index(v5{`x`}, v12{`0`})
346-
(v14: core::felt252) <- desnap(v13{`0`})
344+
(v12: core::array::Array::<core::felt252>, v13: @core::array::Array::<core::felt252>) <- snapshot(v4{`x`})
345+
(v14: core::integer::u32) <- 0
346+
(v15: @core::felt252) <- core::ops::index::DeprecatedIndexViewImpl::<core::array::Array::<core::felt252>, core::integer::u32, @core::felt252, core::array::ArrayIndex::<core::felt252>>::index(v13{`x`}, v14{`0`})
347+
(v16: core::felt252) <- desnap(v15{`0`})
347348
End:
348-
Return(v14)
349+
Return(v16)
349350

350351
//! > ==========================================================================
351352

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ use crate::{Block, BlockEnd, BlockId, MatchInfo, Statement, VarRemapping, VarUsa
2424
#[derive(Clone)]
2525
pub struct BlockBuilder {
2626
/// A store for semantic variables, owning their OwnedVariable instances.
27-
pub semantics: SemanticLoweringMapping,
27+
semantics: SemanticLoweringMapping,
2828
/// The semantic variables that are captured as snapshots in this block.
29-
pub snapped_semantics: OrderedHashMap<MemberPath, VariableId>,
29+
snapped_semantics: OrderedHashMap<MemberPath, VariableId>,
3030
/// The semantic variables that are added/changed in this block.
3131
changed_member_paths: OrderedHashSet<MemberPath>,
3232
/// Current sequence of lowered statements emitted.
@@ -92,8 +92,6 @@ impl BlockBuilder {
9292
var: VariableId,
9393
location: LocationId,
9494
) {
95-
// Invalidate snapshot to the given memberpath.
96-
self.snapped_semantics.swap_remove(&member_path);
9795
self.semantics.update(
9896
&mut BlockStructRecomposer { statements: &mut self.statements, ctx, location },
9997
&member_path,
@@ -125,9 +123,14 @@ impl BlockBuilder {
125123
.map(|var_id| VarUsage { var_id, location })
126124
}
127125

128-
/// Updates the reference of a semantic variable to a snapshot of its lowered variable.
129-
pub fn update_snap_ref(&mut self, member_path: &ExprVarMemberPath, var: VariableId) {
130-
self.snapped_semantics.insert(member_path.into(), var);
126+
/// Introduces a semantic variable as the representation of the given member path.
127+
pub fn introduce(&mut self, member_path: MemberPath, var: VariableId) {
128+
self.semantics.introduce(member_path, var);
129+
}
130+
131+
/// Introduces a semantic variable as the representation of the given member path as a snapshot.
132+
pub fn introduce_snap(&mut self, member_path: MemberPath, var: VariableId) {
133+
self.snapped_semantics.insert(member_path, var);
131134
}
132135

133136
/// Gets the reference of a snapshot of semantic variable, possibly by deconstructing its

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,7 @@ impl LoweredExpr {
282282
let (original, snapshot) =
283283
generators::Snapshot { input, location }.add(ctx, &mut builder.statements);
284284
if let LoweredExpr::Member(member_path, _location) = &*expr {
285-
// `update_ref` invalidates snapshots so it must be called before
286-
// `update_snap_ref`.
287285
builder.update_ref(ctx, member_path, original);
288-
builder.update_snap_ref(member_path, snapshot);
289286
}
290287

291288
Ok(VarUsage { var_id: snapshot, location })

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -411,9 +411,9 @@ pub fn lower_loop_function(
411411
let location = ctx.get_location(param.stable_ptr().untyped());
412412
let var = ctx.new_var(VarRequest { ty: param.ty(), location });
413413
if snapped_params.contains_key::<MemberPath>(&(&param).into()) {
414-
builder.update_snap_ref(&param, var)
414+
builder.introduce_snap((&param).into(), var)
415415
} else {
416-
builder.semantics.introduce((&param).into(), var);
416+
builder.introduce((&param).into(), var);
417417
}
418418
var
419419
})
@@ -1890,7 +1890,7 @@ fn get_destruct_lowering(
18901890
.into_iter()
18911891
.map(|param| {
18921892
let var = ctx.new_var(VarRequest { ty: param.ty(), location: location_id });
1893-
builder.semantics.introduce((&param).into(), var);
1893+
builder.introduce((&param).into(), var);
18941894
var
18951895
})
18961896
.collect_vec();
@@ -2001,12 +2001,10 @@ fn add_closure_call_function(
20012001
}
20022002
.add(&mut ctx, &mut builder.statements);
20032003
for (i, (param, _)) in closure_info.members.iter().enumerate() {
2004-
builder.semantics.introduce(param.clone(), captured_vars[i]);
2004+
builder.introduce(param.clone(), captured_vars[i]);
20052005
}
20062006
for (i, (param, _)) in closure_info.snapshots.iter().enumerate() {
2007-
builder
2008-
.snapped_semantics
2009-
.insert(param.clone(), captured_vars[i + closure_info.members.len()]);
2007+
builder.introduce_snap(param.clone(), captured_vars[i + closure_info.members.len()]);
20102008
}
20112009
let param_vars = generators::StructDestructure {
20122010
input: VarUsage { var_id: parameters[1], location: expr_location },
@@ -2018,7 +2016,7 @@ fn add_closure_call_function(
20182016
}
20192017
.add(&mut ctx, &mut builder.statements);
20202018
for (param_var, param) in param_vars.into_iter().zip(expr.params.iter()) {
2021-
builder.semantics.introduce((&parameter_as_member_path(param.clone())).into(), param_var);
2019+
builder.introduce((&parameter_as_member_path(param.clone())).into(), param_var);
20222020
ctx.semantic_defs
20232021
.insert(semantic::VarId::Param(param.id), semantic::Binding::Param(param.clone()));
20242022
}

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

Lines changed: 61 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -580,21 +580,22 @@ End:
580580

581581
blk3:
582582
Statements:
583-
(v13: core::felt252) <- 10
584-
(v14: core::felt252, v15: @core::felt252) <- snapshot(v13)
585-
(v16: core::bool) <- core::Felt252PartialEq::eq(v4, v15)
583+
(v13: core::felt252, v14: @core::felt252) <- snapshot(v3)
584+
(v15: core::felt252) <- 10
585+
(v16: core::felt252, v17: @core::felt252) <- snapshot(v15)
586+
(v18: core::bool) <- core::Felt252PartialEq::eq(v14, v17)
586587
End:
587-
Match(match_enum(v16) {
588-
bool::False(v20) => blk5,
589-
bool::True(v17) => blk4,
588+
Match(match_enum(v18) {
589+
bool::False(v22) => blk5,
590+
bool::True(v19) => blk4,
590591
})
591592

592593
blk4:
593594
Statements:
594-
(v18: ()) <- struct_construct()
595-
(v19: core::bool) <- bool::True(v18)
595+
(v20: ()) <- struct_construct()
596+
(v21: core::bool) <- bool::True(v20)
596597
End:
597-
Return(v2, v19)
598+
Return(v2, v21)
598599

599600
blk5:
600601
Statements:
@@ -603,9 +604,9 @@ End:
603604

604605
blk6:
605606
Statements:
606-
(v22: core::felt252, v21: core::bool) <- test::foo[38-201](v2)
607+
(v24: core::felt252, v23: core::bool) <- test::foo[38-201](v2)
607608
End:
608-
Return(v22, v21)
609+
Return(v24, v23)
609610

610611

611612
Final lowering:
@@ -1735,21 +1736,22 @@ End:
17351736

17361737
blk3:
17371738
Statements:
1738-
(v14: core::felt252) <- 5
1739-
(v15: core::felt252, v16: @core::felt252) <- snapshot(v14)
1740-
(v17: core::bool) <- core::Felt252PartialEq::eq(v4, v16)
1739+
(v14: core::felt252, v15: @core::felt252) <- snapshot(v3)
1740+
(v16: core::felt252) <- 5
1741+
(v17: core::felt252, v18: @core::felt252) <- snapshot(v16)
1742+
(v19: core::bool) <- core::Felt252PartialEq::eq(v15, v18)
17411743
End:
1742-
Match(match_enum(v17) {
1743-
bool::False(v21) => blk5,
1744-
bool::True(v18) => blk4,
1744+
Match(match_enum(v19) {
1745+
bool::False(v23) => blk5,
1746+
bool::True(v20) => blk4,
17451747
})
17461748

17471749
blk4:
17481750
Statements:
1749-
(v19: core::integer::u32) <- 5
1750-
(v20: core::internal::LoopResult::<core::bool, core::integer::u32>) <- LoopResult::EarlyReturn(v19)
1751+
(v21: core::integer::u32) <- 5
1752+
(v22: core::internal::LoopResult::<core::bool, core::integer::u32>) <- LoopResult::EarlyReturn(v21)
17511753
End:
1752-
Return(v2, v20)
1754+
Return(v2, v22)
17531755

17541756
blk5:
17551757
Statements:
@@ -1758,20 +1760,21 @@ End:
17581760

17591761
blk6:
17601762
Statements:
1761-
(v22: core::felt252) <- 3
1762-
(v23: core::felt252, v24: @core::felt252) <- snapshot(v22)
1763-
(v25: core::bool) <- core::Felt252PartialEq::eq(v4, v24)
1763+
(v24: core::felt252, v25: @core::felt252) <- snapshot(v14)
1764+
(v26: core::felt252) <- 3
1765+
(v27: core::felt252, v28: @core::felt252) <- snapshot(v26)
1766+
(v29: core::bool) <- core::Felt252PartialEq::eq(v25, v28)
17641767
End:
1765-
Match(match_enum(v25) {
1766-
bool::False(v29) => blk8,
1767-
bool::True(v26) => blk7,
1768+
Match(match_enum(v29) {
1769+
bool::False(v33) => blk8,
1770+
bool::True(v30) => blk7,
17681771
})
17691772

17701773
blk7:
17711774
Statements:
1772-
(v28: core::felt252, v27: core::internal::LoopResult::<core::bool, core::integer::u32>) <- test::foo[37-253](v2)
1775+
(v32: core::felt252, v31: core::internal::LoopResult::<core::bool, core::integer::u32>) <- test::foo[37-253](v2)
17731776
End:
1774-
Return(v28, v27)
1777+
Return(v32, v31)
17751778

17761779
blk8:
17771780
Statements:
@@ -1780,9 +1783,9 @@ End:
17801783

17811784
blk9:
17821785
Statements:
1783-
(v31: core::felt252, v30: core::internal::LoopResult::<core::bool, core::integer::u32>) <- test::foo[37-253](v2)
1786+
(v35: core::felt252, v34: core::internal::LoopResult::<core::bool, core::integer::u32>) <- test::foo[37-253](v2)
17841787
End:
1785-
Return(v31, v30)
1788+
Return(v35, v34)
17861789

17871790

17881791
Final lowering:
@@ -2242,37 +2245,38 @@ End:
22422245

22432246
blk5:
22442247
Statements:
2245-
(v15: core::internal::LoopResult::<(), core::integer::u32>) <- test::foo[127-237](v6)
2248+
(v15: core::integer::u32, v16: @core::integer::u32) <- snapshot(v5)
2249+
(v17: core::internal::LoopResult::<(), core::integer::u32>) <- test::foo[127-237](v16)
22462250
End:
2247-
Match(match_enum(v15) {
2248-
LoopResult::Normal(v16) => blk6,
2249-
LoopResult::EarlyReturn(v17) => blk7,
2251+
Match(match_enum(v17) {
2252+
LoopResult::Normal(v18) => blk6,
2253+
LoopResult::EarlyReturn(v19) => blk7,
22502254
})
22512255

22522256
blk6:
22532257
Statements:
22542258
End:
2255-
Goto(blk8, {v16 -> v19})
2259+
Goto(blk8, {v18 -> v21})
22562260

22572261
blk7:
22582262
Statements:
2259-
(v18: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v17)
2263+
(v20: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v19)
22602264
End:
2261-
Return(v2, v18)
2265+
Return(v2, v20)
22622266

22632267
blk8:
22642268
Statements:
2265-
(v20: core::integer::u32) <- 6
2266-
(v21: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v20)
2269+
(v22: core::integer::u32) <- 6
2270+
(v23: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v22)
22672271
End:
2268-
Return(v2, v21)
2272+
Return(v2, v23)
22692273

22702274
blk9:
22712275
Statements:
2272-
(v22: ()) <- struct_construct()
2273-
(v23: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::Normal(v22)
2276+
(v24: ()) <- struct_construct()
2277+
(v25: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::Normal(v24)
22742278
End:
2275-
Return(v2, v23)
2279+
Return(v2, v25)
22762280

22772281

22782282
Final lowering:
@@ -2578,37 +2582,38 @@ End:
25782582

25792583
blk5:
25802584
Statements:
2581-
(v15: core::internal::LoopResult::<(), core::integer::u32>) <- test::foo[127-237](v6)
2585+
(v15: core::integer::u32, v16: @core::integer::u32) <- snapshot(v5)
2586+
(v17: core::internal::LoopResult::<(), core::integer::u32>) <- test::foo[127-237](v16)
25822587
End:
2583-
Match(match_enum(v15) {
2584-
LoopResult::Normal(v16) => blk6,
2585-
LoopResult::EarlyReturn(v17) => blk7,
2588+
Match(match_enum(v17) {
2589+
LoopResult::Normal(v18) => blk6,
2590+
LoopResult::EarlyReturn(v19) => blk7,
25862591
})
25872592

25882593
blk6:
25892594
Statements:
25902595
End:
2591-
Goto(blk8, {v16 -> v19})
2596+
Goto(blk8, {v18 -> v21})
25922597

25932598
blk7:
25942599
Statements:
2595-
(v18: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v17)
2600+
(v20: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v19)
25962601
End:
2597-
Return(v2, v18)
2602+
Return(v2, v20)
25982603

25992604
blk8:
26002605
Statements:
2601-
(v20: core::integer::u32) <- 6
2602-
(v21: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v20)
2606+
(v22: core::integer::u32) <- 6
2607+
(v23: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::EarlyReturn(v22)
26032608
End:
2604-
Return(v2, v21)
2609+
Return(v2, v23)
26052610

26062611
blk9:
26072612
Statements:
2608-
(v22: ()) <- struct_construct()
2609-
(v23: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::Normal(v22)
2613+
(v24: ()) <- struct_construct()
2614+
(v25: core::internal::LoopResult::<(), core::integer::u32>) <- LoopResult::Normal(v24)
26102615
End:
2611-
Return(v2, v23)
2616+
Return(v2, v25)
26122617

26132618

26142619
Final lowering:

0 commit comments

Comments
 (0)