diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-14 17:56:34 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-05-15 03:07:51 -0400 |
| commit | 37ccf35ff207b8866b3fc433dd57d7c7d6bac710 (patch) | |
| tree | 5521263cdd35192cff1e93c527c5228927a5789f /src | |
| parent | 037bf1a580fe24b427e0ee5f7aecfec7202c1bf3 (diff) | |
| download | zig-37ccf35ff207b8866b3fc433dd57d7c7d6bac710.tar.gz zig-37ccf35ff207b8866b3fc433dd57d7c7d6bac710.zip | |
x86_64: fix struct_field_val crash
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 51e86447dc..87e1f9e45b 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -5411,6 +5411,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { const field_ty = container_ty.structFieldType(index); if (!field_ty.hasRuntimeBitsIgnoreComptime()) break :result .none; const field_rc = regClassForType(field_ty); + const field_is_gp = field_rc.supersetOf(gp); const src_mcv = try self.resolveInst(operand); const field_off = switch (container_ty.containerLayout()) { @@ -5443,7 +5444,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { return self.fail("TODO implement struct_field_val with large packed field", .{}); } - const dst_reg = try self.register_manager.allocReg(inst, gp); + const dst_reg = try self.register_manager.allocReg(if (field_is_gp) inst else null, gp); const field_extra_bits = self.regExtraBits(field_ty); const load_abi_size = if (field_bit_off < field_extra_bits) field_abi_size else field_abi_size * 2; @@ -5494,7 +5495,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { if (field_extra_bits > 0) try self.truncateRegister(field_ty, dst_reg); const dst_mcv = MCValue{ .register = dst_reg }; - break :result if (field_rc.supersetOf(gp)) + break :result if (field_is_gp) dst_mcv else try self.copyToRegisterWithInstTracking(inst, field_ty, dst_mcv); |
