diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-12-03 21:03:10 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-12-04 15:57:40 -0700 |
| commit | cc8bcae8c0e7883423a9fec2c9bc19703538cb9f (patch) | |
| tree | ccd8b40d6497ffdcf4ff8fffa0cbe6149b256d79 /src | |
| parent | 4a6deaff5f4d57641b794071eb60629faa9f393a (diff) | |
| download | zig-cc8bcae8c0e7883423a9fec2c9bc19703538cb9f.tar.gz zig-cc8bcae8c0e7883423a9fec2c9bc19703538cb9f.zip | |
CBE: fix liveness issue with wrapping optionals
Diffstat (limited to 'src')
| -rw-r--r-- | src/codegen/c.zig | 18 |
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" }); |
