From 5cf5cb8fbf3c53d28c40cb682d5a3bf3db583922 Mon Sep 17 00:00:00 2001 From: Mathias Magnusson Date: Mon, 2 Jun 2025 21:12:52 +0200 Subject: stop freeing vregs twice when they are used twice in an instr --- src/compile.zig | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/compile.zig') diff --git a/src/compile.zig b/src/compile.zig index c352994..acae7ff 100644 --- a/src/compile.zig +++ b/src/compile.zig @@ -84,10 +84,11 @@ pub const Block = struct { fn init(allocator: Allocator, instrs: []Instr) !Block { var vreg_last_use: std.AutoHashMap(usize, std.ArrayList(VReg)) = .init(allocator); for (0.., instrs) |i, instr| { + const kv = try vreg_last_use.getOrPut(i); + if (!kv.found_existing) kv.value_ptr.* = .init(allocator); for (instr.sources().slice()) |src| { - const kv = try vreg_last_use.getOrPut(i); - if (!kv.found_existing) kv.value_ptr.* = .init(allocator); - try kv.value_ptr.append(src); + if (std.mem.indexOfScalar(VReg, kv.value_ptr.items, src) == null) + try kv.value_ptr.append(src); } } return .{ -- cgit v1.2.3