Skip to content

Commit 00b5ffa

Browse files
committed
Remove redundant region storage from nodes
1 parent 0e3c6fa commit 00b5ffa

File tree

7 files changed

+115
-214
lines changed

7 files changed

+115
-214
lines changed

src/check/canonicalize.zig

Lines changed: 41 additions & 77 deletions
Large diffs are not rendered by default.

src/check/canonicalize/CIR.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ pub const Def = struct {
710710

711711
var node = SExpr.init(gpa, kind);
712712

713-
var pattern_node = ir.store.getPattern(self.pattern).toSExpr(ir);
713+
var pattern_node = ir.store.getPattern(self.pattern).toSExpr(ir, self.pattern);
714714
node.appendNode(gpa, &pattern_node);
715715

716716
var expr_node = ir.store.getExpr(self.expr).toSExpr(ir);
@@ -1075,10 +1075,10 @@ pub fn toSexprTypes(ir: *CIR, maybe_expr_idx: ?Expr.Idx, source: []const u8) SEx
10751075
// Extract identifier name from the pattern (assuming it's an assign pattern)
10761076
const pattern = ir.store.getPattern(def.pattern);
10771077
switch (pattern) {
1078-
.assign => |assign_pat| {
1078+
.assign => |_| {
10791079
var def_node = SExpr.init(gpa, "patt");
10801080

1081-
ir.appendRegionInfoToSexprNodeFromRegion(&def_node, assign_pat.region);
1081+
ir.appendRegionInfoToSexprNode(&def_node, def_idx);
10821082

10831083
// Get the type variable for this definition
10841084
// Each definition has a type_var at its node index which represents the type of the definition

src/check/canonicalize/Expression.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ pub const Expr = union(enum) {
715715
// Handle args span
716716
var args_node = SExpr.init(gpa, "args");
717717
for (ir.store.slicePatterns(lambda_expr.args)) |arg_idx| {
718-
var pattern_node = ir.store.getPattern(arg_idx).toSExpr(ir);
718+
var pattern_node = ir.store.getPattern(arg_idx).toSExpr(ir, arg_idx);
719719
args_node.appendNode(gpa, &pattern_node);
720720
}
721721
node.appendNode(gpa, &args_node);
@@ -837,7 +837,7 @@ pub const Expr = union(enum) {
837837
for (patterns_slice) |branch_pat_idx| {
838838
const branch_pat = ir.store.getMatchBranchPattern(branch_pat_idx);
839839
const pattern = ir.store.getPattern(branch_pat.pattern);
840-
var pattern_sexpr = pattern.toSExpr(ir);
840+
var pattern_sexpr = pattern.toSExpr(ir, branch_pat.pattern);
841841
pattern_sexpr.appendBoolAttr(gpa, "degenerate", branch_pat.degenerate);
842842
patterns_node.appendNode(gpa, &pattern_sexpr);
843843
}

src/check/canonicalize/NodeStore.zig

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ comptime {
138138
}
139139

140140
/// Helper function to get a region by node index, handling the type conversion
141-
fn getRegionAt(store: *const NodeStore, node_idx: Node.Idx) Region {
141+
pub fn getRegionAt(store: *const NodeStore, node_idx: Node.Idx) Region {
142142
const idx: Region.Idx = @enumFromInt(@intFromEnum(node_idx));
143143
return store.regions.get(idx).*;
144144
}
@@ -731,14 +731,12 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
731731
.pattern_identifier => return CIR.Pattern{
732732
.assign = .{
733733
.ident = @bitCast(node.data_1),
734-
.region = store.getRegionAt(node_idx),
735734
},
736735
},
737736
.pattern_as => return CIR.Pattern{
738737
.as = .{
739738
.ident = @bitCast(node.data_1),
740739
.pattern = @enumFromInt(node.data_2),
741-
.region = store.getRegionAt(node_idx),
742740
},
743741
},
744742
.pattern_applied_tag => {
@@ -752,7 +750,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
752750

753751
return CIR.Pattern{
754752
.applied_tag = .{
755-
.region = store.getRegionAt(node_idx),
756753
.arguments = DataSpan.init(arguments_start, arguments_len).as(CIR.Pattern.Span),
757754
.tag_name = tag_name,
758755
.ext_var = ext_var,
@@ -770,7 +767,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
770767

771768
return CIR.Pattern{
772769
.record_destructure = .{
773-
.region = store.getRegionAt(node_idx),
774770
.destructs = DataSpan.init(destructs_start, destructs_len).as(CIR.Pattern.RecordDestruct.Span),
775771
.ext_var = ext_var,
776772
.whole_var = whole_var,
@@ -803,7 +799,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
803799

804800
return CIR.Pattern{
805801
.list = .{
806-
.region = store.getRegionAt(node_idx),
807802
.patterns = DataSpan.init(patterns_start, patterns_len).as(CIR.Pattern.Span),
808803
.elem_var = elem_var,
809804
.list_var = list_var,
@@ -813,7 +808,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
813808
},
814809
.pattern_tuple => return CIR.Pattern{
815810
.tuple = .{
816-
.region = store.getRegionAt(node_idx),
817811
.patterns = DataSpan.init(node.data_1, node.data_2).as(CIR.Pattern.Span),
818812
},
819813
},
@@ -824,7 +818,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
824818

825819
return CIR.Pattern{
826820
.int_literal = .{
827-
.region = store.getRegionAt(node_idx),
828821
.value = .{ .bytes = @bitCast(value_as_i128), .kind = .i128 },
829822
},
830823
};
@@ -836,7 +829,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
836829

837830
return CIR.Pattern{
838831
.int_literal = .{
839-
.region = store.getRegionAt(node_idx),
840832
.value = .{ .bytes = @bitCast(value_as_i128), .kind = .i128 },
841833
},
842834
};
@@ -848,7 +840,6 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
848840

849841
return CIR.Pattern{
850842
.dec_literal = .{
851-
.region = store.getRegionAt(node_idx),
852843
.value = RocDec{ .num = value_as_i128 },
853844
},
854845
};
@@ -862,14 +853,12 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
862853

863854
return CIR.Pattern{
864855
.small_dec_literal = .{
865-
.region = store.getRegionAt(node_idx),
866856
.numerator = numerator,
867857
.denominator_power_of_ten = denominator_power_of_ten,
868858
},
869859
};
870860
},
871861
.pattern_str_literal => return CIR.Pattern{ .str_literal = .{
872-
.region = store.getRegionAt(node_idx),
873862
.literal = @enumFromInt(node.data_1),
874863
} },
875864
.pattern_char_literal => {
@@ -883,20 +872,16 @@ pub fn getPattern(store: *const NodeStore, pattern_idx: CIR.Pattern.Idx) CIR.Pat
883872

884873
return CIR.Pattern{
885874
.char_literal = .{
886-
.region = store.getRegionAt(node_idx),
887875
.num_var = num_var,
888876
.requirements = .{ .sign_needed = sign_needed, .bits_needed = bits_needed },
889877
.value = value,
890878
},
891879
};
892880
},
893-
.pattern_underscore => return CIR.Pattern{ .underscore = .{
894-
.region = store.getRegionAt(node_idx),
895-
} },
881+
.pattern_underscore => return CIR.Pattern{ .underscore = .{} },
896882
.malformed => {
897883
return CIR.Pattern{ .runtime_error = .{
898884
.diagnostic = @enumFromInt(node.data_1),
899-
.region = store.getRegionAt(node_idx),
900885
} };
901886
},
902887
else => {
@@ -1472,7 +1457,7 @@ pub fn addRecordField(store: *NodeStore, recordField: CIR.RecordField) CIR.Recor
14721457
}
14731458

14741459
/// Adds a record destructuring to the store.
1475-
pub fn addRecordDestruct(store: *NodeStore, record_destruct: CIR.Pattern.RecordDestruct) CIR.Pattern.RecordDestruct.Idx {
1460+
pub fn addRecordDestruct(store: *NodeStore, record_destruct: CIR.Pattern.RecordDestruct, region: base.Region) CIR.Pattern.RecordDestruct.Idx {
14761461
var node = Node{
14771462
.data_1 = @bitCast(record_destruct.label),
14781463
.data_2 = @bitCast(record_destruct.ident),
@@ -1498,7 +1483,7 @@ pub fn addRecordDestruct(store: *NodeStore, record_destruct: CIR.Pattern.RecordD
14981483
}
14991484

15001485
const nid = store.nodes.append(store.gpa, node);
1501-
_ = store.regions.append(store.gpa, record_destruct.region);
1486+
_ = store.regions.append(store.gpa, region);
15021487
return @enumFromInt(@intFromEnum(nid));
15031488
}
15041489

@@ -1593,30 +1578,26 @@ pub fn addWhereClause(store: *NodeStore, whereClause: CIR.WhereClause) CIR.Where
15931578
}
15941579

15951580
/// Adds a pattern to the store.
1596-
pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Error!CIR.Pattern.Idx {
1581+
pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern, region: base.Region) std.mem.Allocator.Error!CIR.Pattern.Idx {
15971582
var node = Node{
15981583
.data_1 = 0,
15991584
.data_2 = 0,
16001585
.data_3 = 0,
16011586
.tag = @enumFromInt(0),
16021587
};
1603-
var region = base.Region.zero();
16041588

16051589
switch (pattern) {
16061590
.assign => |p| {
16071591
node.data_1 = @bitCast(p.ident);
16081592
node.tag = .pattern_identifier;
1609-
region = p.region;
16101593
},
16111594
.as => |p| {
16121595
node.tag = .pattern_as;
1613-
region = p.region;
16141596
node.data_1 = @bitCast(p.ident);
16151597
node.data_2 = @intFromEnum(p.pattern);
16161598
},
16171599
.applied_tag => |p| {
16181600
node.tag = .pattern_applied_tag;
1619-
region = p.region;
16201601

16211602
// Store applied tag data in extra_data
16221603
const extra_data_start = @as(u32, @intCast(store.extra_data.items.len));
@@ -1628,7 +1609,6 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
16281609
},
16291610
.record_destructure => |p| {
16301611
node.tag = .pattern_record_destructure;
1631-
region = p.region;
16321612

16331613
// Store record destructure data in extra_data
16341614
const extra_data_start = @as(u32, @intCast(store.extra_data.items.len));
@@ -1640,7 +1620,6 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
16401620
},
16411621
.list => |p| {
16421622
node.tag = .pattern_list;
1643-
region = p.region;
16441623

16451624
// Store list pattern data in extra_data
16461625
const extra_data_start = @as(u32, @intCast(store.extra_data.items.len));
@@ -1667,13 +1646,11 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
16671646
},
16681647
.tuple => |p| {
16691648
node.tag = .pattern_tuple;
1670-
region = p.region;
16711649
node.data_1 = p.patterns.span.start;
16721650
node.data_2 = p.patterns.span.len;
16731651
},
16741652
.int_literal => |p| {
16751653
node.tag = .pattern_int_literal;
1676-
region = p.region;
16771654
// Store the value in extra_data
16781655
const extra_data_start = store.extra_data.items.len;
16791656
const value_as_u32s: [4]u32 = @bitCast(p.value.bytes);
@@ -1684,7 +1661,6 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
16841661
},
16851662
.small_dec_literal => |p| {
16861663
node.tag = .pattern_small_dec_literal;
1687-
region = p.region;
16881664
// Pack small dec data into data_1 and data_3
16891665
// data_1: numerator (i16) - fits in lower 16 bits
16901666
// data_3: denominator_power_of_ten (u8) in lower 8 bits
@@ -1693,7 +1669,6 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
16931669
},
16941670
.dec_literal => |p| {
16951671
node.tag = .pattern_dec_literal;
1696-
region = p.region;
16971672
// Store the RocDec value in extra_data
16981673
const extra_data_start = store.extra_data.items.len;
16991674
const value_as_u32s: [4]u32 = @bitCast(p.value.num);
@@ -1704,12 +1679,10 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
17041679
},
17051680
.str_literal => |p| {
17061681
node.tag = .pattern_str_literal;
1707-
region = p.region;
17081682
node.data_1 = @intFromEnum(p.literal);
17091683
},
17101684
.char_literal => |p| {
17111685
node.tag = .pattern_char_literal;
1712-
region = p.region;
17131686

17141687
// Store char literal data in extra_data
17151688
const extra_data_start = @as(u32, @intCast(store.extra_data.items.len));
@@ -1719,13 +1692,11 @@ pub fn addPattern(store: *NodeStore, pattern: CIR.Pattern) std.mem.Allocator.Err
17191692
try store.extra_data.append(store.gpa, @intFromEnum(p.requirements.bits_needed));
17201693
node.data_1 = extra_data_start;
17211694
},
1722-
.underscore => |p| {
1695+
.underscore => |_| {
17231696
node.tag = .pattern_underscore;
1724-
region = p.region;
17251697
},
17261698
.runtime_error => |e| {
17271699
node.tag = .malformed;
1728-
region = e.region;
17291700
node.data_1 = @intFromEnum(e.diagnostic);
17301701
},
17311702
}
@@ -1978,7 +1949,6 @@ pub fn getRecordDestruct(store: *const NodeStore, idx: CIR.Pattern.RecordDestruc
19781949
return CIR.Pattern.RecordDestruct{
19791950
.label = @bitCast(node.data_1),
19801951
.ident = @bitCast(node.data_2),
1981-
.region = store.getRegionAt(node_idx),
19821952
.kind = kind,
19831953
};
19841954
}

0 commit comments

Comments
 (0)