authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2023-05-17 11:24:09+03:30
committergravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2023-05-20 18:43:26+03:30
logfedc9a19e7909694fac107c3da245e08616fd6e4
tree57e7bc6dc89a86b2a17d87d8bce5b9a0f99ed42e
parent40e8c2243c139dc499298645a2b387e30ae09cba

spirv: lower get_union_tag


4 files changed, 17 insertions(+), 12 deletions(-)

src/codegen/spirv.zig+17
......@@ -1735,6 +1735,7 @@ pub const DeclGen = struct {
17351735 .slice_elem_val => try self.airSliceElemVal(inst),
17361736 .ptr_elem_ptr => try self.airPtrElemPtr(inst),
17371737
1738 .get_union_tag => try self.airGetUnionTag(inst),
17381739 .struct_field_val => try self.airStructFieldVal(inst),
17391740
17401741 .struct_field_ptr_index_0 => try self.airStructFieldPtrIndex(inst, 0),
......@@ -2320,6 +2321,22 @@ pub const DeclGen = struct {
23202321 return result_id;
23212322 }
23222323
2324 fn airGetUnionTag(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
2325 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
2326 const un_ty = self.air.typeOf(ty_op.operand);
2327
2328 const target = self.module.getTarget();
2329 const layout = un_ty.unionGetLayout(target);
2330 if (layout.tag_size == 0) return null;
2331
2332 const union_handle = try self.resolve(ty_op.operand);
2333 if (layout.payload_size == 0) return union_handle;
2334
2335 const tag_ty = un_ty.unionTagTypeSafety().?;
2336 const tag_index = @boolToInt(layout.tag_align < layout.payload_align);
2337 return try self.extractField(tag_ty, union_handle, tag_index);
2338 }
2339
23232340 fn airStructFieldVal(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
23242341 if (self.liveness.isUnused(inst)) return null;
23252342
test/behavior/enum.zig-1
......@@ -910,7 +910,6 @@ test "enum literal casting to tagged union" {
910910 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
911911 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
912912 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
913 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
914913
915914 const Arch = union(enum) {
916915 x86_64,
test/behavior/pub_enum.zig-2
......@@ -3,8 +3,6 @@ const other = @import("pub_enum/other.zig");
33const expect = @import("std").testing.expect;
44
55test "pub enum" {
6 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
7
86 try pubEnumTest(other.APubEnum.Two);
97}
108fn pubEnumTest(foo: other.APubEnum) !void {
test/behavior/union.zig-9
......@@ -272,7 +272,6 @@ test "comparison between union and enum literal" {
272272 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
273273 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
274274 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
275 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
276275
277276 try testComparison();
278277 comptime try testComparison();
......@@ -288,7 +287,6 @@ test "cast union to tag type of union" {
288287 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
289288 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
290289 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
291 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
292290
293291 try testCastUnionToTag();
294292 comptime try testCastUnionToTag();
......@@ -309,7 +307,6 @@ test "cast tag type of union to union" {
309307 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
310308 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
311309 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
312 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
313310
314311 var x: Value2 = Letter2.B;
315312 try expect(@as(Letter2, x) == Letter2.B);
......@@ -325,7 +322,6 @@ test "implicit cast union to its tag type" {
325322 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
326323 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
327324 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
328 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
329325
330326 var x: Value2 = Letter2.B;
331327 try expect(x == Letter2.B);
......@@ -422,7 +418,6 @@ test "tagged union with no payloads" {
422418
423419test "union with only 1 field casted to its enum type" {
424420 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
425 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
426421
427422 const Literal = union(enum) {
428423 Number: f64,
......@@ -736,7 +731,6 @@ test "@enumToInt works on unions" {
736731 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
737732 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
738733 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
739 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
740734
741735 const Bar = union(enum) {
742736 A: bool,
......@@ -959,7 +953,6 @@ test "function call result coerces from tagged union to the tag" {
959953 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
960954 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
961955 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
962 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
963956
964957 const S = struct {
965958 const Arch = union(enum) {
......@@ -1467,8 +1460,6 @@ test "packed union in packed struct" {
14671460}
14681461
14691462test "Namespace-like union" {
1470 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1471
14721463 const DepType = enum {
14731464 git,
14741465 http,