diff options
| author | Robin Voetter <robin@voetter.nl> | 2023-10-08 01:27:20 +0200 |
|---|---|---|
| committer | Robin Voetter <robin@voetter.nl> | 2023-10-15 14:00:03 +0200 |
| commit | fe51ff9fc14c38337c559acb7647480188b1d154 (patch) | |
| tree | 0b45bd7e8e189e7ea09a037fbf72162910d11121 /src/codegen | |
| parent | 15cf1315bb945f2a14a48e2cc7ee2eaf2e0536d2 (diff) | |
| download | zig-fe51ff9fc14c38337c559acb7647480188b1d154.tar.gz zig-fe51ff9fc14c38337c559acb7647480188b1d154.zip | |
spirv: make air is_null not emit OpPtr(Not)Equal
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/spirv.zig | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 41848644c4..0ab87b4df0 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -2406,8 +2406,7 @@ const DeclGen = struct { fn cmp( self: *DeclGen, - comptime op: std.math.CompareOperator, - bool_ty_id: IdRef, + op: std.math.CompareOperator, ty: Type, lhs_id: IdRef, rhs_id: IdRef, @@ -2415,6 +2414,7 @@ const DeclGen = struct { const mod = self.module; var cmp_lhs_id = lhs_id; var cmp_rhs_id = rhs_id; + const bool_ty_ref = try self.resolveType(Type.bool, .direct); const opcode: Opcode = opcode: { const op_ty = switch (ty.zigTypeTag(mod)) { .Int, .Bool, .Float => ty, @@ -2497,7 +2497,7 @@ const DeclGen = struct { const result_id = self.spv.allocId(); try self.func.body.emitRaw(self.spv.gpa, opcode, 4); - self.func.body.writeOperand(spec.IdResultType, bool_ty_id); + self.func.body.writeOperand(spec.IdResultType, self.typeId(bool_ty_ref)); self.func.body.writeOperand(spec.IdResult, result_id); self.func.body.writeOperand(spec.IdResultType, cmp_lhs_id); self.func.body.writeOperand(spec.IdResultType, cmp_rhs_id); @@ -2513,11 +2513,10 @@ const DeclGen = struct { const bin_op = self.air.instructions.items(.data)[inst].bin_op; const lhs_id = try self.resolve(bin_op.lhs); const rhs_id = try self.resolve(bin_op.rhs); - const bool_ty_id = try self.resolveTypeId(Type.bool); const ty = self.typeOf(bin_op.lhs); assert(ty.eql(self.typeOf(bin_op.rhs), self.module)); - return try self.cmp(op, bool_ty_id, ty, lhs_id, rhs_id); + return try self.cmp(op, ty, lhs_id, rhs_id); } fn bitCast( @@ -3580,18 +3579,11 @@ const DeclGen = struct { const payload_ty_ref = try self.resolveType(ptr_ty, .direct); const null_id = try self.spv.constNull(payload_ty_ref); - const result_id = self.spv.allocId(); - const operands = .{ - .id_result_type = self.typeId(bool_ty_ref), - .id_result = result_id, - .operand_1 = ptr_id, - .operand_2 = null_id, + const op: std.math.CompareOperator = switch (pred) { + .is_null => .eq, + .is_non_null => .neq, }; - switch (pred) { - .is_null => try self.func.body.emit(self.spv.gpa, .OpPtrEqual, operands), - .is_non_null => try self.func.body.emit(self.spv.gpa, .OpPtrNotEqual, operands), - } - return result_id; + return try self.cmp(op, ptr_ty, ptr_id, null_id); } const is_non_null_id = if (payload_ty.hasRuntimeBitsIgnoreComptime(mod)) |
