aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-12-03 21:03:10 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-12-04 15:57:40 -0700
commitcc8bcae8c0e7883423a9fec2c9bc19703538cb9f (patch)
treeccd8b40d6497ffdcf4ff8fffa0cbe6149b256d79 /src/codegen
parent4a6deaff5f4d57641b794071eb60629faa9f393a (diff)
downloadzig-cc8bcae8c0e7883423a9fec2c9bc19703538cb9f.tar.gz
zig-cc8bcae8c0e7883423a9fec2c9bc19703538cb9f.zip
CBE: fix liveness issue with wrapping optionals
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig18
1 files changed, 12 insertions, 6 deletions
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" });