authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-07-17 12:41:39-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-07-20 12:19:16-07:00
logb2733a36f8fa2379fd4e07f936a4ad22a4541c7c
treecdcc97d9d8b7f1094b7dc0630e61e1f55c9c07fe
parent761f36ff93b5c551101d7f731a136c2d66093e76

Sema: memoize decl_val instructions when result is constant


1 files changed, 18 insertions(+), 2 deletions(-)

src/Sema.zig+18-2
......@@ -45,6 +45,7 @@ branch_count: u32 = 0,
4545/// contain a mapped source location.
4646src: LazySrcLoc = .{ .token_offset = 0 },
4747next_arg_index: usize = 0,
48decl_val_table: std.AutoHashMapUnmanaged(*Decl, Air.Inst.Ref) = .{},
4849
4950const std = @import("std");
5051const mem = std.mem;
......@@ -77,6 +78,7 @@ pub fn deinit(sema: *Sema) void {
7778 sema.air_values.deinit(gpa);
7879 sema.air_variables.deinit(gpa);
7980 sema.inst_map.deinit(gpa);
81 sema.decl_val_table.deinit(gpa);
8082 sema.* = undefined;
8183}
8284
......@@ -7159,9 +7161,23 @@ fn coerceArrayPtrToMany(
71597161 return sema.mod.fail(&block.base, inst_src, "TODO implement coerceArrayPtrToMany runtime instruction", .{});
71607162}
71617163
7162fn analyzeDeclVal(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, decl: *Decl) CompileError!Air.Inst.Ref {
7164fn analyzeDeclVal(
7165 sema: *Sema,
7166 block: *Scope.Block,
7167 src: LazySrcLoc,
7168 decl: *Decl,
7169) CompileError!Air.Inst.Ref {
7170 if (sema.decl_val_table.get(decl)) |result| {
7171 return result;
7172 }
71637173 const decl_ref = try sema.analyzeDeclRef(block, src, decl);
7164 return sema.analyzeLoad(block, src, decl_ref, src);
7174 const result = try sema.analyzeLoad(block, src, decl_ref, src);
7175 if (Air.refToIndex(result)) |index| {
7176 if (sema.air_instructions.items(.tag)[index] == .constant) {
7177 sema.decl_val_table.put(sema.gpa, decl, result) catch {};
7178 }
7179 }
7180 return result;
71657181}
71667182
71677183fn analyzeDeclRef(sema: *Sema, block: *Scope.Block, src: LazySrcLoc, decl: *Decl) CompileError!Air.Inst.Ref {