authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-14 17:56:34-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 03:07:51-04:00
log37ccf35ff207b8866b3fc433dd57d7c7d6bac710
tree5521263cdd35192cff1e93c527c5228927a5789f
parent037bf1a580fe24b427e0ee5f7aecfec7202c1bf3

x86_64: fix struct_field_val crash


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

src/arch/x86_64/CodeGen.zig+3-2
...@@ -5411,6 +5411,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -5411,6 +5411,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
5411 const field_ty = container_ty.structFieldType(index);5411 const field_ty = container_ty.structFieldType(index);
5412 if (!field_ty.hasRuntimeBitsIgnoreComptime()) break :result .none;5412 if (!field_ty.hasRuntimeBitsIgnoreComptime()) break :result .none;
5413 const field_rc = regClassForType(field_ty);5413 const field_rc = regClassForType(field_ty);
5414 const field_is_gp = field_rc.supersetOf(gp);
54145415
5415 const src_mcv = try self.resolveInst(operand);5416 const src_mcv = try self.resolveInst(operand);
5416 const field_off = switch (container_ty.containerLayout()) {5417 const field_off = switch (container_ty.containerLayout()) {
...@@ -5443,7 +5444,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -5443,7 +5444,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
5443 return self.fail("TODO implement struct_field_val with large packed field", .{});5444 return self.fail("TODO implement struct_field_val with large packed field", .{});
5444 }5445 }
54455446
5446 const dst_reg = try self.register_manager.allocReg(inst, gp);5447 const dst_reg = try self.register_manager.allocReg(if (field_is_gp) inst else null, gp);
5447 const field_extra_bits = self.regExtraBits(field_ty);5448 const field_extra_bits = self.regExtraBits(field_ty);
5448 const load_abi_size =5449 const load_abi_size =
5449 if (field_bit_off < field_extra_bits) field_abi_size else field_abi_size * 2;5450 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 {...@@ -5494,7 +5495,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
5494 if (field_extra_bits > 0) try self.truncateRegister(field_ty, dst_reg);5495 if (field_extra_bits > 0) try self.truncateRegister(field_ty, dst_reg);
54955496
5496 const dst_mcv = MCValue{ .register = dst_reg };5497 const dst_mcv = MCValue{ .register = dst_reg };
5497 break :result if (field_rc.supersetOf(gp))5498 break :result if (field_is_gp)
5498 dst_mcv5499 dst_mcv
5499 else5500 else
5500 try self.copyToRegisterWithInstTracking(inst, field_ty, dst_mcv);5501 try self.copyToRegisterWithInstTracking(inst, field_ty, dst_mcv);