aboutsummaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-11-06 07:27:55 -0500
committerJacob Young <jacobly0@users.noreply.github.com>2023-11-06 14:11:31 -0500
commit9ced27dace99da1f2bc704b4d5a7fabe9a62eca4 (patch)
treeacaf279fce16c96e3efdd1fd2d648516264a9893 /src/arch
parent62e67a2b565e20f684319f5e59e1bddd79c988d3 (diff)
downloadzig-9ced27dace99da1f2bc704b4d5a7fabe9a62eca4.tar.gz
zig-9ced27dace99da1f2bc704b4d5a7fabe9a62eca4.zip
x86_64: fix passing register-sized payload as non-reigster-sized union
Closes #17885
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86_64/CodeGen.zig5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 9d4ee182c4..16a4b4a7f4 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -15323,10 +15323,11 @@ fn airUnionInit(self: *Self, inst: Air.Inst.Index) !void {
const src_ty = self.typeOf(extra.init);
const src_mcv = try self.resolveInst(extra.init);
if (layout.tag_size == 0) {
- if (self.reuseOperand(inst, extra.init, 0, src_mcv)) break :result src_mcv;
+ if (layout.abi_size <= src_ty.abiSize(mod) and
+ self.reuseOperand(inst, extra.init, 0, src_mcv)) break :result src_mcv;
const dst_mcv = try self.allocRegOrMem(inst, true);
- try self.genCopy(union_ty, dst_mcv, src_mcv);
+ try self.genCopy(src_ty, dst_mcv, src_mcv);
break :result dst_mcv;
}