diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 63 |
1 files changed, 27 insertions, 36 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 4858b4447b..8dec6e18e1 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -83,7 +83,6 @@ end_di_column: u32, epilogue_relocs: std.ArrayListUnmanaged(Mir.Inst.Index) = .empty, reused_operands: std.StaticBitSet(Liveness.bpi - 1) = undefined, -const_tracking: ConstTrackingMap = .empty, inst_tracking: InstTrackingMap = .empty, // Key is the block instruction @@ -926,7 +925,6 @@ pub fn generate( while (block_it.next()) |block| block.deinit(gpa); function.blocks.deinit(gpa); function.inst_tracking.deinit(gpa); - function.const_tracking.deinit(gpa); function.epilogue_relocs.deinit(gpa); function.mir_instructions.deinit(gpa); function.mir_extra.deinit(gpa); @@ -108991,40 +108989,35 @@ fn resolveInst(self: *CodeGen, ref: Air.Inst.Ref) InnerError!MCValue { // If the type has no codegen bits, no need to store it. if (!ty.hasRuntimeBitsIgnoreComptime(zcu)) return .none; - const mcv = if (ref.toIndex()) |inst| mcv: { + const mcv: MCValue = if (ref.toIndex()) |inst| mcv: { break :mcv self.inst_tracking.getPtr(inst).?.short; } else mcv: { - const ip_index = ref.toInterned().?; - const gop = try self.const_tracking.getOrPut(self.gpa, ip_index); - if (!gop.found_existing) gop.value_ptr.* = .init(init: { - const const_mcv = try self.genTypedValue(.fromInterned(ip_index)); - switch (const_mcv) { - .lea_tlv => |tlv_sym| switch (self.bin_file.tag) { - .elf, .macho => { - if (self.mod.pic) { - try self.spillRegisters(&.{ .rdi, .rax }); - } else { - try self.spillRegisters(&.{.rax}); - } - const frame_index = try self.allocFrameIndex(.init(.{ - .size = 8, - .alignment = .@"8", - })); - try self.genSetMem( - .{ .frame = frame_index }, - 0, - .usize, - .{ .lea_symbol = .{ .sym_index = tlv_sym } }, - .{}, - ); - break :init .{ .load_frame = .{ .index = frame_index } }; - }, - else => break :init const_mcv, + const const_mcv = try self.genTypedValue(.fromInterned(ref.toInterned().?)); + switch (const_mcv) { + .lea_tlv => |tlv_sym| switch (self.bin_file.tag) { + .elf, .macho => { + if (self.mod.pic) { + try self.spillRegisters(&.{ .rdi, .rax }); + } else { + try self.spillRegisters(&.{.rax}); + } + const frame_index = try self.allocFrameIndex(.init(.{ + .size = 8, + .alignment = .@"8", + })); + try self.genSetMem( + .{ .frame = frame_index }, + 0, + .usize, + .{ .lea_symbol = .{ .sym_index = tlv_sym } }, + .{}, + ); + break :mcv .{ .load_frame = .{ .index = frame_index } }; }, - else => break :init const_mcv, - } - }); - break :mcv gop.value_ptr.short; + else => break :mcv const_mcv, + }, + else => break :mcv const_mcv, + } }; switch (mcv) { @@ -115260,8 +115253,7 @@ fn tempFromOperand(cg: *CodeGen, op_ref: Air.Inst.Ref, op_dies: bool) InnerError if (op_ref.toIndex()) |op_inst| return .{ .index = op_inst }; const val = op_ref.toInterned().?; - const gop = try cg.const_tracking.getOrPut(cg.gpa, val); - if (!gop.found_existing) gop.value_ptr.* = .init(init: { + return cg.tempInit(.fromInterned(ip.typeOf(val)), init: { const const_mcv = try cg.genTypedValue(.fromInterned(val)); switch (const_mcv) { .lea_tlv => |tlv_sym| switch (cg.bin_file.tag) { @@ -115289,7 +115281,6 @@ fn tempFromOperand(cg: *CodeGen, op_ref: Air.Inst.Ref, op_dies: bool) InnerError else => break :init const_mcv, } }); - return cg.tempInit(.fromInterned(ip.typeOf(val)), gop.value_ptr.short); } fn tempsFromOperandsInner( |
