diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-07-07 10:43:57 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-07-07 10:45:45 +0300 |
| commit | 252388eb28fde40f085e14cd341efdc701093fe1 (patch) | |
| tree | c14f6b026b1b193b9e1034e3c705e3b9c94ab7cd | |
| parent | c9006d9479c619d9ed555164831e11a04d88d382 (diff) | |
| download | zig-252388eb28fde40f085e14cd341efdc701093fe1.tar.gz zig-252388eb28fde40f085e14cd341efdc701093fe1.zip | |
AstGen: move error_to_int, int_to_error and select to extended
| -rw-r--r-- | src/AstGen.zig | 24 | ||||
| -rw-r--r-- | src/Sema.zig | 47 | ||||
| -rw-r--r-- | src/Zir.zig | 26 | ||||
| -rw-r--r-- | src/print_zir.zig | 14 |
4 files changed, 58 insertions, 53 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig index a0ff7a0e6e..d4b942ecbc 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -2332,8 +2332,6 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner .error_union_type, .bit_not, .error_value, - .error_to_int, - .int_to_error, .slice_start, .slice_end, .slice_sentinel, @@ -2420,7 +2418,6 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner .splat, .reduce, .shuffle, - .select, .atomic_load, .atomic_rmw, .mul_add, @@ -7355,8 +7352,6 @@ fn builtinCall( .align_of => return simpleUnOpType(gz, scope, rl, node, params[0], .align_of), .ptr_to_int => return simpleUnOp(gz, scope, rl, node, .none, params[0], .ptr_to_int), - .error_to_int => return simpleUnOp(gz, scope, rl, node, .none, params[0], .error_to_int), - .int_to_error => return simpleUnOp(gz, scope, rl, node, .{ .coerced_ty = .u16_type }, params[0], .int_to_error), .compile_error => return simpleUnOp(gz, scope, rl, node, .{ .ty = .const_slice_u8_type }, params[0], .compile_error), .set_eval_branch_quota => return simpleUnOp(gz, scope, rl, node, .{ .coerced_ty = .u32_type }, params[0], .set_eval_branch_quota), .enum_to_int => return simpleUnOp(gz, scope, rl, node, .none, params[0], .enum_to_int), @@ -7396,6 +7391,22 @@ fn builtinCall( .truncate => return typeCast(gz, scope, rl, node, params[0], params[1], .truncate), // zig fmt: on + .error_to_int => { + const operand = try expr(gz, scope, .none, params[0]); + const result = try gz.addExtendedPayload(.error_to_int, Zir.Inst.UnNode{ + .node = gz.nodeIndexToRelative(node), + .operand = operand, + }); + return rvalue(gz, rl, result, node); + }, + .int_to_error => { + const operand = try expr(gz, scope, .{ .coerced_ty = .u16_type }, params[0]); + const result = try gz.addExtendedPayload(.int_to_error, Zir.Inst.UnNode{ + .node = gz.nodeIndexToRelative(node), + .operand = operand, + }); + return rvalue(gz, rl, result, node); + }, .align_cast => { const dest_align = try comptimeExpr(gz, scope, align_rl, params[0]); const rhs = try expr(gz, scope, .none, params[1]); @@ -7635,7 +7646,8 @@ fn builtinCall( return rvalue(gz, rl, result, node); }, .select => { - const result = try gz.addPlNode(.select, node, Zir.Inst.Select{ + const result = try gz.addExtendedPayload(.select, Zir.Inst.Select{ + .node = gz.nodeIndexToRelative(node), .elem_type = try typeExpr(gz, scope, params[0]), .pred = try expr(gz, scope, .none, params[1]), .a = try expr(gz, scope, .none, params[2]), diff --git a/src/Sema.zig b/src/Sema.zig index a412e288ba..49878397e9 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -739,8 +739,6 @@ fn analyzeBodyInner( .err_union_payload_unsafe_ptr => try sema.zirErrUnionPayloadPtr(block, inst, false), .error_union_type => try sema.zirErrorUnionType(block, inst), .error_value => try sema.zirErrorValue(block, inst), - .error_to_int => try sema.zirErrorToInt(block, inst), - .int_to_error => try sema.zirIntToError(block, inst), .field_ptr => try sema.zirFieldPtr(block, inst), .field_ptr_named => try sema.zirFieldPtrNamed(block, inst), .field_val => try sema.zirFieldVal(block, inst), @@ -835,7 +833,6 @@ fn analyzeBodyInner( .splat => try sema.zirSplat(block, inst), .reduce => try sema.zirReduce(block, inst), .shuffle => try sema.zirShuffle(block, inst), - .select => try sema.zirSelect(block, inst), .atomic_load => try sema.zirAtomicLoad(block, inst), .atomic_rmw => try sema.zirAtomicRmw(block, inst), .mul_add => try sema.zirMulAdd(block, inst), @@ -942,6 +939,9 @@ fn analyzeBodyInner( .field_call_bind_named => try sema.zirFieldCallBindNamed(block, extended), .err_set_cast => try sema.zirErrSetCast( block, extended), .await_nosuspend => try sema.zirAwaitNosuspend( block, extended), + .select => try sema.zirSelect( block, extended), + .error_to_int => try sema.zirErrorToInt( block, extended), + .int_to_error => try sema.zirIntToError( block, extended), // zig fmt: on .fence => { try sema.zirFence(block, extended); @@ -6240,18 +6240,18 @@ fn zirErrorValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! ); } -fn zirErrorToInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { +fn zirErrorToInt(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref { const tracy = trace(@src()); defer tracy.end(); - const inst_data = sema.code.instructions.items(.data)[inst].un_node; - const src = inst_data.src(); - const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; - const op = try sema.resolveInst(inst_data.operand); - const op_coerced = try sema.coerce(block, Type.anyerror, op, operand_src); + const extra = sema.code.extraData(Zir.Inst.UnNode, extended.operand).data; + const src = LazySrcLoc.nodeOffset(extra.node); + const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node }; + const uncasted_operand = try sema.resolveInst(extra.operand); + const operand = try sema.coerce(block, Type.anyerror, uncasted_operand, operand_src); const result_ty = Type.u16; - if (try sema.resolveMaybeUndefVal(block, src, op_coerced)) |val| { + if (try sema.resolveMaybeUndefVal(block, src, operand)) |val| { if (val.isUndef()) { return sema.addConstUndef(result_ty); } @@ -6273,7 +6273,7 @@ fn zirErrorToInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! } } - const op_ty = sema.typeOf(op); + const op_ty = sema.typeOf(uncasted_operand); try sema.resolveInferredErrorSetTy(block, src, op_ty); if (!op_ty.isAnyError()) { const names = op_ty.errorSetNames(); @@ -6285,17 +6285,17 @@ fn zirErrorToInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! } try sema.requireRuntimeBlock(block, src); - return block.addBitCast(result_ty, op_coerced); + return block.addBitCast(result_ty, operand); } -fn zirIntToError(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { +fn zirIntToError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref { const tracy = trace(@src()); defer tracy.end(); - const inst_data = sema.code.instructions.items(.data)[inst].un_node; - const src = inst_data.src(); - const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; - const uncasted_operand = try sema.resolveInst(inst_data.operand); + const extra = sema.code.extraData(Zir.Inst.UnNode, extended.operand).data; + const src = LazySrcLoc.nodeOffset(extra.node); + const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node }; + const uncasted_operand = try sema.resolveInst(extra.operand); const operand = try sema.coerce(block, Type.u16, uncasted_operand, operand_src); const target = sema.mod.getTarget(); @@ -16703,14 +16703,13 @@ fn analyzeShuffle( }); } -fn zirSelect(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { - const inst_data = sema.code.instructions.items(.data)[inst].pl_node; - const extra = sema.code.extraData(Zir.Inst.Select, inst_data.payload_index).data; +fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref { + const extra = sema.code.extraData(Zir.Inst.Select, extended.operand).data; - const elem_ty_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node }; - const pred_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = inst_data.src_node }; - const a_src: LazySrcLoc = .{ .node_offset_builtin_call_arg2 = inst_data.src_node }; - const b_src: LazySrcLoc = .{ .node_offset_builtin_call_arg3 = inst_data.src_node }; + const elem_ty_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node }; + const pred_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = extra.node }; + const a_src: LazySrcLoc = .{ .node_offset_builtin_call_arg2 = extra.node }; + const b_src: LazySrcLoc = .{ .node_offset_builtin_call_arg3 = extra.node }; const elem_ty = try sema.resolveType(block, elem_ty_src, extra.elem_type); try sema.checkVectorElemType(block, elem_ty_src, elem_ty); diff --git a/src/Zir.zig b/src/Zir.zig index 98cdd490b8..9448b54346 100644 --- a/src/Zir.zig +++ b/src/Zir.zig @@ -778,10 +778,6 @@ pub const Inst = struct { /// Implement builtin `@ptrToInt`. Uses `un_node`. /// Convert a pointer to a `usize` integer. ptr_to_int, - /// Implement builtin `@errToInt`. Uses `un_node`. - error_to_int, - /// Implement builtin `@intToError`. Uses `un_node`. - int_to_error, /// Emit an error message and fail compilation. /// Uses the `un_node` field. compile_error, @@ -916,9 +912,6 @@ pub const Inst = struct { /// Implements the `@shuffle` builtin. /// Uses the `pl_node` union field with payload `Shuffle`. shuffle, - /// Implements the `@select` builtin. - /// Uses the `pl_node` union field with payload `Select`. - select, /// Implements the `@atomicLoad` builtin. /// Uses the `pl_node` union field with payload `AtomicLoad`. atomic_load, @@ -1125,8 +1118,6 @@ pub const Inst = struct { .err_union_payload_unsafe_ptr, .err_union_code, .err_union_code_ptr, - .error_to_int, - .int_to_error, .ptr_type, .ptr_type_simple, .ensure_err_payload_void, @@ -1230,7 +1221,6 @@ pub const Inst = struct { .splat, .reduce, .shuffle, - .select, .atomic_load, .atomic_rmw, .atomic_store, @@ -1423,8 +1413,6 @@ pub const Inst = struct { .err_union_payload_unsafe_ptr, .err_union_code, .err_union_code_ptr, - .error_to_int, - .int_to_error, .ptr_type, .ptr_type_simple, .enum_literal, @@ -1516,7 +1504,6 @@ pub const Inst = struct { .splat, .reduce, .shuffle, - .select, .atomic_load, .atomic_rmw, .mul_add, @@ -1731,8 +1718,6 @@ pub const Inst = struct { .bit_size_of = .un_node, .ptr_to_int = .un_node, - .error_to_int = .un_node, - .int_to_error = .un_node, .compile_error = .un_node, .set_eval_branch_quota = .un_node, .enum_to_int = .un_node, @@ -1802,7 +1787,6 @@ pub const Inst = struct { .splat = .pl_node, .reduce = .pl_node, .shuffle = .pl_node, - .select = .pl_node, .atomic_load = .pl_node, .atomic_rmw = .pl_node, .atomic_store = .pl_node, @@ -1971,6 +1955,15 @@ pub const Inst = struct { await_nosuspend, /// `operand` is `src_node: i32`. breakpoint, + /// Implements the `@select` builtin. + /// operand` is payload index to `Select`. + select, + /// Implement builtin `@errToInt`. + /// `operand` is payload index to `UnNode`. + error_to_int, + /// Implement builtin `@intToError`. + /// `operand` is payload index to `UnNode`. + int_to_error, pub const InstData = struct { opcode: Extended, @@ -3448,6 +3441,7 @@ pub const Inst = struct { }; pub const Select = struct { + node: i32, elem_type: Ref, pred: Ref, a: Ref, diff --git a/src/print_zir.zig b/src/print_zir.zig index b19076a7f0..6cd289c092 100644 --- a/src/print_zir.zig +++ b/src/print_zir.zig @@ -189,8 +189,6 @@ const Writer = struct { .typeof_log2_int_type, .log2_int_type, .ptr_to_int, - .error_to_int, - .int_to_error, .compile_error, .set_eval_branch_quota, .enum_to_int, @@ -284,7 +282,6 @@ const Writer = struct { .memcpy => try self.writeMemcpy(stream, inst), .memset => try self.writeMemset(stream, inst), .shuffle => try self.writeShuffle(stream, inst), - .select => try self.writeSelect(stream, inst), .mul_add => try self.writeMulAdd(stream, inst), .field_parent_ptr => try self.writeFieldParentPtr(stream, inst), .builtin_call => try self.writeBuiltinCall(stream, inst), @@ -478,6 +475,8 @@ const Writer = struct { .compile_log => try self.writeNodeMultiOp(stream, extended), .typeof_peer => try self.writeTypeofPeer(stream, extended), + .select => try self.writeSelect(stream, extended), + .add_with_overflow, .sub_with_overflow, .mul_with_overflow, @@ -496,6 +495,8 @@ const Writer = struct { .set_float_mode, .set_align_stack, .wasm_memory_size, + .error_to_int, + .int_to_error, => { const inst_data = self.code.extraData(Zir.Inst.UnNode, extended.operand).data; const src = LazySrcLoc.nodeOffset(inst_data.node); @@ -772,9 +773,8 @@ const Writer = struct { try self.writeSrc(stream, inst_data.src()); } - fn writeSelect(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void { - const inst_data = self.code.instructions.items(.data)[inst].pl_node; - const extra = self.code.extraData(Zir.Inst.Select, inst_data.payload_index).data; + fn writeSelect(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void { + const extra = self.code.extraData(Zir.Inst.Select, extended.operand).data; try self.writeInstRef(stream, extra.elem_type); try stream.writeAll(", "); try self.writeInstRef(stream, extra.pred); @@ -783,7 +783,7 @@ const Writer = struct { try stream.writeAll(", "); try self.writeInstRef(stream, extra.b); try stream.writeAll(") "); - try self.writeSrc(stream, inst_data.src()); + try self.writeSrc(stream, LazySrcLoc.nodeOffset(extra.node)); } fn writeMulAdd(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void { |
