authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-12-03 21:03:10-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-12-04 15:57:40-07:00
logcc8bcae8c0e7883423a9fec2c9bc19703538cb9f
treeccd8b40d6497ffdcf4ff8fffa0cbe6149b256d79
parent4a6deaff5f4d57641b794071eb60629faa9f393a

CBE: fix liveness issue with wrapping optionals


1 files changed, 12 insertions(+), 6 deletions(-)

src/codegen/c.zig+12-6
......@@ -5324,14 +5324,22 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue {
53245324
53255325 const inst_ty = f.air.typeOfIndex(inst);
53265326 const payload = try f.resolveInst(ty_op.operand);
5327 if (inst_ty.optionalReprIsPayload()) return payload;
5327 try reap(f, inst, &.{ty_op.operand});
5328 const writer = f.object.writer();
5329
5330 if (inst_ty.optionalReprIsPayload()) {
5331 const local = try f.allocLocal(inst, inst_ty);
5332 try f.writeCValue(writer, local, .Other);
5333 try writer.writeAll(" = ");
5334 try f.writeCValue(writer, payload, .Other);
5335 try writer.writeAll(";\n");
5336 return local;
5337 }
53285338
53295339 const payload_ty = f.air.typeOf(ty_op.operand);
53305340 const target = f.object.dg.module.getTarget();
53315341 const is_array = lowersToArray(payload_ty, target);
53325342
5333 try reap(f, inst, &.{ty_op.operand});
5334 const writer = f.object.writer();
53355343 const local = try f.allocLocal(inst, inst_ty);
53365344 if (!is_array) {
53375345 try f.writeCValue(writer, local, .Other);
......@@ -5340,9 +5348,7 @@ fn airWrapOptional(f: *Function, inst: Air.Inst.Index) !CValue {
53405348 try writer.writeAll("; ");
53415349 }
53425350 try f.writeCValue(writer, local, .Other);
5343 try writer.writeAll(".is_null = ");
5344 try f.object.dg.renderValue(writer, Type.bool, Value.false, .Initializer);
5345 try writer.writeAll(";\n");
5351 try writer.writeAll(".is_null = false;\n");
53465352 if (is_array) {
53475353 try writer.writeAll("memcpy(");
53485354 try f.writeCValueMember(writer, local, .{ .identifier = "payload" });