authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-05-31 15:00:48-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:58-07:00
logbb526426e75ed456a7db6afa32447e5a76ac7ca1
tree8bfdcc7aac33275554b0216ade8cde0b80b2e698
parent870e3843c5736def21234ca8b7159b179985505c

InternPool: remove memoized_decl

This is neither a type nor a value. Simplifies `addStrLit` as well as the many places that switch on `InternPool.Key`. This is a partial revert of bec29b9e498e08202679aa29a45dab2a06a69a1e.

11 files changed, 31 insertions(+), 92 deletions(-)

src/InternPool.zig+1-35
......@@ -221,8 +221,6 @@ pub const Key = union(enum) {
221221 /// An instance of a union.
222222 un: Union,
223223
224 /// A declaration with a memoized value.
225 memoized_decl: MemoizedDecl,
226224 /// A comptime function call with a memoized result.
227225 memoized_call: Key.MemoizedCall,
228226
......@@ -639,11 +637,6 @@ pub const Key = union(enum) {
639637 };
640638 };
641639
642 pub const MemoizedDecl = struct {
643 val: Index,
644 decl: Module.Decl.Index,
645 };
646
647640 pub const MemoizedCall = struct {
648641 func: Module.Fn.Index,
649642 arg_values: []const Index,
......@@ -853,8 +846,6 @@ pub const Key = union(enum) {
853846 return hasher.final();
854847 },
855848
856 .memoized_decl => |x| WyhashKing.hash(seed, asBytes(&x.val)),
857
858849 .memoized_call => |memoized_call| {
859850 var hasher = std.hash.Wyhash.init(seed);
860851 std.hash.autoHash(&hasher, memoized_call.func);
......@@ -1134,11 +1125,6 @@ pub const Key = union(enum) {
11341125 a_info.is_noinline == b_info.is_noinline;
11351126 },
11361127
1137 .memoized_decl => |a_info| {
1138 const b_info = b.memoized_decl;
1139 return a_info.val == b_info.val;
1140 },
1141
11421128 .memoized_call => |a_info| {
11431129 const b_info = b.memoized_call;
11441130 return a_info.func == b_info.func and
......@@ -1197,9 +1183,7 @@ pub const Key = union(enum) {
11971183 .generic_poison => .generic_poison_type,
11981184 },
11991185
1200 .memoized_decl,
1201 .memoized_call,
1202 => unreachable,
1186 .memoized_call => unreachable,
12031187 };
12041188 }
12051189};
......@@ -1481,7 +1465,6 @@ pub const Index = enum(u32) {
14811465 },
14821466 repeated: struct { data: *Repeated },
14831467
1484 memoized_decl: struct { data: *Key.MemoizedDecl },
14851468 memoized_call: struct {
14861469 const @"data.args_len" = opaque {};
14871470 data: *MemoizedCall,
......@@ -1989,9 +1972,6 @@ pub const Tag = enum(u8) {
19891972 /// data is extra index to `Repeated`.
19901973 repeated,
19911974
1992 /// A memoized declaration value.
1993 /// data is extra index to `Key.MemoizedDecl`
1994 memoized_decl,
19951975 /// A memoized comptime function call result.
19961976 /// data is extra index to `MemoizedCall`
19971977 memoized_call,
......@@ -2004,7 +1984,6 @@ pub const Tag = enum(u8) {
20041984 const ExternFunc = Key.ExternFunc;
20051985 const Func = Key.Func;
20061986 const Union = Key.Union;
2007 const MemoizedDecl = Key.MemoizedDecl;
20081987 const TypePointer = Key.PtrType;
20091988
20101989 fn Payload(comptime tag: Tag) type {
......@@ -2082,7 +2061,6 @@ pub const Tag = enum(u8) {
20822061 .bytes => Bytes,
20832062 .aggregate => Aggregate,
20842063 .repeated => Repeated,
2085 .memoized_decl => MemoizedDecl,
20862064 .memoized_call => MemoizedCall,
20872065 };
20882066 }
......@@ -3000,7 +2978,6 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key {
30002978 .enum_literal => .{ .enum_literal = @intToEnum(NullTerminatedString, data) },
30012979 .enum_tag => .{ .enum_tag = ip.extraData(Tag.EnumTag, data) },
30022980
3003 .memoized_decl => .{ .memoized_decl = ip.extraData(Key.MemoizedDecl, data) },
30042981 .memoized_call => {
30052982 const extra = ip.extraDataTrail(MemoizedCall, data);
30062983 return .{ .memoized_call = .{
......@@ -3995,14 +3972,6 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index {
39953972 });
39963973 },
39973974
3998 .memoized_decl => |memoized_decl| {
3999 assert(memoized_decl.val != .none);
4000 ip.items.appendAssumeCapacity(.{
4001 .tag = .memoized_decl,
4002 .data = try ip.addExtra(gpa, memoized_decl),
4003 });
4004 },
4005
40063975 .memoized_call => |memoized_call| {
40073976 for (memoized_call.arg_values) |arg| assert(arg != .none);
40083977 try ip.extra.ensureUnusedCapacity(gpa, @typeInfo(MemoizedCall).Struct.fields.len +
......@@ -5005,7 +4974,6 @@ fn dumpFallible(ip: *const InternPool, arena: Allocator) anyerror!void {
50054974 .only_possible_value => 0,
50064975 .union_value => @sizeOf(Key.Union),
50074976
5008 .memoized_decl => @sizeOf(Key.MemoizedDecl),
50094977 .memoized_call => b: {
50104978 const info = ip.extraData(MemoizedCall, data);
50114979 break :b @sizeOf(MemoizedCall) + (@sizeOf(Index) * info.args_len);
......@@ -5383,7 +5351,6 @@ pub fn typeOf(ip: *const InternPool, index: Index) Index {
53835351
53845352 .float_comptime_float => .comptime_float_type,
53855353
5386 .memoized_decl => unreachable,
53875354 .memoized_call => unreachable,
53885355 },
53895356
......@@ -5624,7 +5591,6 @@ pub fn zigTypeTagOrPoison(ip: *const InternPool, index: Index) error{GenericPois
56245591 .aggregate,
56255592 .repeated,
56265593 // memoization, not types
5627 .memoized_decl,
56285594 .memoized_call,
56295595 => unreachable,
56305596 },
src/Module.zig+5
......@@ -88,6 +88,9 @@ embed_table: std.StringHashMapUnmanaged(*EmbedFile) = .{},
8888/// Stores all Type and Value objects; periodically garbage collected.
8989intern_pool: InternPool = .{},
9090
91/// This is currently only used for string literals.
92memoized_decls: std.AutoHashMapUnmanaged(InternPool.Index, Decl.Index) = .{},
93
9194/// The set of all the generic function instantiations. This is used so that when a generic
9295/// function is called twice with the same comptime parameter arguments, both calls dispatch
9396/// to the same function.
......@@ -561,6 +564,7 @@ pub const Decl = struct {
561564 }
562565 mod.destroyFunc(func);
563566 }
567 _ = mod.memoized_decls.remove(decl.val.ip_index);
564568 if (decl.value_arena) |value_arena| {
565569 value_arena.deinit(gpa);
566570 decl.value_arena = null;
......@@ -3285,6 +3289,7 @@ pub fn deinit(mod: *Module) void {
32853289 mod.namespaces_free_list.deinit(gpa);
32863290 mod.allocated_namespaces.deinit(gpa);
32873291
3292 mod.memoized_decls.deinit(gpa);
32883293 mod.intern_pool.deinit(gpa);
32893294}
32903295
src/Sema.zig+19-29
......@@ -5183,33 +5183,26 @@ fn zirStr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
51835183
51845184fn addStrLit(sema: *Sema, block: *Block, bytes: []const u8) CompileError!Air.Inst.Ref {
51855185 const mod = sema.mod;
5186 const memoized_decl_index = memoized: {
5187 const ty = try mod.arrayType(.{
5188 .len = bytes.len,
5189 .child = .u8_type,
5190 .sentinel = .zero_u8,
5186 const gpa = sema.gpa;
5187 const ty = try mod.arrayType(.{
5188 .len = bytes.len,
5189 .child = .u8_type,
5190 .sentinel = .zero_u8,
5191 });
5192 const val = try mod.intern(.{ .aggregate = .{
5193 .ty = ty.toIntern(),
5194 .storage = .{ .bytes = bytes },
5195 } });
5196 const gop = try mod.memoized_decls.getOrPut(gpa, val);
5197 if (!gop.found_existing) {
5198 const new_decl_index = try mod.createAnonymousDecl(block, .{
5199 .ty = ty,
5200 .val = val.toValue(),
51915201 });
5192 const val = try mod.intern(.{ .aggregate = .{
5193 .ty = ty.toIntern(),
5194 .storage = .{ .bytes = bytes },
5195 } });
5196
5197 _ = try sema.typeHasRuntimeBits(ty);
5198 const new_decl_index = try mod.createAnonymousDecl(block, .{ .ty = ty, .val = val.toValue() });
5199 errdefer mod.abortAnonDecl(new_decl_index);
5200
5201 const memoized_index = try mod.intern(.{ .memoized_decl = .{
5202 .val = val,
5203 .decl = new_decl_index,
5204 } });
5205 const memoized_decl_index = mod.intern_pool.indexToKey(memoized_index).memoized_decl.decl;
5206 if (memoized_decl_index != new_decl_index)
5207 mod.abortAnonDecl(new_decl_index)
5208 else
5209 try mod.finalizeAnonDecl(new_decl_index);
5210 break :memoized memoized_decl_index;
5211 };
5212 return sema.analyzeDeclRef(memoized_decl_index);
5202 gop.value_ptr.* = new_decl_index;
5203 try mod.finalizeAnonDecl(new_decl_index);
5204 }
5205 return sema.analyzeDeclRef(gop.value_ptr.*);
52135206}
52145207
52155208fn zirInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -32156,7 +32149,6 @@ pub fn resolveTypeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool {
3215632149 .aggregate,
3215732150 .un,
3215832151 // memoization, not types
32159 .memoized_decl,
3216032152 .memoized_call,
3216132153 => unreachable,
3216232154 },
......@@ -33666,7 +33658,6 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3366633658 .aggregate,
3366733659 .un,
3366833660 // memoization, not types
33669 .memoized_decl,
3367033661 .memoized_call,
3367133662 => unreachable,
3367233663 },
......@@ -34155,7 +34146,6 @@ pub fn typeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool {
3415534146 .aggregate,
3415634147 .un,
3415734148 // memoization, not types
34158 .memoized_decl,
3415934149 .memoized_call,
3416034150 => unreachable,
3416134151 },
src/TypedValue.zig+1-3
......@@ -279,9 +279,7 @@ pub fn print(
279279 } else try writer.writeAll("...");
280280 return writer.writeAll(" }");
281281 },
282 .memoized_decl,
283 .memoized_call,
284 => unreachable,
282 .memoized_call => unreachable,
285283 },
286284 };
287285}
src/arch/wasm/CodeGen.zig+1-3
......@@ -3255,9 +3255,7 @@ fn lowerConstant(func: *CodeGen, arg_val: Value, ty: Type) InnerError!WValue {
32553255 else => unreachable,
32563256 },
32573257 .un => return func.fail("Wasm TODO: LowerConstant for {}", .{ty.fmt(mod)}),
3258 .memoized_decl,
3259 .memoized_call,
3260 => unreachable,
3258 .memoized_call => unreachable,
32613259 }
32623260}
32633261
src/codegen.zig+1-3
......@@ -610,9 +610,7 @@ pub fn generateSymbol(
610610 }
611611 }
612612 },
613 .memoized_decl,
614 .memoized_call,
615 => unreachable,
613 .memoized_call => unreachable,
616614 }
617615 return .ok;
618616}
src/codegen/c.zig-1
......@@ -925,7 +925,6 @@ pub const DeclGen = struct {
925925 .error_set_type,
926926 .inferred_error_set_type,
927927 // memoization, not values
928 .memoized_decl,
929928 .memoized_call,
930929 => unreachable,
931930
src/codegen/llvm.zig+1-3
......@@ -3796,9 +3796,7 @@ pub const DeclGen = struct {
37963796 return llvm_union_ty.constNamedStruct(&fields, fields_len);
37973797 }
37983798 },
3799 .memoized_decl,
3800 .memoized_call,
3801 => unreachable,
3799 .memoized_call => unreachable,
38023800 }
38033801 }
38043802
src/codegen/spirv.zig+1-3
......@@ -831,9 +831,7 @@ pub const DeclGen = struct {
831831
832832 try self.addUndef(layout.padding);
833833 },
834 .memoized_decl,
835 .memoized_call,
836 => unreachable,
834 .memoized_call => unreachable,
837835 }
838836 }
839837 };
src/type.zig-9
......@@ -446,7 +446,6 @@ pub const Type = struct {
446446 .aggregate,
447447 .un,
448448 // memoization, not types
449 .memoized_decl,
450449 .memoized_call,
451450 => unreachable,
452451 }
......@@ -663,7 +662,6 @@ pub const Type = struct {
663662 .aggregate,
664663 .un,
665664 // memoization, not types
666 .memoized_decl,
667665 .memoized_call,
668666 => unreachable,
669667 },
......@@ -773,7 +771,6 @@ pub const Type = struct {
773771 .aggregate,
774772 .un,
775773 // memoization, not types
776 .memoized_decl,
777774 .memoized_call,
778775 => unreachable,
779776 };
......@@ -1108,7 +1105,6 @@ pub const Type = struct {
11081105 .aggregate,
11091106 .un,
11101107 // memoization, not types
1111 .memoized_decl,
11121108 .memoized_call,
11131109 => unreachable,
11141110 },
......@@ -1526,7 +1522,6 @@ pub const Type = struct {
15261522 .aggregate,
15271523 .un,
15281524 // memoization, not types
1529 .memoized_decl,
15301525 .memoized_call,
15311526 => unreachable,
15321527 },
......@@ -1761,7 +1756,6 @@ pub const Type = struct {
17611756 .aggregate,
17621757 .un,
17631758 // memoization, not types
1764 .memoized_decl,
17651759 .memoized_call,
17661760 => unreachable,
17671761 }
......@@ -2315,7 +2309,6 @@ pub const Type = struct {
23152309 .aggregate,
23162310 .un,
23172311 // memoization, not types
2318 .memoized_decl,
23192312 .memoized_call,
23202313 => unreachable,
23212314 },
......@@ -2666,7 +2659,6 @@ pub const Type = struct {
26662659 .aggregate,
26672660 .un,
26682661 // memoization, not types
2669 .memoized_decl,
26702662 .memoized_call,
26712663 => unreachable,
26722664 },
......@@ -2812,7 +2804,6 @@ pub const Type = struct {
28122804 .aggregate,
28132805 .un,
28142806 // memoization, not types
2815 .memoized_decl,
28162807 .memoized_call,
28172808 => unreachable,
28182809 },
src/value.zig+1-3
......@@ -478,9 +478,7 @@ pub const Value = struct {
478478 .val = un.val.toValue(),
479479 }),
480480
481 .memoized_decl,
482 .memoized_call,
483 => unreachable,
481 .memoized_call => unreachable,
484482 };
485483 }
486484