authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-12 11:01:23-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-06-13 02:22:04-07:00
logb67995689df424a0cab9186fcaf7b09bb04ffc1a
treef5a860913a7133af62a18339a3f437c4c5dbb67b
parentb2cb090c3790dd10a784f9e291230cf6052b514c
signaturelock-open Commit is signed but in an unrecognized format.

riscv: add `airAggregateInit` for arrays


13 files changed, 23 insertions(+), 31 deletions(-)

src/arch/riscv64/CodeGen.zig+23-4
...@@ -3207,10 +3207,6 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {...@@ -3207,10 +3207,6 @@ fn airPtrElemPtr(self: *Self, inst: Air.Inst.Index) !void {
3207 const offset_reg_lock = self.register_manager.lockRegAssumeUnused(offset_reg);3207 const offset_reg_lock = self.register_manager.lockRegAssumeUnused(offset_reg);
3208 defer self.register_manager.unlockReg(offset_reg_lock);3208 defer self.register_manager.unlockReg(offset_reg_lock);
32093209
3210 if (true) return self.fail("TODO: airPtrElemPtr", .{});
3211
3212 // TODO: something is breaking here dunno
3213
3214 break :result try self.binOp(.ptr_add, base_ptr_mcv, base_ptr_ty, .{ .register = offset_reg }, base_ptr_ty);3210 break :result try self.binOp(.ptr_add, base_ptr_mcv, base_ptr_ty, .{ .register = offset_reg }, base_ptr_ty);
3215 };3211 };
3216 return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none });3212 return self.finishAir(inst, result, .{ extra.lhs, extra.rhs, .none });
...@@ -5864,6 +5860,29 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {...@@ -5864,6 +5860,29 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
5864 }5860 }
5865 break :result .{ .load_frame = .{ .index = frame_index } };5861 break :result .{ .load_frame = .{ .index = frame_index } };
5866 },5862 },
5863 .Array => {
5864 const elem_ty = result_ty.childType(zcu);
5865 const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, zcu));
5866 const elem_size: u32 = @intCast(elem_ty.abiSize(zcu));
5867
5868 for (elements, 0..) |elem, elem_i| {
5869 const elem_mcv = try self.resolveInst(elem);
5870 const elem_off: i32 = @intCast(elem_size * elem_i);
5871 try self.genSetMem(
5872 .{ .frame = frame_index },
5873 elem_off,
5874 elem_ty,
5875 elem_mcv,
5876 );
5877 }
5878 if (result_ty.sentinel(zcu)) |sentinel| try self.genSetMem(
5879 .{ .frame = frame_index },
5880 @intCast(elem_size * elements.len),
5881 elem_ty,
5882 try self.genTypedValue(sentinel),
5883 );
5884 break :result .{ .load_frame = .{ .index = frame_index } };
5885 },
5867 else => return self.fail("TODO: airAggregate {}", .{result_ty.fmt(zcu)}),5886 else => return self.fail("TODO: airAggregate {}", .{result_ty.fmt(zcu)}),
5868 }5887 }
5869 };5888 };
test/behavior/align.zig-1
...@@ -237,7 +237,6 @@ fn addUnalignedSlice(a: []align(1) const u32, b: []align(1) const u32) u32 {...@@ -237,7 +237,6 @@ fn addUnalignedSlice(a: []align(1) const u32, b: []align(1) const u32) u32 {
237}237}
238238
239test "specifying alignment allows pointer cast" {239test "specifying alignment allows pointer cast" {
240 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO
241 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;240 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
242 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO241 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
243242
test/behavior/array.zig-3
...@@ -346,7 +346,6 @@ test "read/write through global variable array of struct fields initialized via...@@ -346,7 +346,6 @@ test "read/write through global variable array of struct fields initialized via
346test "implicit cast single-item pointer" {346test "implicit cast single-item pointer" {
347 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;347 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
348 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO348 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
349 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
350349
351 try testImplicitCastSingleItemPtr();350 try testImplicitCastSingleItemPtr();
352 try comptime testImplicitCastSingleItemPtr();351 try comptime testImplicitCastSingleItemPtr();
...@@ -714,7 +713,6 @@ test "array of array agregate init" {...@@ -714,7 +713,6 @@ test "array of array agregate init" {
714 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO713 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
715 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO714 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
716 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO715 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
717 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
718716
719 var a = [1]u32{11} ** 10;717 var a = [1]u32{11} ** 10;
720 var b = [1][10]u32{a} ** 2;718 var b = [1][10]u32{a} ** 2;
...@@ -765,7 +763,6 @@ test "slicing array of zero-sized values" {...@@ -765,7 +763,6 @@ test "slicing array of zero-sized values" {
765 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;763 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
766 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;764 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
767 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;765 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
768 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
769 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;766 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
770767
771 var arr: [32]u0 = undefined;768 var arr: [32]u0 = undefined;
test/behavior/basic.zig-6
...@@ -688,7 +688,6 @@ test "string concatenation" {...@@ -688,7 +688,6 @@ test "string concatenation" {
688 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;688 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
689 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;689 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
690 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO690 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
691 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
692691
693 const a = "OK" ++ " IT " ++ "WORKED";692 const a = "OK" ++ " IT " ++ "WORKED";
694 const b = "OK IT WORKED";693 const b = "OK IT WORKED";
...@@ -728,7 +727,6 @@ fn maybe(x: bool) anyerror!?u32 {...@@ -728,7 +727,6 @@ fn maybe(x: bool) anyerror!?u32 {
728test "auto created variables have correct alignment" {727test "auto created variables have correct alignment" {
729 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO728 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
730 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO729 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
731 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
732730
733 const S = struct {731 const S = struct {
734 fn foo(str: [*]const u8) u32 {732 fn foo(str: [*]const u8) u32 {
...@@ -893,7 +891,6 @@ test "weird array and tuple initializations" {...@@ -893,7 +891,6 @@ test "weird array and tuple initializations" {
893 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO891 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
894 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO892 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
895 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO893 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
896 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
897894
898 const E = enum { a, b };895 const E = enum { a, b };
899 const S = struct { e: E };896 const S = struct { e: E };
...@@ -1012,7 +1009,6 @@ comptime {...@@ -1012,7 +1009,6 @@ comptime {
10121009
1013test "switch inside @as gets correct type" {1010test "switch inside @as gets correct type" {
1014 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1011 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1015 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
10161012
1017 var a: u32 = 0;1013 var a: u32 = 0;
1018 _ = &a;1014 _ = &a;
...@@ -1379,8 +1375,6 @@ test "allocation and looping over 3-byte integer" {...@@ -1379,8 +1375,6 @@ test "allocation and looping over 3-byte integer" {
1379}1375}
13801376
1381test "loading array from struct is not optimized away" {1377test "loading array from struct is not optimized away" {
1382 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1383
1384 const S = struct {1378 const S = struct {
1385 arr: [1]u32 = .{0},1379 arr: [1]u32 = .{0},
1386 fn doTheTest(self: *@This()) !void {1380 fn doTheTest(self: *@This()) !void {
test/behavior/eval.zig-1
...@@ -547,7 +547,6 @@ test "static eval list init" {...@@ -547,7 +547,6 @@ test "static eval list init" {
547 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO547 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
548 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO548 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
549 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO549 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
550 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
551550
552 try expect(static_vec3.data[2] == 1.0);551 try expect(static_vec3.data[2] == 1.0);
553 try expect(vec3(0.0, 0.0, 3.0).data[2] == 3.0);552 try expect(vec3(0.0, 0.0, 3.0).data[2] == 3.0);
test/behavior/fn.zig-1
...@@ -493,7 +493,6 @@ test "using @ptrCast on function pointers" {...@@ -493,7 +493,6 @@ test "using @ptrCast on function pointers" {
493 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO493 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
494 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO494 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
495 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;495 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
496 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
497496
498 const S = struct {497 const S = struct {
499 const A = struct { data: [4]u8 };498 const A = struct { data: [4]u8 };
test/behavior/for.zig-6
...@@ -69,7 +69,6 @@ test "basic for loop" {...@@ -69,7 +69,6 @@ test "basic for loop" {
69 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;69 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
70 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;70 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
71 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO71 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
72 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
7372
74 const expected_result = [_]u8{ 9, 8, 7, 6, 0, 1, 2, 3 } ** 3;73 const expected_result = [_]u8{ 9, 8, 7, 6, 0, 1, 2, 3 } ** 3;
7574
...@@ -134,7 +133,6 @@ test "for with null and T peer types and inferred result location type" {...@@ -134,7 +133,6 @@ test "for with null and T peer types and inferred result location type" {
134test "2 break statements and an else" {133test "2 break statements and an else" {
135 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;134 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
136 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO135 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
137 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
138136
139 const S = struct {137 const S = struct {
140 fn entry(t: bool, f: bool) !void {138 fn entry(t: bool, f: bool) !void {
...@@ -183,7 +181,6 @@ fn mangleString(s: []u8) void {...@@ -183,7 +181,6 @@ fn mangleString(s: []u8) void {
183test "for copies its payload" {181test "for copies its payload" {
184 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO182 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
185 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO183 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
186 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
187184
188 const S = struct {185 const S = struct {
189 fn doTheTest() !void {186 fn doTheTest() !void {
...@@ -283,7 +280,6 @@ test "two counters" {...@@ -283,7 +280,6 @@ test "two counters" {
283test "1-based counter and ptr to array" {280test "1-based counter and ptr to array" {
284 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
285 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO282 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
286 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
287283
288 var ok: usize = 0;284 var ok: usize = 0;
289285
...@@ -367,7 +363,6 @@ test "raw pointer and slice" {...@@ -367,7 +363,6 @@ test "raw pointer and slice" {
367 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO363 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
368 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO364 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
369 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO365 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
370 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
371366
372 var buf: [10]u8 = undefined;367 var buf: [10]u8 = undefined;
373 const slice: []const u8 = "blah";368 const slice: []const u8 = "blah";
...@@ -387,7 +382,6 @@ test "raw pointer and counter" {...@@ -387,7 +382,6 @@ test "raw pointer and counter" {
387 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO382 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
388 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO383 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
389 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO384 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
390 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
391385
392 var buf: [10]u8 = undefined;386 var buf: [10]u8 = undefined;
393 const ptr: [*]u8 = &buf;387 const ptr: [*]u8 = &buf;
test/behavior/lower_strlit_to_vector.zig-1
...@@ -6,7 +6,6 @@ test "strlit to vector" {...@@ -6,7 +6,6 @@ test "strlit to vector" {
6 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO6 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO7 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO8 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
109
11 const strlit = "0123456789abcdef0123456789ABCDEF";10 const strlit = "0123456789abcdef0123456789ABCDEF";
12 const vec_from_strlit: @Vector(32, u8) = strlit.*;11 const vec_from_strlit: @Vector(32, u8) = strlit.*;
test/behavior/pointers.zig-1
...@@ -541,7 +541,6 @@ test "pointer alignment and element type include call expression" {...@@ -541,7 +541,6 @@ test "pointer alignment and element type include call expression" {
541541
542test "pointer to array has explicit alignment" {542test "pointer to array has explicit alignment" {
543 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO543 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
544 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
545544
546 const S = struct {545 const S = struct {
547 const Base = extern struct { a: u8 };546 const Base = extern struct { a: u8 };
test/behavior/prefetch.zig-1
...@@ -3,7 +3,6 @@ const std = @import("std");...@@ -3,7 +3,6 @@ const std = @import("std");
33
4test "@prefetch()" {4test "@prefetch()" {
5 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;5 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
6 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
76
8 var a: [2]u32 = .{ 42, 42 };7 var a: [2]u32 = .{ 42, 42 };
9 var a_len = a.len;8 var a_len = a.len;
test/behavior/sizeof_and_typeof.zig-1
...@@ -272,7 +272,6 @@ test "runtime instructions inside typeof in comptime only scope" {...@@ -272,7 +272,6 @@ test "runtime instructions inside typeof in comptime only scope" {
272 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;272 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
273 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;273 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
274 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO274 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
275 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
276275
277 {276 {
278 var y: i8 = 2;277 var y: i8 = 2;
test/behavior/slice.zig-4
...@@ -185,8 +185,6 @@ test "slicing zero length array" {...@@ -185,8 +185,6 @@ test "slicing zero length array" {
185}185}
186186
187test "slicing pointer by length" {187test "slicing pointer by length" {
188 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
189
190 const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 };188 const array = [_]u8{ 1, 2, 3, 4, 5, 6, 7, 8 };
191 const ptr: [*]const u8 = @as([*]const u8, @ptrCast(&array));189 const ptr: [*]const u8 = @as([*]const u8, @ptrCast(&array));
192 const slice = ptr[1..][0..5];190 const slice = ptr[1..][0..5];
...@@ -306,7 +304,6 @@ test "slice type with custom alignment" {...@@ -306,7 +304,6 @@ test "slice type with custom alignment" {
306304
307test "obtaining a null terminated slice" {305test "obtaining a null terminated slice" {
308 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO306 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
309 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
310307
311 // here we have a normal array308 // here we have a normal array
312 var buf: [50]u8 = undefined;309 var buf: [50]u8 = undefined;
...@@ -772,7 +769,6 @@ test "slice sentinel access at comptime" {...@@ -772,7 +769,6 @@ test "slice sentinel access at comptime" {
772test "slicing array with sentinel as end index" {769test "slicing array with sentinel as end index" {
773 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;770 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
774 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO771 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
775 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
776772
777 const S = struct {773 const S = struct {
778 fn do() !void {774 fn do() !void {
test/behavior/struct.zig-1
...@@ -348,7 +348,6 @@ test "self-referencing struct via array member" {...@@ -348,7 +348,6 @@ test "self-referencing struct via array member" {
348 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;348 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
349 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO349 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
350 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO350 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
351 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
352351
353 const T = struct {352 const T = struct {
354 children: [1]*@This(),353 children: [1]*@This(),