Commit 40b5bb7161

Jacob Young <jacobly0@users.noreply.github.com>
2022-10-08 18:37:05
cbe: fix loads and stores of 0-bit types
1 parent 962f33e
Changed files (2)
src
codegen
test
src/codegen/c.zig
@@ -2409,10 +2409,11 @@ fn airLoad(f: *Function, inst: Air.Inst.Index) !CValue {
     const ty_op = f.air.instructions.items(.data)[inst].ty_op;
     const is_volatile = f.air.typeOf(ty_op.operand).isVolatilePtr();
 
-    if (!is_volatile and f.liveness.isUnused(inst))
+    const inst_ty = f.air.typeOfIndex(inst);
+    if (!inst_ty.hasRuntimeBitsIgnoreComptime() or
+        !is_volatile and f.liveness.isUnused(inst))
         return CValue.none;
 
-    const inst_ty = f.air.typeOfIndex(inst);
     const is_array = inst_ty.zigTypeTag() == .Array;
     const operand = try f.resolveInst(ty_op.operand);
     const writer = f.object.writer();
@@ -2565,9 +2566,11 @@ fn airStoreUndefined(f: *Function, dest_ptr: CValue) !CValue {
 fn airStore(f: *Function, inst: Air.Inst.Index) !CValue {
     // *a = b;
     const bin_op = f.air.instructions.items(.data)[inst].bin_op;
+    const lhs_child_type = f.air.typeOf(bin_op.lhs).childType();
+    if (!lhs_child_type.hasRuntimeBitsIgnoreComptime()) return CValue.none;
+
     const dest_ptr = try f.resolveInst(bin_op.lhs);
     const src_val = try f.resolveInst(bin_op.rhs);
-    const lhs_child_type = f.air.typeOf(bin_op.lhs).childType();
 
     // TODO Sema should emit a different instruction when the store should
     // possibly do the safety 0xaa bytes for undefined.
test/behavior/empty_union.zig
@@ -3,7 +3,6 @@ const std = @import("std");
 const expect = std.testing.expect;
 
 test "switch on empty enum" {
-    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
 
     const E = enum {};
@@ -29,7 +28,6 @@ test "switch on empty auto numbered tagged union" {
 }
 
 test "switch on empty tagged union" {
-    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO