From cc8bcae8c0e7883423a9fec2c9bc19703538cb9f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 3 Dec 2022 21:03:10 -0700 Subject: CBE: fix liveness issue with wrapping optionals --- src/codegen/c.zig | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/codegen') diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 805b60b096..70780cf468 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -5324,14 +5324,22 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue { const inst_ty = f.air.typeOfIndex(inst); const payload = try f.resolveInst(ty_op.operand); - if (inst_ty.optionalReprIsPayload()) return payload; + try reap(f, inst, &.{ty_op.operand}); + const writer = f.object.writer(); + + if (inst_ty.optionalReprIsPayload()) { + const local = try f.allocLocal(inst, inst_ty); + try f.writeCValue(writer, local, .Other); + try writer.writeAll(" = "); + try f.writeCValue(writer, payload, .Other); + try writer.writeAll(";\n"); + return local; + } const payload_ty = f.air.typeOf(ty_op.operand); const target = f.object.dg.module.getTarget(); const is_array = lowersToArray(payload_ty, target); - try reap(f, inst, &.{ty_op.operand}); - const writer = f.object.writer(); const local = try f.allocLocal(inst, inst_ty); if (!is_array) { try f.writeCValue(writer, local, .Other); @@ -5340,9 +5348,7 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue { try writer.writeAll("; "); } try f.writeCValue(writer, local, .Other); - try writer.writeAll(".is_null = "); - try f.object.dg.renderValue(writer, Type.bool, Value.false, .Initializer); - try writer.writeAll(";\n"); + try writer.writeAll(".is_null = false;\n"); if (is_array) { try writer.writeAll("memcpy("); try f.writeCValueMember(writer, local, .{ .identifier = "payload" }); -- cgit v1.2.3