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 {...@@ -2406,8 +2406,7 @@ const DeclGen = struct {
24062406
2407 fn cmp(2407 fn cmp(
2408 self: *DeclGen,2408 self: *DeclGen,
2409 comptime op: std.math.CompareOperator,2409 op: std.math.CompareOperator,
2410 bool_ty_id: IdRef,
2411 ty: Type,2410 ty: Type,
2412 lhs_id: IdRef,2411 lhs_id: IdRef,
2413 rhs_id: IdRef,2412 rhs_id: IdRef,
...@@ -2415,6 +2414,7 @@ const DeclGen = struct {...@@ -2415,6 +2414,7 @@ const DeclGen = struct {
2415 const mod = self.module;2414 const mod = self.module;
2416 var cmp_lhs_id = lhs_id;2415 var cmp_lhs_id = lhs_id;
2417 var cmp_rhs_id = rhs_id;2416 var cmp_rhs_id = rhs_id;
2417 const bool_ty_ref = try self.resolveType(Type.bool, .direct);
2418 const opcode: Opcode = opcode: {2418 const opcode: Opcode = opcode: {
2419 const op_ty = switch (ty.zigTypeTag(mod)) {2419 const op_ty = switch (ty.zigTypeTag(mod)) {
2420 .Int, .Bool, .Float => ty,2420 .Int, .Bool, .Float => ty,
...@@ -2497,7 +2497,7 @@ const DeclGen = struct {...@@ -2497,7 +2497,7 @@ const DeclGen = struct {
24972497
2498 const result_id = self.spv.allocId();2498 const result_id = self.spv.allocId();
2499 try self.func.body.emitRaw(self.spv.gpa, opcode, 4);2499 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));
2501 self.func.body.writeOperand(spec.IdResult, result_id);2501 self.func.body.writeOperand(spec.IdResult, result_id);
2502 self.func.body.writeOperand(spec.IdResultType, cmp_lhs_id);2502 self.func.body.writeOperand(spec.IdResultType, cmp_lhs_id);
2503 self.func.body.writeOperand(spec.IdResultType, cmp_rhs_id);2503 self.func.body.writeOperand(spec.IdResultType, cmp_rhs_id);
...@@ -2513,11 +2513,10 @@ const DeclGen = struct {...@@ -2513,11 +2513,10 @@ const DeclGen = struct {
2513 const bin_op = self.air.instructions.items(.data)[inst].bin_op;2513 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
2514 const lhs_id = try self.resolve(bin_op.lhs);2514 const lhs_id = try self.resolve(bin_op.lhs);
2515 const rhs_id = try self.resolve(bin_op.rhs);2515 const rhs_id = try self.resolve(bin_op.rhs);
2516 const bool_ty_id = try self.resolveTypeId(Type.bool);
2517 const ty = self.typeOf(bin_op.lhs);2516 const ty = self.typeOf(bin_op.lhs);
2518 assert(ty.eql(self.typeOf(bin_op.rhs), self.module));2517 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);
2521 }2520 }
25222521
2523 fn bitCast(2522 fn bitCast(
...@@ -3580,18 +3579,11 @@ const DeclGen = struct {...@@ -3580,18 +3579,11 @@ const DeclGen = struct {
35803579
3581 const payload_ty_ref = try self.resolveType(ptr_ty, .direct);3580 const payload_ty_ref = try self.resolveType(ptr_ty, .direct);
3582 const null_id = try self.spv.constNull(payload_ty_ref);3581 const null_id = try self.spv.constNull(payload_ty_ref);
3583 const result_id = self.spv.allocId();3582 const op: std.math.CompareOperator = switch (pred) {
3584 const operands = .{3583 .is_null => .eq,
3585 .id_result_type = self.typeId(bool_ty_ref),3584 .is_non_null => .neq,
3586 .id_result = result_id,
3587 .operand_1 = ptr_id,
3588 .operand_2 = null_id,
3589 };3585 };
3590 switch (pred) {3586 return try self.cmp(op, ptr_ty, ptr_id, null_id);
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;
3595 }3587 }
35963588
3597 const is_non_null_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod))3589 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 {...@@ -179,7 +179,6 @@ fn expectIntFromFloat(comptime F: type, f: F, comptime I: type, i: I) !void {
179test "implicitly cast indirect pointer to maybe-indirect pointer" {179test "implicitly cast indirect pointer to maybe-indirect pointer" {
180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
181 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO181 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
182 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
183182
184 const S = struct {183 const S = struct {
185 const Self = @This();184 const Self = @This();
...@@ -260,7 +259,6 @@ fn MakeType(comptime T: type) type {...@@ -260,7 +259,6 @@ fn MakeType(comptime T: type) type {
260test "implicit cast from *[N]T to [*c]T" {259test "implicit cast from *[N]T to [*c]T" {
261 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;260 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
262 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO261 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
263 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
264262
265 var x: [4]u16 = [4]u16{ 0, 1, 2, 3 };263 var x: [4]u16 = [4]u16{ 0, 1, 2, 3 };
266 var y: [*c]u16 = &x;264 var y: [*c]u16 = &x;
...@@ -1101,7 +1099,6 @@ test "implicit cast from [*]T to ?*anyopaque" {...@@ -1101,7 +1099,6 @@ test "implicit cast from [*]T to ?*anyopaque" {
1101 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1099 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1102 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1100 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1103 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1101 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1104 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11051102
1106 var a = [_]u8{ 3, 2, 1 };1103 var a = [_]u8{ 3, 2, 1 };
1107 var runtime_zero: usize = 0;1104 var runtime_zero: usize = 0;
...@@ -1164,7 +1161,6 @@ test "implicit ptr to *anyopaque" {...@@ -1164,7 +1161,6 @@ test "implicit ptr to *anyopaque" {
1164 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1161 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1165 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1162 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1166 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1163 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1167 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11681164
1169 var a: u32 = 1;1165 var a: u32 = 1;
1170 var ptr: *align(@alignOf(u32)) anyopaque = &a;1166 var ptr: *align(@alignOf(u32)) anyopaque = &a;
...@@ -1178,7 +1174,6 @@ test "implicit ptr to *anyopaque" {...@@ -1178,7 +1174,6 @@ test "implicit ptr to *anyopaque" {
1178test "return null from fn () anyerror!?&T" {1174test "return null from fn () anyerror!?&T" {
1179 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1175 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1180 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1176 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1181 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
11821177
1183 const a = returnNullFromOptionalTypeErrorRef();1178 const a = returnNullFromOptionalTypeErrorRef();
1184 const b = returnNullLitFromOptionalTypeErrorRef();1179 const b = returnNullLitFromOptionalTypeErrorRef();
...@@ -1268,7 +1263,6 @@ test "implicit cast from *T to ?*anyopaque" {...@@ -1268,7 +1263,6 @@ test "implicit cast from *T to ?*anyopaque" {
1268 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1263 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1269 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1264 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1270 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1265 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1271 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
12721266
1273 var a: u8 = 1;1267 var a: u8 = 1;
1274 incrementVoidPtrValue(&a);1268 incrementVoidPtrValue(&a);
...@@ -1338,7 +1332,6 @@ test "assignment to optional pointer result loc" {...@@ -1338,7 +1332,6 @@ test "assignment to optional pointer result loc" {
1338 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1332 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1339 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1333 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1340 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1334 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1341 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
13421335
1343 var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };1336 var foo: struct { ptr: ?*anyopaque } = .{ .ptr = &global_struct };
1344 try expect(foo.ptr.? == @as(*anyopaque, @ptrCast(&global_struct)));1337 try expect(foo.ptr.? == @as(*anyopaque, @ptrCast(&global_struct)));
...@@ -1532,7 +1525,6 @@ test "cast typed undefined to int" {...@@ -1532,7 +1525,6 @@ test "cast typed undefined to int" {
15321525
1533test "implicit cast from [:0]T to [*c]T" {1526test "implicit cast from [:0]T to [*c]T" {
1534 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1527 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1535 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
15361528
1537 var a: [:0]const u8 = "foo";1529 var a: [:0]const u8 = "foo";
1538 var b: [*c]const u8 = a;1530 var b: [*c]const u8 = a;
...@@ -1788,7 +1780,6 @@ test "peer type resolution: three-way resolution combines error set and optional...@@ -1788,7 +1780,6 @@ test "peer type resolution: three-way resolution combines error set and optional
1788 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1780 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1789 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1781 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1790 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1782 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1791 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
17921783
1793 const E = error{Foo};1784 const E = error{Foo};
1794 var a: E = error.Foo;1785 var a: E = error.Foo;
...@@ -2180,7 +2171,6 @@ test "cast builtins can wrap result in optional" {...@@ -2180,7 +2171,6 @@ test "cast builtins can wrap result in optional" {
2180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2171 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2181 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2172 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2182 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2173 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2183 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
21842174
2185 const S = struct {2175 const S = struct {
2186 const MyEnum = enum(u32) { _ };2176 const MyEnum = enum(u32) { _ };
...@@ -2256,7 +2246,6 @@ test "cast builtins can wrap result in error union and optional" {...@@ -2256,7 +2246,6 @@ test "cast builtins can wrap result in error union and optional" {
2256 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2246 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2257 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2247 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2258 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2248 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2259 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
22602249
2261 const S = struct {2250 const S = struct {
2262 const MyEnum = enum(u32) { _ };2251 const MyEnum = enum(u32) { _ };
...@@ -2461,7 +2450,6 @@ test "result information is preserved through many nested structures" {...@@ -2461,7 +2450,6 @@ test "result information is preserved through many nested structures" {
2461 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2450 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2462 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2451 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2463 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2452 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2464 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
24652453
2466 const S = struct {2454 const S = struct {
2467 fn doTheTest() !void {2455 fn doTheTest() !void {
test/behavior/pointers.zig-2
...@@ -149,7 +149,6 @@ test "implicit casting between C pointer and optional non-C pointer" {...@@ -149,7 +149,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
149 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;149 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;150 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
151 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO151 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
152 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
153152
154 var slice: []const u8 = "aoeu";153 var slice: []const u8 = "aoeu";
155 const opt_many_ptr: ?[*]const u8 = slice.ptr;154 const opt_many_ptr: ?[*]const u8 = slice.ptr;
...@@ -211,7 +210,6 @@ test "assign null directly to C pointer and test null equality" {...@@ -211,7 +210,6 @@ test "assign null directly to C pointer and test null equality" {
211 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO210 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
212 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO211 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
213 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO212 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
214 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
215213
216 var x: [*c]i32 = null;214 var x: [*c]i32 = null;
217 try expect(x == null);215 try expect(x == null);