From e5d5c1d423c73c94d6c3e9d26bd904eb3807b489 Mon Sep 17 00:00:00 2001 From: Ali Chraghi Date: Wed, 18 Oct 2023 02:30:25 +0330 Subject: [PATCH] spirv: switch on bool --- src/codegen/spirv.zig | 8 +++++--- test/behavior/basic.zig | 1 - test/behavior/inline_switch.zig | 1 - test/behavior/switch.zig | 1 - 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 2c9018463df64e3ef085e3669bff3b3166f4b181..21febeb01d2528f68ca162538603044e55a35bc3 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -4098,11 +4098,13 @@ const DeclGen = struct { fn airSwitchBr(self: *DeclGen, inst: Air.Inst.Index) !void { const mod = self.module; const pl_op = self.air.instructions.items(.data)[inst].pl_op; - const cond = try self.resolve(pl_op.operand); const cond_ty = self.typeOf(pl_op.operand); + const cond = try self.resolve(pl_op.operand); + const cond_indirect = try self.convertToIndirect(cond_ty, cond); const switch_br = self.air.extraData(Air.SwitchBr, pl_op.payload); const cond_words: u32 = switch (cond_ty.zigTypeTag(mod)) { + .Bool => 1, .Int => blk: { const bits = cond_ty.intInfo(mod).bits; const backing_bits = self.backingIntBits(bits) orelse { @@ -4146,7 +4148,7 @@ const DeclGen = struct { // Emit the instruction before generating the blocks. try self.func.body.emitRaw(self.spv.gpa, .OpSwitch, 2 + (cond_words + 1) * num_conditions); - self.func.body.writeOperand(IdRef, cond); + self.func.body.writeOperand(IdRef, cond_indirect); self.func.body.writeOperand(IdRef, default); // Emit each of the cases @@ -4167,7 +4169,7 @@ const DeclGen = struct { return self.todo("switch on runtime value???", .{}); }; const int_val = switch (cond_ty.zigTypeTag(mod)) { - .Int => if (cond_ty.isSignedInt(mod)) @as(u64, @bitCast(value.toSignedInt(mod))) else value.toUnsignedInt(mod), + .Bool, .Int => if (cond_ty.isSignedInt(mod)) @as(u64, @bitCast(value.toSignedInt(mod))) else value.toUnsignedInt(mod), .Enum => blk: { // TODO: figure out of cond_ty is correct (something with enum literals) break :blk (try value.intFromEnum(cond_ty, mod)).toUnsignedInt(mod); // TODO: composite integer constants diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index b85f2e6d2bf033e8e8072c298efbfb5cd959be70..3b27e93402b432d0eec359b1fc90a5a887d7e802 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -715,7 +715,6 @@ test "result location is optional inside error union" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; const x = maybe(true) catch unreachable; try expect(x.? == 42); diff --git a/test/behavior/inline_switch.zig b/test/behavior/inline_switch.zig index 305b898bfc35814db265648dd2d0d1605ee70556..deb4518820cfca5ecc733f5d328e0d8f8bd0d405 100644 --- a/test/behavior/inline_switch.zig +++ b/test/behavior/inline_switch.zig @@ -72,7 +72,6 @@ test "inline switch unions" { test "inline else bool" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; var a = true; switch (a) { diff --git a/test/behavior/switch.zig b/test/behavior/switch.zig index df4d2af7d0e706bed3092f5fe0604239c491018d..d7d2f8f7b66bf67ca151c2b2238030b515440769 100644 --- a/test/behavior/switch.zig +++ b/test/behavior/switch.zig @@ -118,7 +118,6 @@ fn trueIfBoolFalseOtherwise(comptime T: type) bool { test "switching on booleans" { if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; try testSwitchOnBools(); try comptime testSwitchOnBools(); -- 2.54.0