authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-10-08 01:27:20+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-10-15 14:00:03+02:00
logfe51ff9fc14c38337c559acb7647480188b1d154
tree0b45bd7e8e189e7ea09a037fbf72162910d11121
parent15cf1315bb945f2a14a48e2cc7ee2eaf2e0536d2
signaturebadge-check Signed by SSH key SHA256:CQ99aPxq+RueiL9u7z0FEki5Fm7V6T8q4PrEGmINrA4

spirv: make air is_null not emit OpPtr(Not)Equal


3 files changed, 8 insertions(+), 30 deletions(-)

src/codegen/spirv.zig+8-16
......@@ -2406,8 +2406,7 @@ const DeclGen = struct {
24062406
24072407 fn cmp(
24082408 self: *DeclGen,
2409 comptime op: std.math.CompareOperator,
2410 bool_ty_id: IdRef,
2409 op: std.math.CompareOperator,
24112410 ty: Type,
24122411 lhs_id: IdRef,
24132412 rhs_id: IdRef,
......@@ -2415,6 +2414,7 @@ const DeclGen = struct {
24152414 const mod = self.module;
24162415 var cmp_lhs_id = lhs_id;
24172416 var cmp_rhs_id = rhs_id;
2417 const bool_ty_ref = try self.resolveType(Type.bool, .direct);
24182418 const opcode: Opcode = opcode: {
24192419 const op_ty = switch (ty.zigTypeTag(mod)) {
24202420 .Int, .Bool, .Float => ty,
......@@ -2497,7 +2497,7 @@ const DeclGen = struct {
24972497
24982498 const result_id = self.spv.allocId();
24992499 try self.func.body.emitRaw(self.spv.gpa, opcode, 4);
2500 self.func.body.writeOperand(spec.IdResultType, bool_ty_id);
2500 self.func.body.writeOperand(spec.IdResultType, self.typeId(bool_ty_ref));
25012501 self.func.body.writeOperand(spec.IdResult, result_id);
25022502 self.func.body.writeOperand(spec.IdResultType, cmp_lhs_id);
25032503 self.func.body.writeOperand(spec.IdResultType, cmp_rhs_id);
......@@ -2513,11 +2513,10 @@ const DeclGen = struct {
25132513 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
25142514 const lhs_id = try self.resolve(bin_op.lhs);
25152515 const rhs_id = try self.resolve(bin_op.rhs);
2516 const bool_ty_id = try self.resolveTypeId(Type.bool);
25172516 const ty = self.typeOf(bin_op.lhs);
25182517 assert(ty.eql(self.typeOf(bin_op.rhs), self.module));
25192518
2520 return try self.cmp(op, bool_ty_id, ty, lhs_id, rhs_id);
2519 return try self.cmp(op, ty, lhs_id, rhs_id);
25212520 }
25222521
25232522 fn bitCast(
......@@ -3580,18 +3579,11 @@ const DeclGen = struct {
35803579
35813580 const payload_ty_ref = try self.resolveType(ptr_ty, .direct);
35823581 const null_id = try self.spv.constNull(payload_ty_ref);
3583 const result_id = self.spv.allocId();
3584 const operands = .{
3585 .id_result_type = self.typeId(bool_ty_ref),
3586 .id_result = result_id,
3587 .operand_1 = ptr_id,
3588 .operand_2 = null_id,
3582 const op: std.math.CompareOperator = switch (pred) {
3583 .is_null => .eq,
3584 .is_non_null => .neq,
35893585 };
3590 switch (pred) {
3591 .is_null => try self.func.body.emit(self.spv.gpa, .OpPtrEqual, operands),
3592 .is_non_null => try self.func.body.emit(self.spv.gpa, .OpPtrNotEqual, operands),
3593 }
3594 return result_id;
3586 return try self.cmp(op, ptr_ty, ptr_id, null_id);
35953587 }
35963588
35973589 const is_non_null_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod))
test/behavior/cast.zig-12
......@@ -179,7 +179,6 @@ fn expectIntFromFloat(comptime F: type, f: F, comptime I: type, i: I) !void {
179179test "implicitly cast indirect pointer to maybe-indirect pointer" {
180180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
181181 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
182 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
183182
184183 const S = struct {
185184 const Self = @This();
......@@ -260,7 +259,6 @@ fn MakeType(comptime T: type) type {
260259test "implicit cast from *[N]T to [*c]T" {
261260 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
262261 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
263 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
264262
265263 var x: [4]u16 = [4]u16{ 0, 1, 2, 3 };
266264 var y: [*c]u16 = &x;
......@@ -1101,7 +1099,6 @@ test "implicit cast from [*]T to ?*anyopaque" {
11011099 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11021100 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11031101 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1104 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11051102
11061103 var a = [_]u8{ 3, 2, 1 };
11071104 var runtime_zero: usize = 0;
......@@ -1164,7 +1161,6 @@ test "implicit ptr to *anyopaque" {
11641161 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11651162 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11661163 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1167 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11681164
11691165 var a: u32 = 1;
11701166 var ptr: *align(@alignOf(u32)) anyopaque = &a;
......@@ -1178,7 +1174,6 @@ test "implicit ptr to *anyopaque" {
11781174test "return null from fn () anyerror!?&T" {
11791175 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11801176 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1181 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11821177
11831178 const a = returnNullFromOptionalTypeErrorRef();
11841179 const b = returnNullLitFromOptionalTypeErrorRef();
......@@ -1268,7 +1263,6 @@ test "implicit cast from *T to ?*anyopaque" {
12681263 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
12691264 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12701265 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1271 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12721266
12731267 var a: u8 = 1;
12741268 incrementVoidPtrValue(&a);
......@@ -1338,7 +1332,6 @@ test "assignment to optional pointer result loc" {
13381332 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13391333 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13401334 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1341 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13421335
13431336 var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
13441337 try expect(foo.ptr.? == @as(*anyopaque, @ptrCast(&global_struct)));
......@@ -1532,7 +1525,6 @@ test "cast typed undefined to int" {
15321525
15331526test "implicit cast from [:0]T to [*c]T" {
15341527 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1535 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15361528
15371529 var a: [:0]const u8 = "foo";
15381530 var b: [*c]const u8 = a;
......@@ -1788,7 +1780,6 @@ test "peer type resolution: three-way resolution combines error set and optional
17881780 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17891781 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
17901782 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1791 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
17921783
17931784 const E = error{Foo};
17941785 var a: E = error.Foo;
......@@ -2180,7 +2171,6 @@ test "cast builtins can wrap result in optional" {
21802171 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
21812172 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21822173 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2183 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
21842174
21852175 const S = struct {
21862176 const MyEnum = enum(u32) { _ };
......@@ -2256,7 +2246,6 @@ test "cast builtins can wrap result in error union and optional" {
22562246 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
22572247 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
22582248 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2259 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
22602249
22612250 const S = struct {
22622251 const MyEnum = enum(u32) { _ };
......@@ -2461,7 +2450,6 @@ test "result information is preserved through many nested structures" {
24612450 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
24622451 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
24632452 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2464 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
24652453
24662454 const S = struct {
24672455 fn doTheTest() !void {
test/behavior/pointers.zig-2
......@@ -149,7 +149,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
149149 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
150150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
151151 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
152 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
153152
154153 var slice: []const u8 = "aoeu";
155154 const opt_many_ptr: ?[*]const u8 = slice.ptr;
......@@ -211,7 +210,6 @@ test "assign null directly to C pointer and test null equality" {
211210 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
212211 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
213212 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
214 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
215213
216214 var x: [*c]i32 = null;
217215 try expect(x == null);