| ... | ... | @@ -489,7 +489,7 @@ pub const Block = struct { |
| 489 | 489 | return block.addInst(.{ |
| 490 | 490 | .tag = tag, |
| 491 | 491 | .data = .{ .ty_op = .{ |
| 492 | | .ty = try block.sema.addType(ty), |
| 492 | .ty = Air.internedToRef(ty.toIntern()), |
| 493 | 493 | .operand = operand, |
| 494 | 494 | } }, |
| 495 | 495 | }); |
| ... | ... | @@ -499,7 +499,7 @@ pub const Block = struct { |
| 499 | 499 | return block.addInst(.{ |
| 500 | 500 | .tag = .bitcast, |
| 501 | 501 | .data = .{ .ty_op = .{ |
| 502 | | .ty = try block.sema.addType(ty), |
| 502 | .ty = Air.internedToRef(ty.toIntern()), |
| 503 | 503 | .operand = operand, |
| 504 | 504 | } }, |
| 505 | 505 | }); |
| ... | ... | @@ -558,7 +558,7 @@ pub const Block = struct { |
| 558 | 558 | field_index: u32, |
| 559 | 559 | ptr_field_ty: Type, |
| 560 | 560 | ) !Air.Inst.Ref { |
| 561 | | const ty = try block.sema.addType(ptr_field_ty); |
| 561 | const ty = Air.internedToRef(ptr_field_ty.toIntern()); |
| 562 | 562 | const tag: Air.Inst.Tag = switch (field_index) { |
| 563 | 563 | 0 => .struct_field_ptr_index_0, |
| 564 | 564 | 1 => .struct_field_ptr_index_1, |
| ... | ... | @@ -595,7 +595,7 @@ pub const Block = struct { |
| 595 | 595 | return block.addInst(.{ |
| 596 | 596 | .tag = .struct_field_val, |
| 597 | 597 | .data = .{ .ty_pl = .{ |
| 598 | | .ty = try block.sema.addType(field_ty), |
| 598 | .ty = Air.internedToRef(field_ty.toIntern()), |
| 599 | 599 | .payload = try block.sema.addExtra(Air.StructField{ |
| 600 | 600 | .struct_operand = struct_val, |
| 601 | 601 | .field_index = field_index, |
| ... | ... | @@ -613,7 +613,7 @@ pub const Block = struct { |
| 613 | 613 | return block.addInst(.{ |
| 614 | 614 | .tag = .slice_elem_ptr, |
| 615 | 615 | .data = .{ .ty_pl = .{ |
| 616 | | .ty = try block.sema.addType(elem_ptr_ty), |
| 616 | .ty = Air.internedToRef(elem_ptr_ty.toIntern()), |
| 617 | 617 | .payload = try block.sema.addExtra(Air.Bin{ |
| 618 | 618 | .lhs = slice, |
| 619 | 619 | .rhs = elem_index, |
| ... | ... | @@ -628,7 +628,7 @@ pub const Block = struct { |
| 628 | 628 | elem_index: Air.Inst.Ref, |
| 629 | 629 | elem_ptr_ty: Type, |
| 630 | 630 | ) !Air.Inst.Ref { |
| 631 | | const ty_ref = try block.sema.addType(elem_ptr_ty); |
| 631 | const ty_ref = Air.internedToRef(elem_ptr_ty.toIntern()); |
| 632 | 632 | return block.addPtrElemPtrTypeRef(array_ptr, elem_index, ty_ref); |
| 633 | 633 | } |
| 634 | 634 | |
| ... | ... | @@ -656,12 +656,10 @@ pub const Block = struct { |
| 656 | 656 | return block.addInst(.{ |
| 657 | 657 | .tag = if (block.float_mode == .Optimized) .cmp_vector_optimized else .cmp_vector, |
| 658 | 658 | .data = .{ .ty_pl = .{ |
| 659 | | .ty = try sema.addType( |
| 660 | | try mod.vectorType(.{ |
| 661 | | .len = sema.typeOf(lhs).vectorLen(mod), |
| 662 | | .child = .bool_type, |
| 663 | | }), |
| 664 | | ), |
| 659 | .ty = Air.internedToRef((try mod.vectorType(.{ |
| 660 | .len = sema.typeOf(lhs).vectorLen(mod), |
| 661 | .child = .bool_type, |
| 662 | })).toIntern()), |
| 665 | 663 | .payload = try sema.addExtra(Air.VectorCmp{ |
| 666 | 664 | .lhs = lhs, |
| 667 | 665 | .rhs = rhs, |
| ... | ... | @@ -677,7 +675,7 @@ pub const Block = struct { |
| 677 | 675 | elements: []const Air.Inst.Ref, |
| 678 | 676 | ) !Air.Inst.Ref { |
| 679 | 677 | const sema = block.sema; |
| 680 | | const ty_ref = try sema.addType(aggregate_ty); |
| 678 | const ty_ref = Air.internedToRef(aggregate_ty.toIntern()); |
| 681 | 679 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, elements.len); |
| 682 | 680 | const extra_index = @as(u32, @intCast(sema.air_extra.items.len)); |
| 683 | 681 | sema.appendRefsAssumeCapacity(elements); |
| ... | ... | @@ -700,7 +698,7 @@ pub const Block = struct { |
| 700 | 698 | return block.addInst(.{ |
| 701 | 699 | .tag = .union_init, |
| 702 | 700 | .data = .{ .ty_pl = .{ |
| 703 | | .ty = try block.sema.addType(union_ty), |
| 701 | .ty = Air.internedToRef(union_ty.toIntern()), |
| 704 | 702 | .payload = try block.sema.addExtra(Air.UnionInit{ |
| 705 | 703 | .field_index = field_index, |
| 706 | 704 | .init = init, |
| ... | ... | @@ -2665,13 +2663,13 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 2665 | 2663 | }); |
| 2666 | 2664 | try sema.maybeQueueFuncBodyAnalysis(decl_index); |
| 2667 | 2665 | try sema.comptime_mutable_decls.append(decl_index); |
| 2668 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 2666 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 2669 | 2667 | .ty = ptr_ty.toIntern(), |
| 2670 | 2668 | .addr = .{ .mut_decl = .{ |
| 2671 | 2669 | .decl = decl_index, |
| 2672 | 2670 | .runtime_index = block.runtime_index, |
| 2673 | 2671 | } }, |
| 2674 | | } })).toValue()); |
| 2672 | } }))); |
| 2675 | 2673 | }, |
| 2676 | 2674 | else => {}, |
| 2677 | 2675 | } |
| ... | ... | @@ -2739,10 +2737,10 @@ fn coerceResultPtr( |
| 2739 | 2737 | |
| 2740 | 2738 | if (trash_block.instructions.items.len == prev_trash_len) { |
| 2741 | 2739 | if (try sema.resolveDefinedValue(block, src, new_ptr)) |ptr_val| { |
| 2742 | | return sema.addConstant(ptr_val); |
| 2740 | return Air.internedToRef(ptr_val.toIntern()); |
| 2743 | 2741 | } |
| 2744 | 2742 | if (pointee_ty.eql(Type.null, sema.mod)) { |
| 2745 | | const null_inst = try sema.addConstant(Value.null); |
| 2743 | const null_inst = Air.internedToRef(Value.null.toIntern()); |
| 2746 | 2744 | _ = try block.addBinOp(.store, new_ptr, null_inst); |
| 2747 | 2745 | return Air.Inst.Ref.void_value; |
| 2748 | 2746 | } |
| ... | ... | @@ -2761,7 +2759,7 @@ fn coerceResultPtr( |
| 2761 | 2759 | }); |
| 2762 | 2760 | |
| 2763 | 2761 | if (try sema.resolveDefinedValue(block, src, new_ptr)) |ptr_val| { |
| 2764 | | return sema.addConstant(ptr_val); |
| 2762 | return Air.internedToRef(ptr_val.toIntern()); |
| 2765 | 2763 | } else { |
| 2766 | 2764 | return sema.bitCast(block, ptr_operand_ty, new_ptr, src, null); |
| 2767 | 2765 | } |
| ... | ... | @@ -2774,7 +2772,7 @@ fn coerceResultPtr( |
| 2774 | 2772 | .flags = .{ .address_space = addr_space }, |
| 2775 | 2773 | }); |
| 2776 | 2774 | if (try sema.resolveDefinedValue(block, src, new_ptr)) |ptr_val| { |
| 2777 | | new_ptr = try sema.addConstant(try mod.getCoerced(ptr_val, ptr_operand_ty)); |
| 2775 | new_ptr = Air.internedToRef((try mod.getCoerced(ptr_val, ptr_operand_ty)).toIntern()); |
| 2778 | 2776 | } else { |
| 2779 | 2777 | new_ptr = try sema.bitCast(block, ptr_operand_ty, new_ptr, src, null); |
| 2780 | 2778 | } |
| ... | ... | @@ -3781,7 +3779,7 @@ fn makePtrConst(sema: *Sema, block: *Block, alloc: Air.Inst.Ref) CompileError!Ai |
| 3781 | 3779 | |
| 3782 | 3780 | // Detect if a comptime value simply needs to have its type changed. |
| 3783 | 3781 | if (try sema.resolveMaybeUndefVal(alloc)) |val| { |
| 3784 | | return sema.addConstant(try mod.getCoerced(val, const_ptr_ty)); |
| 3782 | return Air.internedToRef((try mod.getCoerced(val, const_ptr_ty)).toIntern()); |
| 3785 | 3783 | } |
| 3786 | 3784 | |
| 3787 | 3785 | return block.addBitCast(const_ptr_ty, alloc); |
| ... | ... | @@ -4332,7 +4330,7 @@ fn zirOptEuBaseTy( |
| 4332 | 4330 | switch (ty.zigTypeTag(mod)) { |
| 4333 | 4331 | .Optional => ty = ty.optionalChild(mod), |
| 4334 | 4332 | .ErrorUnion => ty = ty.errorUnionPayload(mod), |
| 4335 | | else => return sema.addType(ty), |
| 4333 | else => return Air.internedToRef(ty.toIntern()), |
| 4336 | 4334 | } |
| 4337 | 4335 | } |
| 4338 | 4336 | } |
| ... | ... | @@ -4584,14 +4582,14 @@ fn validateUnionInit( |
| 4584 | 4582 | .ty = union_ty.toIntern(), |
| 4585 | 4583 | .val = union_val, |
| 4586 | 4584 | } }); |
| 4587 | | const union_init = try sema.addConstant(union_val.toValue()); |
| 4585 | const union_init = Air.internedToRef(union_val); |
| 4588 | 4586 | try sema.storePtr2(block, init_src, union_ptr, init_src, union_init, init_src, .store); |
| 4589 | 4587 | return; |
| 4590 | 4588 | } else if (try sema.typeRequiresComptime(union_ty)) { |
| 4591 | 4589 | return sema.failWithNeededComptime(block, field_ptr_data.src(), "initializer of comptime only union must be comptime-known"); |
| 4592 | 4590 | } |
| 4593 | 4591 | |
| 4594 | | const new_tag = try sema.addConstant(tag_val); |
| 4592 | const new_tag = Air.internedToRef(tag_val.toIntern()); |
| 4595 | 4593 | _ = try block.addBinOp(.set_union_tag, union_ptr, new_tag); |
| 4596 | 4594 | } |
| 4597 | 4595 | |
| ... | ... | @@ -4685,7 +4683,7 @@ fn validateStructInit( |
| 4685 | 4683 | try sema.tupleFieldPtr(block, init_src, struct_ptr, field_src, @as(u32, @intCast(i)), true) |
| 4686 | 4684 | else |
| 4687 | 4685 | try sema.structFieldPtrByIndex(block, init_src, struct_ptr, @as(u32, @intCast(i)), field_src, struct_ty, true); |
| 4688 | | const init = try sema.addConstant(default_val); |
| 4686 | const init = Air.internedToRef(default_val.toIntern()); |
| 4689 | 4687 | try sema.storePtr2(block, init_src, default_field_ptr, init_src, init, field_src, .store); |
| 4690 | 4688 | } |
| 4691 | 4689 | |
| ... | ... | @@ -4876,7 +4874,7 @@ fn validateStructInit( |
| 4876 | 4874 | .ty = struct_ty.toIntern(), |
| 4877 | 4875 | .val = struct_val, |
| 4878 | 4876 | } }); |
| 4879 | | const struct_init = try sema.addConstant(struct_val.toValue()); |
| 4877 | const struct_init = Air.internedToRef(struct_val); |
| 4880 | 4878 | try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store); |
| 4881 | 4879 | return; |
| 4882 | 4880 | } |
| ... | ... | @@ -4891,7 +4889,7 @@ fn validateStructInit( |
| 4891 | 4889 | try sema.tupleFieldPtr(block, init_src, struct_ptr, field_src, @as(u32, @intCast(i)), true) |
| 4892 | 4890 | else |
| 4893 | 4891 | try sema.structFieldPtrByIndex(block, init_src, struct_ptr, @as(u32, @intCast(i)), field_src, struct_ty, true); |
| 4894 | | const init = try sema.addConstant(field_values[i].toValue()); |
| 4892 | const init = Air.internedToRef(field_values[i]); |
| 4895 | 4893 | try sema.storePtr2(block, init_src, default_field_ptr, init_src, init, field_src, .store); |
| 4896 | 4894 | } |
| 4897 | 4895 | } |
| ... | ... | @@ -4956,9 +4954,9 @@ fn zirValidateArrayInit( |
| 4956 | 4954 | // sentinel-terminated array, the sentinel will not have been populated by |
| 4957 | 4955 | // any ZIR instructions at comptime; we need to do that here. |
| 4958 | 4956 | if (array_ty.sentinel(mod)) |sentinel_val| { |
| 4959 | | const array_len_ref = try sema.addIntUnsigned(Type.usize, array_len); |
| 4957 | const array_len_ref = try mod.intRef(Type.usize, array_len); |
| 4960 | 4958 | const sentinel_ptr = try sema.elemPtrArray(block, init_src, init_src, array_ptr, init_src, array_len_ref, true, true); |
| 4961 | | const sentinel = try sema.addConstant(sentinel_val); |
| 4959 | const sentinel = Air.internedToRef(sentinel_val.toIntern()); |
| 4962 | 4960 | try sema.storePtr2(block, init_src, sentinel_ptr, init_src, sentinel, init_src, .store); |
| 4963 | 4961 | } |
| 4964 | 4962 | return; |
| ... | ... | @@ -4966,7 +4964,7 @@ fn zirValidateArrayInit( |
| 4966 | 4964 | |
| 4967 | 4965 | // If the array has one possible value, the value is always comptime-known. |
| 4968 | 4966 | if (try sema.typeHasOnePossibleValue(array_ty)) |array_opv| { |
| 4969 | | const array_init = try sema.addConstant(array_opv); |
| 4967 | const array_init = Air.internedToRef(array_opv.toIntern()); |
| 4970 | 4968 | try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store); |
| 4971 | 4969 | return; |
| 4972 | 4970 | } |
| ... | ... | @@ -5101,7 +5099,7 @@ fn zirValidateArrayInit( |
| 5101 | 5099 | .ty = array_ty.toIntern(), |
| 5102 | 5100 | .val = array_val, |
| 5103 | 5101 | } }); |
| 5104 | | const array_init = try sema.addConstant(array_val.toValue()); |
| 5102 | const array_init = Air.internedToRef(array_val); |
| 5105 | 5103 | try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store); |
| 5106 | 5104 | } |
| 5107 | 5105 | } |
| ... | ... | @@ -5435,7 +5433,7 @@ fn zirInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 5435 | 5433 | defer tracy.end(); |
| 5436 | 5434 | |
| 5437 | 5435 | const int = sema.code.instructions.items(.data)[inst].int; |
| 5438 | | return sema.addIntUnsigned(Type.comptime_int, int); |
| 5436 | return sema.mod.intRef(Type.comptime_int, int); |
| 5439 | 5437 | } |
| 5440 | 5438 | |
| 5441 | 5439 | fn zirIntBig(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -5454,20 +5452,19 @@ fn zirIntBig(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 5454 | 5452 | const limbs = try sema.arena.alloc(std.math.big.Limb, int.len); |
| 5455 | 5453 | @memcpy(mem.sliceAsBytes(limbs), limb_bytes); |
| 5456 | 5454 | |
| 5457 | | return sema.addConstant( |
| 5458 | | try mod.intValue_big(Type.comptime_int, .{ |
| 5459 | | .limbs = limbs, |
| 5460 | | .positive = true, |
| 5461 | | }), |
| 5462 | | ); |
| 5455 | return Air.internedToRef((try mod.intValue_big(Type.comptime_int, .{ |
| 5456 | .limbs = limbs, |
| 5457 | .positive = true, |
| 5458 | })).toIntern()); |
| 5463 | 5459 | } |
| 5464 | 5460 | |
| 5465 | 5461 | fn zirFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 5466 | 5462 | _ = block; |
| 5467 | 5463 | const number = sema.code.instructions.items(.data)[inst].float; |
| 5468 | | return sema.addConstant( |
| 5469 | | try sema.mod.floatValue(Type.comptime_float, number), |
| 5470 | | ); |
| 5464 | return Air.internedToRef((try sema.mod.floatValue( |
| 5465 | Type.comptime_float, |
| 5466 | number, |
| 5467 | )).toIntern()); |
| 5471 | 5468 | } |
| 5472 | 5469 | |
| 5473 | 5470 | fn zirFloat128(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -5475,9 +5472,7 @@ fn zirFloat128(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 5475 | 5472 | const inst_data = sema.code.instructions.items(.data)[inst].pl_node; |
| 5476 | 5473 | const extra = sema.code.extraData(Zir.Inst.Float128, inst_data.payload_index).data; |
| 5477 | 5474 | const number = extra.get(); |
| 5478 | | return sema.addConstant( |
| 5479 | | try sema.mod.floatValue(Type.comptime_float, number), |
| 5480 | | ); |
| 5475 | return Air.internedToRef((try sema.mod.floatValue(Type.comptime_float, number)).toIntern()); |
| 5481 | 5476 | } |
| 5482 | 5477 | |
| 5483 | 5478 | fn zirCompileError(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index { |
| ... | ... | @@ -5742,7 +5737,7 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr |
| 5742 | 5737 | const file_root_decl_index = result.file.root_decl.unwrap().?; |
| 5743 | 5738 | const file_root_decl = mod.declPtr(file_root_decl_index); |
| 5744 | 5739 | try mod.declareDeclDependency(sema.owner_decl_index, file_root_decl_index); |
| 5745 | | return sema.addConstant(file_root_decl.val); |
| 5740 | return Air.internedToRef(file_root_decl.val.toIntern()); |
| 5746 | 5741 | } |
| 5747 | 5742 | |
| 5748 | 5743 | fn zirSuspendBlock(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -5904,7 +5899,7 @@ fn analyzeBlockBody( |
| 5904 | 5899 | }; |
| 5905 | 5900 | return sema.failWithOwnedErrorMsg(msg); |
| 5906 | 5901 | } |
| 5907 | | const ty_inst = try sema.addType(resolved_ty); |
| 5902 | const ty_inst = Air.internedToRef(resolved_ty.toIntern()); |
| 5908 | 5903 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len + |
| 5909 | 5904 | child_block.instructions.items.len); |
| 5910 | 5905 | sema.air_instructions.items(.data)[merges.block_inst] = .{ .ty_pl = .{ |
| ... | ... | @@ -6498,7 +6493,7 @@ pub fn analyzeSaveErrRetIndex(sema: *Sema, block: *Block) SemaError!Air.Inst.Ref |
| 6498 | 6493 | return try block.addInst(.{ |
| 6499 | 6494 | .tag = .save_err_return_trace_index, |
| 6500 | 6495 | .data = .{ .ty_pl = .{ |
| 6501 | | .ty = try sema.addType(stack_trace_ty), |
| 6496 | .ty = Air.internedToRef(stack_trace_ty.toIntern()), |
| 6502 | 6497 | .payload = @as(u32, @intCast(field_index)), |
| 6503 | 6498 | } }, |
| 6504 | 6499 | }); |
| ... | ... | @@ -6685,7 +6680,7 @@ fn zirCall( |
| 6685 | 6680 | const save_inst = try block.insertInst(block_index, .{ |
| 6686 | 6681 | .tag = .save_err_return_trace_index, |
| 6687 | 6682 | .data = .{ .ty_pl = .{ |
| 6688 | | .ty = try sema.addType(stack_trace_ty), |
| 6683 | .ty = Air.internedToRef(stack_trace_ty.toIntern()), |
| 6689 | 6684 | .payload = @as(u32, @intCast(field_index)), |
| 6690 | 6685 | } }, |
| 6691 | 6686 | }); |
| ... | ... | @@ -6938,7 +6933,7 @@ const CallArgsInfo = union(enum) { |
| 6938 | 6933 | // TODO set comptime_reason |
| 6939 | 6934 | } |
| 6940 | 6935 | // Give the arg its result type |
| 6941 | | sema.inst_map.putAssumeCapacity(zir_call.call_inst, try sema.addType(param_ty)); |
| 6936 | sema.inst_map.putAssumeCapacity(zir_call.call_inst, Air.internedToRef(param_ty.toIntern())); |
| 6942 | 6937 | // Resolve the arg! |
| 6943 | 6938 | const uncoerced_arg = try sema.resolveBody(block, arg_body, zir_call.call_inst); |
| 6944 | 6939 | |
| ... | ... | @@ -7398,9 +7393,7 @@ fn analyzeCall( |
| 7398 | 7393 | .result = .none, |
| 7399 | 7394 | } })) |memoized_call_index| { |
| 7400 | 7395 | const memoized_call = mod.intern_pool.indexToKey(memoized_call_index).memoized_call; |
| 7401 | | break :res2 try sema.addConstant( |
| 7402 | | memoized_call.result.toValue(), |
| 7403 | | ); |
| 7396 | break :res2 Air.internedToRef(memoized_call.result); |
| 7404 | 7397 | } |
| 7405 | 7398 | } |
| 7406 | 7399 | |
| ... | ... | @@ -8057,7 +8050,7 @@ fn emitDbgInline( |
| 8057 | 8050 | _ = try block.addInst(.{ |
| 8058 | 8051 | .tag = tag, |
| 8059 | 8052 | .data = .{ .ty_fn = .{ |
| 8060 | | .ty = try sema.addType(new_func_ty), |
| 8053 | .ty = Air.internedToRef(new_func_ty.toIntern()), |
| 8061 | 8054 | .func = new_func, |
| 8062 | 8055 | } }, |
| 8063 | 8056 | }); |
| ... | ... | @@ -8067,7 +8060,7 @@ fn zirIntType(sema: *Sema, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 8067 | 8060 | const mod = sema.mod; |
| 8068 | 8061 | const int_type = sema.code.instructions.items(.data)[inst].int_type; |
| 8069 | 8062 | const ty = try mod.intType(int_type.signedness, int_type.bit_count); |
| 8070 | | return sema.addType(ty); |
| 8063 | return Air.internedToRef(ty.toIntern()); |
| 8071 | 8064 | } |
| 8072 | 8065 | |
| 8073 | 8066 | fn zirOptionalType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8085,7 +8078,7 @@ fn zirOptionalType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 8085 | 8078 | } |
| 8086 | 8079 | const opt_type = try mod.optionalType(child_type.toIntern()); |
| 8087 | 8080 | |
| 8088 | | return sema.addType(opt_type); |
| 8081 | return Air.internedToRef(opt_type.toIntern()); |
| 8089 | 8082 | } |
| 8090 | 8083 | |
| 8091 | 8084 | fn zirElemTypeIndex(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8103,10 +8096,10 @@ fn zirElemTypeIndex(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 8103 | 8096 | assert(indexable_ty.isIndexable(mod)); // validated by a previous instruction |
| 8104 | 8097 | if (indexable_ty.zigTypeTag(mod) == .Struct) { |
| 8105 | 8098 | const elem_type = indexable_ty.structFieldType(@intFromEnum(bin.rhs), mod); |
| 8106 | | return sema.addType(elem_type); |
| 8099 | return Air.internedToRef(elem_type.toIntern()); |
| 8107 | 8100 | } else { |
| 8108 | 8101 | const elem_type = indexable_ty.elemType2(mod); |
| 8109 | | return sema.addType(elem_type); |
| 8102 | return Air.internedToRef(elem_type.toIntern()); |
| 8110 | 8103 | } |
| 8111 | 8104 | } |
| 8112 | 8105 | |
| ... | ... | @@ -8115,7 +8108,7 @@ fn zirElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 8115 | 8108 | const un_node = sema.code.instructions.items(.data)[inst].un_node; |
| 8116 | 8109 | const ptr_ty = try sema.resolveType(block, .unneeded, un_node.operand); |
| 8117 | 8110 | assert(ptr_ty.zigTypeTag(mod) == .Pointer); // validated by a previous instruction |
| 8118 | | return sema.addType(ptr_ty.childType(mod)); |
| 8111 | return Air.internedToRef(ptr_ty.childType(mod).toIntern()); |
| 8119 | 8112 | } |
| 8120 | 8113 | |
| 8121 | 8114 | fn zirVectorElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8132,7 +8125,7 @@ fn zirVectorElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 8132 | 8125 | if (!vec_ty.isVector(mod)) { |
| 8133 | 8126 | return sema.fail(block, un_node.src(), "expected vector type, found '{}'", .{vec_ty.fmt(mod)}); |
| 8134 | 8127 | } |
| 8135 | | return sema.addType(vec_ty.childType(mod)); |
| 8128 | return Air.internedToRef(vec_ty.childType(mod).toIntern()); |
| 8136 | 8129 | } |
| 8137 | 8130 | |
| 8138 | 8131 | fn zirVectorType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8148,7 +8141,7 @@ fn zirVectorType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 8148 | 8141 | .len = len, |
| 8149 | 8142 | .child = elem_type.toIntern(), |
| 8150 | 8143 | }); |
| 8151 | | return sema.addType(vector_type); |
| 8144 | return Air.internedToRef(vector_type.toIntern()); |
| 8152 | 8145 | } |
| 8153 | 8146 | |
| 8154 | 8147 | fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8167,7 +8160,7 @@ fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 8167 | 8160 | .child = elem_type.toIntern(), |
| 8168 | 8161 | }); |
| 8169 | 8162 | |
| 8170 | | return sema.addType(array_ty); |
| 8163 | return Air.internedToRef(array_ty.toIntern()); |
| 8171 | 8164 | } |
| 8172 | 8165 | |
| 8173 | 8166 | fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8191,7 +8184,7 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil |
| 8191 | 8184 | .child = elem_type.toIntern(), |
| 8192 | 8185 | }); |
| 8193 | 8186 | |
| 8194 | | return sema.addType(array_ty); |
| 8187 | return Air.internedToRef(array_ty.toIntern()); |
| 8195 | 8188 | } |
| 8196 | 8189 | |
| 8197 | 8190 | fn validateArrayElemType(sema: *Sema, block: *Block, elem_type: Type, elem_src: LazySrcLoc) !void { |
| ... | ... | @@ -8216,7 +8209,7 @@ fn zirAnyframeType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 8216 | 8209 | const return_type = try sema.resolveType(block, operand_src, inst_data.operand); |
| 8217 | 8210 | const anyframe_type = try mod.anyframeType(return_type); |
| 8218 | 8211 | |
| 8219 | | return sema.addType(anyframe_type); |
| 8212 | return Air.internedToRef(anyframe_type.toIntern()); |
| 8220 | 8213 | } |
| 8221 | 8214 | |
| 8222 | 8215 | fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8238,7 +8231,7 @@ fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 8238 | 8231 | } |
| 8239 | 8232 | try sema.validateErrorUnionPayloadType(block, payload, rhs_src); |
| 8240 | 8233 | const err_union_ty = try mod.errorUnionType(error_set, payload); |
| 8241 | | return sema.addType(err_union_ty); |
| 8234 | return Air.internedToRef(err_union_ty.toIntern()); |
| 8242 | 8235 | } |
| 8243 | 8236 | |
| 8244 | 8237 | fn validateErrorUnionPayloadType(sema: *Sema, block: *Block, payload_ty: Type, payload_src: LazySrcLoc) !void { |
| ... | ... | @@ -8262,10 +8255,10 @@ fn zirErrorValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 8262 | 8255 | _ = try mod.getErrorValue(name); |
| 8263 | 8256 | // Create an error set type with only this error value, and return the value. |
| 8264 | 8257 | const error_set_type = try mod.singleErrorSetType(name); |
| 8265 | | return sema.addConstant((try mod.intern(.{ .err = .{ |
| 8258 | return Air.internedToRef((try mod.intern(.{ .err = .{ |
| 8266 | 8259 | .ty = error_set_type.toIntern(), |
| 8267 | 8260 | .name = name, |
| 8268 | | } })).toValue()); |
| 8261 | } }))); |
| 8269 | 8262 | } |
| 8270 | 8263 | |
| 8271 | 8264 | fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8282,13 +8275,13 @@ fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD |
| 8282 | 8275 | |
| 8283 | 8276 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 8284 | 8277 | if (val.isUndef(mod)) { |
| 8285 | | return sema.addConstUndef(Type.err_int); |
| 8278 | return mod.undefRef(Type.err_int); |
| 8286 | 8279 | } |
| 8287 | 8280 | const err_name = ip.indexToKey(val.toIntern()).err.name; |
| 8288 | | return sema.addConstant(try mod.intValue( |
| 8281 | return Air.internedToRef((try mod.intValue( |
| 8289 | 8282 | Type.err_int, |
| 8290 | 8283 | try mod.getErrorValue(err_name), |
| 8291 | | )); |
| 8284 | )).toIntern()); |
| 8292 | 8285 | } |
| 8293 | 8286 | |
| 8294 | 8287 | const op_ty = sema.typeOf(uncasted_operand); |
| ... | ... | @@ -8297,10 +8290,10 @@ fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD |
| 8297 | 8290 | else => |err_set_ty_index| { |
| 8298 | 8291 | const names = ip.indexToKey(err_set_ty_index).error_set_type.names; |
| 8299 | 8292 | switch (names.len) { |
| 8300 | | 0 => return sema.addConstant(try mod.intValue(Type.err_int, 0)), |
| 8293 | 0 => return Air.internedToRef((try mod.intValue(Type.err_int, 0)).toIntern()), |
| 8301 | 8294 | 1 => { |
| 8302 | 8295 | const int: Module.ErrorInt = @intCast(mod.global_error_set.getIndex(names.get(ip)[0]).?); |
| 8303 | | return sema.addIntUnsigned(Type.err_int, int); |
| 8296 | return mod.intRef(Type.err_int, int); |
| 8304 | 8297 | }, |
| 8305 | 8298 | else => {}, |
| 8306 | 8299 | } |
| ... | ... | @@ -8326,15 +8319,15 @@ fn zirErrorFromInt(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD |
| 8326 | 8319 | const int = try sema.usizeCast(block, operand_src, value.toUnsignedInt(mod)); |
| 8327 | 8320 | if (int > mod.global_error_set.count() or int == 0) |
| 8328 | 8321 | return sema.fail(block, operand_src, "integer value '{d}' represents no error", .{int}); |
| 8329 | | return sema.addConstant((try mod.intern(.{ .err = .{ |
| 8322 | return Air.internedToRef((try mod.intern(.{ .err = .{ |
| 8330 | 8323 | .ty = .anyerror_type, |
| 8331 | 8324 | .name = mod.global_error_set.keys()[int], |
| 8332 | | } })).toValue()); |
| 8325 | } }))); |
| 8333 | 8326 | } |
| 8334 | 8327 | try sema.requireRuntimeBlock(block, src, operand_src); |
| 8335 | 8328 | if (block.wantSafety()) { |
| 8336 | 8329 | const is_lt_len = try block.addUnOp(.cmp_lt_errors_len, operand); |
| 8337 | | const zero_val = try sema.addConstant(try mod.intValue(Type.err_int, 0)); |
| 8330 | const zero_val = Air.internedToRef((try mod.intValue(Type.err_int, 0)).toIntern()); |
| 8338 | 8331 | const is_non_zero = try block.addBinOp(.cmp_neq, operand, zero_val); |
| 8339 | 8332 | const ok = try block.addBinOp(.bit_and, is_lt_len, is_non_zero); |
| 8340 | 8333 | try sema.addSafetyCheck(block, src, ok, .invalid_error_code); |
| ... | ... | @@ -8411,9 +8404,9 @@ fn zirEnumLiteral(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8411 | 8404 | const mod = sema.mod; |
| 8412 | 8405 | const inst_data = sema.code.instructions.items(.data)[inst].str_tok; |
| 8413 | 8406 | const name = inst_data.get(sema.code); |
| 8414 | | return sema.addConstant((try mod.intern(.{ |
| 8407 | return Air.internedToRef((try mod.intern(.{ |
| 8415 | 8408 | .enum_literal = try mod.intern_pool.getOrPutString(sema.gpa, name), |
| 8416 | | })).toValue()); |
| 8409 | }))); |
| 8417 | 8410 | } |
| 8418 | 8411 | |
| 8419 | 8412 | fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -8449,12 +8442,12 @@ fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8449 | 8442 | const int_tag_ty = enum_tag_ty.intTagType(mod); |
| 8450 | 8443 | |
| 8451 | 8444 | if (try sema.typeHasOnePossibleValue(enum_tag_ty)) |opv| { |
| 8452 | | return sema.addConstant(try mod.getCoerced(opv, int_tag_ty)); |
| 8445 | return Air.internedToRef((try mod.getCoerced(opv, int_tag_ty)).toIntern()); |
| 8453 | 8446 | } |
| 8454 | 8447 | |
| 8455 | 8448 | if (try sema.resolveMaybeUndefVal(enum_tag)) |enum_tag_val| { |
| 8456 | 8449 | const val = try enum_tag_val.intFromEnum(enum_tag_ty, mod); |
| 8457 | | return sema.addConstant(val); |
| 8450 | return Air.internedToRef(val.toIntern()); |
| 8458 | 8451 | } |
| 8459 | 8452 | |
| 8460 | 8453 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | ... | @@ -8479,7 +8472,7 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8479 | 8472 | if (dest_ty.isNonexhaustiveEnum(mod)) { |
| 8480 | 8473 | const int_tag_ty = dest_ty.intTagType(mod); |
| 8481 | 8474 | if (try sema.intFitsInType(int_val, int_tag_ty, null)) { |
| 8482 | | return sema.addConstant(try mod.getCoerced(int_val, dest_ty)); |
| 8475 | return Air.internedToRef((try mod.getCoerced(int_val, dest_ty)).toIntern()); |
| 8483 | 8476 | } |
| 8484 | 8477 | const msg = msg: { |
| 8485 | 8478 | const msg = try sema.errMsg( |
| ... | ... | @@ -8511,11 +8504,11 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8511 | 8504 | }; |
| 8512 | 8505 | return sema.failWithOwnedErrorMsg(msg); |
| 8513 | 8506 | } |
| 8514 | | return sema.addConstant(try mod.getCoerced(int_val, dest_ty)); |
| 8507 | return Air.internedToRef((try mod.getCoerced(int_val, dest_ty)).toIntern()); |
| 8515 | 8508 | } |
| 8516 | 8509 | |
| 8517 | 8510 | if (try sema.typeHasOnePossibleValue(dest_ty)) |opv| { |
| 8518 | | const result = try sema.addConstant(opv); |
| 8511 | const result = Air.internedToRef(opv.toIntern()); |
| 8519 | 8512 | // The operand is runtime-known but the result is comptime-known. In |
| 8520 | 8513 | // this case we still need a safety check. |
| 8521 | 8514 | // TODO add a safety check here. we can't use is_named_enum_value - |
| ... | ... | @@ -8585,20 +8578,20 @@ fn analyzeOptionalPayloadPtr( |
| 8585 | 8578 | // we need to emit a runtime instruction to do it. |
| 8586 | 8579 | _ = try block.addTyOp(.optional_payload_ptr_set, child_pointer, optional_ptr); |
| 8587 | 8580 | } |
| 8588 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 8581 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 8589 | 8582 | .ty = child_pointer.toIntern(), |
| 8590 | 8583 | .addr = .{ .opt_payload = ptr_val.toIntern() }, |
| 8591 | | } })).toValue()); |
| 8584 | } }))); |
| 8592 | 8585 | } |
| 8593 | 8586 | if (try sema.pointerDeref(block, src, ptr_val, optional_ptr_ty)) |val| { |
| 8594 | 8587 | if (val.isNull(mod)) { |
| 8595 | 8588 | return sema.fail(block, src, "unable to unwrap null", .{}); |
| 8596 | 8589 | } |
| 8597 | 8590 | // The same Value represents the pointer to the optional and the payload. |
| 8598 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 8591 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 8599 | 8592 | .ty = child_pointer.toIntern(), |
| 8600 | 8593 | .addr = .{ .opt_payload = ptr_val.toIntern() }, |
| 8601 | | } })).toValue()); |
| 8594 | } }))); |
| 8602 | 8595 | } |
| 8603 | 8596 | } |
| 8604 | 8597 | |
| ... | ... | @@ -8654,7 +8647,7 @@ fn zirOptionalPayload( |
| 8654 | 8647 | |
| 8655 | 8648 | if (try sema.resolveDefinedValue(block, src, operand)) |val| { |
| 8656 | 8649 | return if (val.optionalValue(mod)) |payload| |
| 8657 | | sema.addConstant(payload) |
| 8650 | Air.internedToRef(payload.toIntern()) |
| 8658 | 8651 | else |
| 8659 | 8652 | sema.fail(block, src, "unable to unwrap null", .{}); |
| 8660 | 8653 | } |
| ... | ... | @@ -8705,9 +8698,7 @@ fn analyzeErrUnionPayload( |
| 8705 | 8698 | if (val.getErrorName(mod).unwrap()) |name| { |
| 8706 | 8699 | return sema.fail(block, src, "caught unexpected error '{}'", .{name.fmt(&mod.intern_pool)}); |
| 8707 | 8700 | } |
| 8708 | | return sema.addConstant( |
| 8709 | | mod.intern_pool.indexToKey(val.toIntern()).error_union.val.payload.toValue(), |
| 8710 | | ); |
| 8701 | return Air.internedToRef(mod.intern_pool.indexToKey(val.toIntern()).error_union.val.payload); |
| 8711 | 8702 | } |
| 8712 | 8703 | |
| 8713 | 8704 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -8775,19 +8766,19 @@ fn analyzeErrUnionPayloadPtr( |
| 8775 | 8766 | try sema.requireRuntimeBlock(block, src, null); |
| 8776 | 8767 | _ = try block.addTyOp(.errunion_payload_ptr_set, operand_pointer_ty, operand); |
| 8777 | 8768 | } |
| 8778 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 8769 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 8779 | 8770 | .ty = operand_pointer_ty.toIntern(), |
| 8780 | 8771 | .addr = .{ .eu_payload = ptr_val.toIntern() }, |
| 8781 | | } })).toValue()); |
| 8772 | } }))); |
| 8782 | 8773 | } |
| 8783 | 8774 | if (try sema.pointerDeref(block, src, ptr_val, operand_ty)) |val| { |
| 8784 | 8775 | if (val.getErrorName(mod).unwrap()) |name| { |
| 8785 | 8776 | return sema.fail(block, src, "caught unexpected error '{}'", .{name.fmt(&mod.intern_pool)}); |
| 8786 | 8777 | } |
| 8787 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 8778 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 8788 | 8779 | .ty = operand_pointer_ty.toIntern(), |
| 8789 | 8780 | .addr = .{ .eu_payload = ptr_val.toIntern() }, |
| 8790 | | } })).toValue()); |
| 8781 | } }))); |
| 8791 | 8782 | } |
| 8792 | 8783 | } |
| 8793 | 8784 | |
| ... | ... | @@ -8830,10 +8821,10 @@ fn analyzeErrUnionCode(sema: *Sema, block: *Block, src: LazySrcLoc, operand: Air |
| 8830 | 8821 | const result_ty = operand_ty.errorUnionSet(mod); |
| 8831 | 8822 | |
| 8832 | 8823 | if (try sema.resolveDefinedValue(block, src, operand)) |val| { |
| 8833 | | return sema.addConstant((try mod.intern(.{ .err = .{ |
| 8824 | return Air.internedToRef((try mod.intern(.{ .err = .{ |
| 8834 | 8825 | .ty = result_ty.toIntern(), |
| 8835 | 8826 | .name = mod.intern_pool.indexToKey(val.toIntern()).error_union.val.err_name, |
| 8836 | | } })).toValue()); |
| 8827 | } }))); |
| 8837 | 8828 | } |
| 8838 | 8829 | |
| 8839 | 8830 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -8863,7 +8854,7 @@ fn zirErrUnionCodePtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 8863 | 8854 | if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { |
| 8864 | 8855 | if (try sema.pointerDeref(block, src, pointer_val, operand_ty)) |val| { |
| 8865 | 8856 | assert(val.getErrorName(mod) != .none); |
| 8866 | | return sema.addConstant(val); |
| 8857 | return Air.internedToRef(val.toIntern()); |
| 8867 | 8858 | } |
| 8868 | 8859 | } |
| 8869 | 8860 | |
| ... | ... | @@ -9770,9 +9761,10 @@ fn zirIntFromPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 9770 | 9761 | return sema.fail(block, ptr_src, "expected pointer, found '{}'", .{ptr_ty.fmt(mod)}); |
| 9771 | 9762 | } |
| 9772 | 9763 | if (try sema.resolveMaybeUndefValIntable(ptr)) |ptr_val| { |
| 9773 | | return sema.addConstant( |
| 9774 | | try mod.intValue(Type.usize, (try ptr_val.getUnsignedIntAdvanced(mod, sema)).?), |
| 9775 | | ); |
| 9764 | return Air.internedToRef((try mod.intValue( |
| 9765 | Type.usize, |
| 9766 | (try ptr_val.getUnsignedIntAdvanced(mod, sema)).?, |
| 9767 | )).toIntern()); |
| 9776 | 9768 | } |
| 9777 | 9769 | try sema.requireRuntimeBlock(block, inst_data.src(), ptr_src); |
| 9778 | 9770 | return block.addUnOp(.int_from_ptr, ptr); |
| ... | ... | @@ -9881,7 +9873,7 @@ fn intCast( |
| 9881 | 9873 | if (wanted_bits == 0) { |
| 9882 | 9874 | const ok = if (is_vector) ok: { |
| 9883 | 9875 | const zeros = try sema.splat(operand_ty, try mod.intValue(operand_scalar_ty, 0)); |
| 9884 | | const zero_inst = try sema.addConstant(zeros); |
| 9876 | const zero_inst = Air.internedToRef(zeros.toIntern()); |
| 9885 | 9877 | const is_in_range = try block.addCmpVector(operand, zero_inst, .eq); |
| 9886 | 9878 | const all_in_range = try block.addInst(.{ |
| 9887 | 9879 | .tag = .reduce, |
| ... | ... | @@ -9889,7 +9881,7 @@ fn intCast( |
| 9889 | 9881 | }); |
| 9890 | 9882 | break :ok all_in_range; |
| 9891 | 9883 | } else ok: { |
| 9892 | | const zero_inst = try sema.addConstant(try mod.intValue(operand_ty, 0)); |
| 9884 | const zero_inst = Air.internedToRef((try mod.intValue(operand_ty, 0)).toIntern()); |
| 9893 | 9885 | const is_in_range = try block.addBinOp(.cmp_lte, operand, zero_inst); |
| 9894 | 9886 | break :ok is_in_range; |
| 9895 | 9887 | }; |
| ... | ... | @@ -9897,7 +9889,7 @@ fn intCast( |
| 9897 | 9889 | } |
| 9898 | 9890 | } |
| 9899 | 9891 | |
| 9900 | | return sema.addConstant(opv); |
| 9892 | return Air.internedToRef(opv.toIntern()); |
| 9901 | 9893 | } |
| 9902 | 9894 | |
| 9903 | 9895 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | ... | @@ -9914,7 +9906,7 @@ fn intCast( |
| 9914 | 9906 | if (wanted_value_bits < actual_value_bits) { |
| 9915 | 9907 | const dest_max_val_scalar = try dest_scalar_ty.maxIntScalar(mod, operand_scalar_ty); |
| 9916 | 9908 | const dest_max_val = try sema.splat(operand_ty, dest_max_val_scalar); |
| 9917 | | const dest_max = try sema.addConstant(dest_max_val); |
| 9909 | const dest_max = Air.internedToRef(dest_max_val.toIntern()); |
| 9918 | 9910 | const diff = try block.addBinOp(.sub_wrap, dest_max, operand); |
| 9919 | 9911 | |
| 9920 | 9912 | if (actual_info.signedness == .signed) { |
| ... | ... | @@ -9930,7 +9922,7 @@ fn intCast( |
| 9930 | 9922 | const range_minus_one = try dest_max_val.shl(one, unsigned_operand_ty, sema.arena, mod); |
| 9931 | 9923 | break :range_val try sema.intAdd(range_minus_one, one, unsigned_operand_ty, undefined); |
| 9932 | 9924 | } else try mod.getCoerced(dest_max_val, unsigned_operand_ty); |
| 9933 | | const dest_range = try sema.addConstant(dest_range_val); |
| 9925 | const dest_range = Air.internedToRef(dest_range_val.toIntern()); |
| 9934 | 9926 | |
| 9935 | 9927 | const ok = if (is_vector) ok: { |
| 9936 | 9928 | const is_in_range = try block.addCmpVector(diff_unsigned, dest_range, .lte); |
| ... | ... | @@ -9971,7 +9963,7 @@ fn intCast( |
| 9971 | 9963 | const ok = if (is_vector) ok: { |
| 9972 | 9964 | const scalar_zero = try mod.intValue(operand_scalar_ty, 0); |
| 9973 | 9965 | const zero_val = try sema.splat(operand_ty, scalar_zero); |
| 9974 | | const zero_inst = try sema.addConstant(zero_val); |
| 9966 | const zero_inst = Air.internedToRef(zero_val.toIntern()); |
| 9975 | 9967 | const is_in_range = try block.addCmpVector(operand, zero_inst, .gte); |
| 9976 | 9968 | const all_in_range = try block.addInst(.{ |
| 9977 | 9969 | .tag = if (block.float_mode == .Optimized) .reduce_optimized else .reduce, |
| ... | ... | @@ -9982,7 +9974,7 @@ fn intCast( |
| 9982 | 9974 | }); |
| 9983 | 9975 | break :ok all_in_range; |
| 9984 | 9976 | } else ok: { |
| 9985 | | const zero_inst = try sema.addConstant(try mod.intValue(operand_ty, 0)); |
| 9977 | const zero_inst = Air.internedToRef((try mod.intValue(operand_ty, 0)).toIntern()); |
| 9986 | 9978 | const is_in_range = try block.addBinOp(.cmp_gte, operand, zero_inst); |
| 9987 | 9979 | break :ok is_in_range; |
| 9988 | 9980 | }; |
| ... | ... | @@ -10172,7 +10164,7 @@ fn zirFloatCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 10172 | 10164 | } |
| 10173 | 10165 | |
| 10174 | 10166 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { |
| 10175 | | return sema.addConstant(try operand_val.floatCast(dest_ty, mod)); |
| 10167 | return Air.internedToRef((try operand_val.floatCast(dest_ty, mod)).toIntern()); |
| 10176 | 10168 | } |
| 10177 | 10169 | if (dest_is_comptime_float) { |
| 10178 | 10170 | return sema.fail(block, operand_src, "unable to cast runtime value to 'comptime_float'", .{}); |
| ... | ... | @@ -10260,7 +10252,7 @@ fn zirElemPtrImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 10260 | 10252 | const src = inst_data.src(); |
| 10261 | 10253 | const extra = sema.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data; |
| 10262 | 10254 | const array_ptr = try sema.resolveInst(extra.ptr); |
| 10263 | | const elem_index = try sema.addIntUnsigned(Type.usize, extra.index); |
| 10255 | const elem_index = try sema.mod.intRef(Type.usize, extra.index); |
| 10264 | 10256 | return sema.elemPtr(block, src, array_ptr, elem_index, src, true, true); |
| 10265 | 10257 | } |
| 10266 | 10258 | |
| ... | ... | @@ -10541,21 +10533,19 @@ const SwitchProngAnalysis = struct { |
| 10541 | 10533 | }, |
| 10542 | 10534 | }); |
| 10543 | 10535 | if (try sema.resolveDefinedValue(block, sema.src, spa.operand_ptr)) |union_ptr| { |
| 10544 | | return sema.addConstant( |
| 10545 | | (try mod.intern(.{ .ptr = .{ |
| 10546 | | .ty = ptr_field_ty.toIntern(), |
| 10547 | | .addr = .{ .field = .{ |
| 10548 | | .base = union_ptr.toIntern(), |
| 10549 | | .index = field_index, |
| 10550 | | } }, |
| 10551 | | } })).toValue(), |
| 10552 | | ); |
| 10536 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 10537 | .ty = ptr_field_ty.toIntern(), |
| 10538 | .addr = .{ .field = .{ |
| 10539 | .base = union_ptr.toIntern(), |
| 10540 | .index = field_index, |
| 10541 | } }, |
| 10542 | } }))); |
| 10553 | 10543 | } |
| 10554 | 10544 | return block.addStructFieldPtr(spa.operand_ptr, field_index, ptr_field_ty); |
| 10555 | 10545 | } else { |
| 10556 | 10546 | if (try sema.resolveDefinedValue(block, sema.src, spa.operand)) |union_val| { |
| 10557 | 10547 | const tag_and_val = mod.intern_pool.indexToKey(union_val.toIntern()).un; |
| 10558 | | return sema.addConstant(tag_and_val.val.toValue()); |
| 10548 | return Air.internedToRef(tag_and_val.val); |
| 10559 | 10549 | } |
| 10560 | 10550 | return block.addStructFieldVal(spa.operand, field_index, field_ty); |
| 10561 | 10551 | } |
| ... | ... | @@ -10607,7 +10597,7 @@ const SwitchProngAnalysis = struct { |
| 10607 | 10597 | // We need values to run PTR on, so make a bunch of undef constants. |
| 10608 | 10598 | const dummy_captures = try sema.arena.alloc(Air.Inst.Ref, case_vals.len); |
| 10609 | 10599 | for (dummy_captures, field_tys) |*dummy, field_ty| { |
| 10610 | | dummy.* = try sema.addConstUndef(field_ty); |
| 10600 | dummy.* = try mod.undefRef(field_ty); |
| 10611 | 10601 | } |
| 10612 | 10602 | |
| 10613 | 10603 | const case_srcs = try sema.arena.alloc(?LazySrcLoc, case_vals.len); |
| ... | ... | @@ -10685,16 +10675,14 @@ const SwitchProngAnalysis = struct { |
| 10685 | 10675 | } |
| 10686 | 10676 | |
| 10687 | 10677 | if (try sema.resolveDefinedValue(block, operand_src, spa.operand_ptr)) |op_ptr_val| { |
| 10688 | | if (op_ptr_val.isUndef(mod)) return sema.addConstUndef(capture_ptr_ty); |
| 10689 | | return sema.addConstant( |
| 10690 | | (try mod.intern(.{ .ptr = .{ |
| 10691 | | .ty = capture_ptr_ty.toIntern(), |
| 10692 | | .addr = .{ .field = .{ |
| 10693 | | .base = op_ptr_val.toIntern(), |
| 10694 | | .index = first_field_index, |
| 10695 | | } }, |
| 10696 | | } })).toValue(), |
| 10697 | | ); |
| 10678 | if (op_ptr_val.isUndef(mod)) return mod.undefRef(capture_ptr_ty); |
| 10679 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 10680 | .ty = capture_ptr_ty.toIntern(), |
| 10681 | .addr = .{ .field = .{ |
| 10682 | .base = op_ptr_val.toIntern(), |
| 10683 | .index = first_field_index, |
| 10684 | } }, |
| 10685 | } }))); |
| 10698 | 10686 | } |
| 10699 | 10687 | |
| 10700 | 10688 | try sema.requireRuntimeBlock(block, operand_src, null); |
| ... | ... | @@ -10702,10 +10690,10 @@ const SwitchProngAnalysis = struct { |
| 10702 | 10690 | } |
| 10703 | 10691 | |
| 10704 | 10692 | if (try sema.resolveDefinedValue(block, operand_src, spa.operand)) |operand_val| { |
| 10705 | | if (operand_val.isUndef(mod)) return sema.addConstUndef(capture_ty); |
| 10693 | if (operand_val.isUndef(mod)) return mod.undefRef(capture_ty); |
| 10706 | 10694 | const union_val = mod.intern_pool.indexToKey(operand_val.toIntern()).un; |
| 10707 | | if (union_val.tag.toValue().isUndef(mod)) return sema.addConstUndef(capture_ty); |
| 10708 | | const uncoerced = try sema.addConstant(union_val.val.toValue()); |
| 10695 | if (union_val.tag.toValue().isUndef(mod)) return mod.undefRef(capture_ty); |
| 10696 | const uncoerced = Air.internedToRef(union_val.val); |
| 10709 | 10697 | return sema.coerce(block, capture_ty, uncoerced, operand_src); |
| 10710 | 10698 | } |
| 10711 | 10699 | |
| ... | ... | @@ -10751,7 +10739,7 @@ const SwitchProngAnalysis = struct { |
| 10751 | 10739 | .tag = .block, |
| 10752 | 10740 | .data = .{ |
| 10753 | 10741 | .ty_pl = .{ |
| 10754 | | .ty = try sema.addType(capture_ty), |
| 10742 | .ty = Air.internedToRef(capture_ty.toIntern()), |
| 10755 | 10743 | .payload = undefined, // updated below |
| 10756 | 10744 | }, |
| 10757 | 10745 | }, |
| ... | ... | @@ -10896,7 +10884,7 @@ fn switchCond( |
| 10896 | 10884 | return sema.fail(block, src, "switch on type '{}'", .{operand_ty.fmt(mod)}); |
| 10897 | 10885 | } |
| 10898 | 10886 | if ((try sema.typeHasOnePossibleValue(operand_ty))) |opv| { |
| 10899 | | return sema.addConstant(opv); |
| 10887 | return Air.internedToRef(opv.toIntern()); |
| 10900 | 10888 | } |
| 10901 | 10889 | return operand; |
| 10902 | 10890 | }, |
| ... | ... | @@ -11876,7 +11864,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 11876 | 11864 | }) { |
| 11877 | 11865 | cases_len += 1; |
| 11878 | 11866 | |
| 11879 | | const item_ref = try sema.addConstant(item); |
| 11867 | const item_ref = Air.internedToRef(item.toIntern()); |
| 11880 | 11868 | |
| 11881 | 11869 | case_block.instructions.shrinkRetainingCapacity(0); |
| 11882 | 11870 | case_block.wip_capture_scope = child_block.wip_capture_scope; |
| ... | ... | @@ -12124,7 +12112,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 12124 | 12112 | cases_len += 1; |
| 12125 | 12113 | |
| 12126 | 12114 | const item_val = try mod.enumValueFieldIndex(operand_ty, @as(u32, @intCast(i))); |
| 12127 | | const item_ref = try sema.addConstant(item_val); |
| 12115 | const item_ref = Air.internedToRef(item_val.toIntern()); |
| 12128 | 12116 | |
| 12129 | 12117 | case_block.instructions.shrinkRetainingCapacity(0); |
| 12130 | 12118 | case_block.wip_capture_scope = child_block.wip_capture_scope; |
| ... | ... | @@ -12174,7 +12162,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 12174 | 12162 | .ty = operand_ty.toIntern(), |
| 12175 | 12163 | .name = error_name, |
| 12176 | 12164 | } }); |
| 12177 | | const item_ref = try sema.addConstant(item_val.toValue()); |
| 12165 | const item_ref = Air.internedToRef(item_val); |
| 12178 | 12166 | |
| 12179 | 12167 | case_block.instructions.shrinkRetainingCapacity(0); |
| 12180 | 12168 | case_block.wip_capture_scope = child_block.wip_capture_scope; |
| ... | ... | @@ -12205,7 +12193,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 12205 | 12193 | while (try it.next()) |cur| { |
| 12206 | 12194 | cases_len += 1; |
| 12207 | 12195 | |
| 12208 | | const item_ref = try sema.addConstant(cur.toValue()); |
| 12196 | const item_ref = Air.internedToRef(cur); |
| 12209 | 12197 | |
| 12210 | 12198 | case_block.instructions.shrinkRetainingCapacity(0); |
| 12211 | 12199 | case_block.wip_capture_scope = child_block.wip_capture_scope; |
| ... | ... | @@ -12483,7 +12471,7 @@ fn resolveSwitchItemVal( |
| 12483 | 12471 | |
| 12484 | 12472 | const val = try sema.resolveLazyValue(maybe_lazy); |
| 12485 | 12473 | const new_item = if (val.toIntern() != maybe_lazy.toIntern()) blk: { |
| 12486 | | break :blk try sema.addConstant(val); |
| 12474 | break :blk Air.internedToRef(val.toIntern()); |
| 12487 | 12475 | } else item; |
| 12488 | 12476 | |
| 12489 | 12477 | return .{ .ref = new_item, .val = val.toIntern() }; |
| ... | ... | @@ -12893,7 +12881,7 @@ fn zirImport(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 12893 | 12881 | const file_root_decl_index = result.file.root_decl.unwrap().?; |
| 12894 | 12882 | const file_root_decl = mod.declPtr(file_root_decl_index); |
| 12895 | 12883 | try mod.declareDeclDependency(sema.owner_decl_index, file_root_decl_index); |
| 12896 | | return sema.addConstant(file_root_decl.val); |
| 12884 | return Air.internedToRef(file_root_decl.val.toIntern()); |
| 12897 | 12885 | } |
| 12898 | 12886 | |
| 12899 | 12887 | fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -12952,10 +12940,10 @@ fn zirRetErrValueCode(sema: *Sema, inst: Zir.Inst.Index) CompileError!Air.Inst.R |
| 12952 | 12940 | const name = try mod.intern_pool.getOrPutString(sema.gpa, inst_data.get(sema.code)); |
| 12953 | 12941 | _ = try mod.getErrorValue(name); |
| 12954 | 12942 | const error_set_type = try mod.singleErrorSetType(name); |
| 12955 | | return sema.addConstant((try mod.intern(.{ .err = .{ |
| 12943 | return Air.internedToRef((try mod.intern(.{ .err = .{ |
| 12956 | 12944 | .ty = error_set_type.toIntern(), |
| 12957 | 12945 | .name = name, |
| 12958 | | } })).toValue()); |
| 12946 | } }))); |
| 12959 | 12947 | } |
| 12960 | 12948 | |
| 12961 | 12949 | fn zirShl( |
| ... | ... | @@ -12991,7 +12979,7 @@ fn zirShl( |
| 12991 | 12979 | |
| 12992 | 12980 | if (maybe_rhs_val) |rhs_val| { |
| 12993 | 12981 | if (rhs_val.isUndef(mod)) { |
| 12994 | | return sema.addConstUndef(sema.typeOf(lhs)); |
| 12982 | return mod.undefRef(sema.typeOf(lhs)); |
| 12995 | 12983 | } |
| 12996 | 12984 | // If rhs is 0, return lhs without doing any calculations. |
| 12997 | 12985 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | ... | @@ -13037,7 +13025,7 @@ fn zirShl( |
| 13037 | 13025 | } |
| 13038 | 13026 | |
| 13039 | 13027 | const runtime_src = if (maybe_lhs_val) |lhs_val| rs: { |
| 13040 | | if (lhs_val.isUndef(mod)) return sema.addConstUndef(lhs_ty); |
| 13028 | if (lhs_val.isUndef(mod)) return mod.undefRef(lhs_ty); |
| 13041 | 13029 | const rhs_val = maybe_rhs_val orelse { |
| 13042 | 13030 | if (scalar_ty.zigTypeTag(mod) == .ComptimeInt) { |
| 13043 | 13031 | return sema.fail(block, src, "LHS of shift must be a fixed-width integer type, or RHS must be comptime-known", .{}); |
| ... | ... | @@ -13070,7 +13058,7 @@ fn zirShl( |
| 13070 | 13058 | else => unreachable, |
| 13071 | 13059 | }; |
| 13072 | 13060 | |
| 13073 | | return sema.addConstant(val); |
| 13061 | return Air.internedToRef(val.toIntern()); |
| 13074 | 13062 | } else lhs_src; |
| 13075 | 13063 | |
| 13076 | 13064 | const new_rhs = if (air_tag == .shl_sat) rhs: { |
| ... | ... | @@ -13078,9 +13066,7 @@ fn zirShl( |
| 13078 | 13066 | if (rhs_is_comptime_int or |
| 13079 | 13067 | scalar_rhs_ty.intInfo(mod).bits > scalar_ty.intInfo(mod).bits) |
| 13080 | 13068 | { |
| 13081 | | const max_int = try sema.addConstant( |
| 13082 | | try lhs_ty.maxInt(mod, lhs_ty), |
| 13083 | | ); |
| 13069 | const max_int = Air.internedToRef((try lhs_ty.maxInt(mod, lhs_ty)).toIntern()); |
| 13084 | 13070 | const rhs_limited = try sema.analyzeMinMax(block, rhs_src, .min, &.{ rhs, max_int }, &.{ rhs_src, rhs_src }); |
| 13085 | 13071 | break :rhs try sema.intCast(block, src, lhs_ty, rhs_src, rhs_limited, rhs_src, false); |
| 13086 | 13072 | } else { |
| ... | ... | @@ -13094,7 +13080,7 @@ fn zirShl( |
| 13094 | 13080 | if (!std.math.isPowerOfTwo(bit_count)) { |
| 13095 | 13081 | const bit_count_val = try mod.intValue(scalar_rhs_ty, bit_count); |
| 13096 | 13082 | const ok = if (rhs_ty.zigTypeTag(mod) == .Vector) ok: { |
| 13097 | | const bit_count_inst = try sema.addConstant(try sema.splat(rhs_ty, bit_count_val)); |
| 13083 | const bit_count_inst = Air.internedToRef((try sema.splat(rhs_ty, bit_count_val)).toIntern()); |
| 13098 | 13084 | const lt = try block.addCmpVector(rhs, bit_count_inst, .lt); |
| 13099 | 13085 | break :ok try block.addInst(.{ |
| 13100 | 13086 | .tag = .reduce, |
| ... | ... | @@ -13104,7 +13090,7 @@ fn zirShl( |
| 13104 | 13090 | } }, |
| 13105 | 13091 | }); |
| 13106 | 13092 | } else ok: { |
| 13107 | | const bit_count_inst = try sema.addConstant(bit_count_val); |
| 13093 | const bit_count_inst = Air.internedToRef(bit_count_val.toIntern()); |
| 13108 | 13094 | break :ok try block.addBinOp(.cmp_lt, rhs, bit_count_inst); |
| 13109 | 13095 | }; |
| 13110 | 13096 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); |
| ... | ... | @@ -13115,7 +13101,7 @@ fn zirShl( |
| 13115 | 13101 | const op_ov = try block.addInst(.{ |
| 13116 | 13102 | .tag = .shl_with_overflow, |
| 13117 | 13103 | .data = .{ .ty_pl = .{ |
| 13118 | | .ty = try sema.addType(op_ov_tuple_ty), |
| 13104 | .ty = Air.internedToRef(op_ov_tuple_ty.toIntern()), |
| 13119 | 13105 | .payload = try sema.addExtra(Air.Bin{ |
| 13120 | 13106 | .lhs = lhs, |
| 13121 | 13107 | .rhs = rhs, |
| ... | ... | @@ -13133,7 +13119,7 @@ fn zirShl( |
| 13133 | 13119 | }) |
| 13134 | 13120 | else |
| 13135 | 13121 | ov_bit; |
| 13136 | | const zero_ov = try sema.addConstant(try mod.intValue(Type.u1, 0)); |
| 13122 | const zero_ov = Air.internedToRef((try mod.intValue(Type.u1, 0)).toIntern()); |
| 13137 | 13123 | const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov); |
| 13138 | 13124 | |
| 13139 | 13125 | try sema.addSafetyCheck(block, src, no_ov, .shl_overflow); |
| ... | ... | @@ -13171,7 +13157,7 @@ fn zirShr( |
| 13171 | 13157 | |
| 13172 | 13158 | const runtime_src = if (maybe_rhs_val) |rhs_val| rs: { |
| 13173 | 13159 | if (rhs_val.isUndef(mod)) { |
| 13174 | | return sema.addConstUndef(lhs_ty); |
| 13160 | return mod.undefRef(lhs_ty); |
| 13175 | 13161 | } |
| 13176 | 13162 | // If rhs is 0, return lhs without doing any calculations. |
| 13177 | 13163 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | ... | @@ -13216,7 +13202,7 @@ fn zirShr( |
| 13216 | 13202 | } |
| 13217 | 13203 | if (maybe_lhs_val) |lhs_val| { |
| 13218 | 13204 | if (lhs_val.isUndef(mod)) { |
| 13219 | | return sema.addConstUndef(lhs_ty); |
| 13205 | return mod.undefRef(lhs_ty); |
| 13220 | 13206 | } |
| 13221 | 13207 | if (air_tag == .shr_exact) { |
| 13222 | 13208 | // Detect if any ones would be shifted out. |
| ... | ... | @@ -13226,7 +13212,7 @@ fn zirShr( |
| 13226 | 13212 | } |
| 13227 | 13213 | } |
| 13228 | 13214 | const val = try lhs_val.shr(rhs_val, lhs_ty, sema.arena, mod); |
| 13229 | | return sema.addConstant(val); |
| 13215 | return Air.internedToRef(val.toIntern()); |
| 13230 | 13216 | } else { |
| 13231 | 13217 | break :rs lhs_src; |
| 13232 | 13218 | } |
| ... | ... | @@ -13244,7 +13230,7 @@ fn zirShr( |
| 13244 | 13230 | const bit_count_val = try mod.intValue(rhs_ty.scalarType(mod), bit_count); |
| 13245 | 13231 | |
| 13246 | 13232 | const ok = if (rhs_ty.zigTypeTag(mod) == .Vector) ok: { |
| 13247 | | const bit_count_inst = try sema.addConstant(try sema.splat(rhs_ty, bit_count_val)); |
| 13233 | const bit_count_inst = Air.internedToRef((try sema.splat(rhs_ty, bit_count_val)).toIntern()); |
| 13248 | 13234 | const lt = try block.addCmpVector(rhs, bit_count_inst, .lt); |
| 13249 | 13235 | break :ok try block.addInst(.{ |
| 13250 | 13236 | .tag = .reduce, |
| ... | ... | @@ -13254,7 +13240,7 @@ fn zirShr( |
| 13254 | 13240 | } }, |
| 13255 | 13241 | }); |
| 13256 | 13242 | } else ok: { |
| 13257 | | const bit_count_inst = try sema.addConstant(bit_count_val); |
| 13243 | const bit_count_inst = Air.internedToRef(bit_count_val.toIntern()); |
| 13258 | 13244 | break :ok try block.addBinOp(.cmp_lt, rhs, bit_count_inst); |
| 13259 | 13245 | }; |
| 13260 | 13246 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); |
| ... | ... | @@ -13326,7 +13312,7 @@ fn zirBitwise( |
| 13326 | 13312 | .xor => try lhs_val.bitwiseXor(rhs_val, resolved_type, sema.arena, mod), |
| 13327 | 13313 | else => unreachable, |
| 13328 | 13314 | }; |
| 13329 | | return sema.addConstant(result_val); |
| 13315 | return Air.internedToRef(result_val.toIntern()); |
| 13330 | 13316 | } else { |
| 13331 | 13317 | break :runtime rhs_src; |
| 13332 | 13318 | } |
| ... | ... | @@ -13360,7 +13346,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 13360 | 13346 | |
| 13361 | 13347 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 13362 | 13348 | if (val.isUndef(mod)) { |
| 13363 | | return sema.addConstUndef(operand_type); |
| 13349 | return mod.undefRef(operand_type); |
| 13364 | 13350 | } else if (operand_type.zigTypeTag(mod) == .Vector) { |
| 13365 | 13351 | const vec_len = try sema.usizeCast(block, operand_src, operand_type.vectorLen(mod)); |
| 13366 | 13352 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| ... | ... | @@ -13368,13 +13354,13 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 13368 | 13354 | const elem_val = try val.elemValue(mod, i); |
| 13369 | 13355 | elem.* = try (try elem_val.bitwiseNot(scalar_type, sema.arena, mod)).intern(scalar_type, mod); |
| 13370 | 13356 | } |
| 13371 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 13357 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 13372 | 13358 | .ty = operand_type.toIntern(), |
| 13373 | 13359 | .storage = .{ .elems = elems }, |
| 13374 | | } })).toValue()); |
| 13360 | } }))); |
| 13375 | 13361 | } else { |
| 13376 | 13362 | const result_val = try val.bitwiseNot(operand_type, sema.arena, mod); |
| 13377 | | return sema.addConstant(result_val); |
| 13363 | return Air.internedToRef(result_val.toIntern()); |
| 13378 | 13364 | } |
| 13379 | 13365 | } |
| 13380 | 13366 | |
| ... | ... | @@ -13401,7 +13387,7 @@ fn analyzeTupleCat( |
| 13401 | 13387 | const dest_fields = lhs_len + rhs_len; |
| 13402 | 13388 | |
| 13403 | 13389 | if (dest_fields == 0) { |
| 13404 | | return sema.addConstant(Value.empty_struct); |
| 13390 | return Air.internedToRef(Value.empty_struct.toIntern()); |
| 13405 | 13391 | } |
| 13406 | 13392 | if (lhs_len == 0) { |
| 13407 | 13393 | return rhs; |
| ... | ... | @@ -13452,7 +13438,7 @@ fn analyzeTupleCat( |
| 13452 | 13438 | .ty = tuple_ty, |
| 13453 | 13439 | .storage = .{ .elems = values }, |
| 13454 | 13440 | } }); |
| 13455 | | return sema.addConstant(tuple_val.toValue()); |
| 13441 | return Air.internedToRef(tuple_val); |
| 13456 | 13442 | }; |
| 13457 | 13443 | |
| 13458 | 13444 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | ... | @@ -13523,9 +13509,9 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13523 | 13509 | // coercing it to the peer-resolved element type. |
| 13524 | 13510 | const res_sent_val: ?Value = s: { |
| 13525 | 13511 | if (lhs_info.sentinel) |lhs_sent_val| { |
| 13526 | | const lhs_sent = try sema.addConstant(lhs_sent_val); |
| 13512 | const lhs_sent = Air.internedToRef(lhs_sent_val.toIntern()); |
| 13527 | 13513 | if (rhs_info.sentinel) |rhs_sent_val| { |
| 13528 | | const rhs_sent = try sema.addConstant(rhs_sent_val); |
| 13514 | const rhs_sent = Air.internedToRef(rhs_sent_val.toIntern()); |
| 13529 | 13515 | const lhs_sent_casted = try sema.coerce(block, resolved_elem_ty, lhs_sent, lhs_src); |
| 13530 | 13516 | const rhs_sent_casted = try sema.coerce(block, resolved_elem_ty, rhs_sent, rhs_src); |
| 13531 | 13517 | const lhs_sent_casted_val = try sema.resolveConstValue(block, lhs_src, lhs_sent_casted, "array sentinel value must be comptime-known"); |
| ... | ... | @@ -13542,7 +13528,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13542 | 13528 | } |
| 13543 | 13529 | } else { |
| 13544 | 13530 | if (rhs_info.sentinel) |rhs_sent_val| { |
| 13545 | | const rhs_sent = try sema.addConstant(rhs_sent_val); |
| 13531 | const rhs_sent = Air.internedToRef(rhs_sent_val.toIntern()); |
| 13546 | 13532 | const rhs_sent_casted = try sema.coerce(block, resolved_elem_ty, rhs_sent, rhs_src); |
| 13547 | 13533 | const rhs_sent_casted_val = try sema.resolveConstValue(block, rhs_src, rhs_sent_casted, "array sentinel value must be comptime-known"); |
| 13548 | 13534 | break :s rhs_sent_casted_val; |
| ... | ... | @@ -13600,7 +13586,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13600 | 13586 | const lhs_elem_i = elem_i; |
| 13601 | 13587 | const elem_default_val = if (lhs_is_tuple) lhs_ty.structFieldDefaultValue(lhs_elem_i, mod) else Value.@"unreachable"; |
| 13602 | 13588 | const elem_val = if (elem_default_val.toIntern() == .unreachable_value) try lhs_sub_val.elemValue(mod, lhs_elem_i) else elem_default_val; |
| 13603 | | const elem_val_inst = try sema.addConstant(elem_val); |
| 13589 | const elem_val_inst = Air.internedToRef(elem_val.toIntern()); |
| 13604 | 13590 | const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); |
| 13605 | 13591 | const coerced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); |
| 13606 | 13592 | element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod); |
| ... | ... | @@ -13609,7 +13595,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13609 | 13595 | const rhs_elem_i = elem_i - lhs_len; |
| 13610 | 13596 | const elem_default_val = if (rhs_is_tuple) rhs_ty.structFieldDefaultValue(rhs_elem_i, mod) else Value.@"unreachable"; |
| 13611 | 13597 | const elem_val = if (elem_default_val.toIntern() == .unreachable_value) try rhs_sub_val.elemValue(mod, rhs_elem_i) else elem_default_val; |
| 13612 | | const elem_val_inst = try sema.addConstant(elem_val); |
| 13598 | const elem_val_inst = Air.internedToRef(elem_val.toIntern()); |
| 13613 | 13599 | const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); |
| 13614 | 13600 | const coerced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); |
| 13615 | 13601 | element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod); |
| ... | ... | @@ -13636,22 +13622,22 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13636 | 13622 | |
| 13637 | 13623 | var elem_i: usize = 0; |
| 13638 | 13624 | while (elem_i < lhs_len) : (elem_i += 1) { |
| 13639 | | const elem_index = try sema.addIntUnsigned(Type.usize, elem_i); |
| 13625 | const elem_index = try mod.intRef(Type.usize, elem_i); |
| 13640 | 13626 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13641 | 13627 | const init = try sema.elemVal(block, lhs_src, lhs, elem_index, src, true); |
| 13642 | 13628 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); |
| 13643 | 13629 | } |
| 13644 | 13630 | while (elem_i < result_len) : (elem_i += 1) { |
| 13645 | | const elem_index = try sema.addIntUnsigned(Type.usize, elem_i); |
| 13646 | | const rhs_index = try sema.addIntUnsigned(Type.usize, elem_i - lhs_len); |
| 13631 | const elem_index = try mod.intRef(Type.usize, elem_i); |
| 13632 | const rhs_index = try mod.intRef(Type.usize, elem_i - lhs_len); |
| 13647 | 13633 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13648 | 13634 | const init = try sema.elemVal(block, rhs_src, rhs, rhs_index, src, true); |
| 13649 | 13635 | try sema.storePtr2(block, src, elem_ptr, src, init, rhs_src, .store); |
| 13650 | 13636 | } |
| 13651 | 13637 | if (res_sent_val) |sent_val| { |
| 13652 | | const elem_index = try sema.addIntUnsigned(Type.usize, result_len); |
| 13638 | const elem_index = try mod.intRef(Type.usize, result_len); |
| 13653 | 13639 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13654 | | const init = try sema.addConstant(try mod.getCoerced(sent_val, lhs_info.elem_type)); |
| 13640 | const init = Air.internedToRef((try mod.getCoerced(sent_val, lhs_info.elem_type)).toIntern()); |
| 13655 | 13641 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); |
| 13656 | 13642 | } |
| 13657 | 13643 | |
| ... | ... | @@ -13662,12 +13648,12 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13662 | 13648 | { |
| 13663 | 13649 | var elem_i: usize = 0; |
| 13664 | 13650 | while (elem_i < lhs_len) : (elem_i += 1) { |
| 13665 | | const index = try sema.addIntUnsigned(Type.usize, elem_i); |
| 13651 | const index = try mod.intRef(Type.usize, elem_i); |
| 13666 | 13652 | const init = try sema.elemVal(block, lhs_src, lhs, index, src, true); |
| 13667 | 13653 | element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, lhs_src); |
| 13668 | 13654 | } |
| 13669 | 13655 | while (elem_i < result_len) : (elem_i += 1) { |
| 13670 | | const index = try sema.addIntUnsigned(Type.usize, elem_i - lhs_len); |
| 13656 | const index = try mod.intRef(Type.usize, elem_i - lhs_len); |
| 13671 | 13657 | const init = try sema.elemVal(block, rhs_src, rhs, index, src, true); |
| 13672 | 13658 | element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, rhs_src); |
| 13673 | 13659 | } |
| ... | ... | @@ -13739,7 +13725,7 @@ fn analyzeTupleMul( |
| 13739 | 13725 | return sema.fail(block, rhs_src, "operation results in overflow", .{}); |
| 13740 | 13726 | |
| 13741 | 13727 | if (final_len == 0) { |
| 13742 | | return sema.addConstant(Value.empty_struct); |
| 13728 | return Air.internedToRef(Value.empty_struct.toIntern()); |
| 13743 | 13729 | } |
| 13744 | 13730 | const types = try sema.arena.alloc(InternPool.Index, final_len); |
| 13745 | 13731 | const values = try sema.arena.alloc(InternPool.Index, final_len); |
| ... | ... | @@ -13773,7 +13759,7 @@ fn analyzeTupleMul( |
| 13773 | 13759 | .ty = tuple_ty, |
| 13774 | 13760 | .storage = .{ .elems = values }, |
| 13775 | 13761 | } }); |
| 13776 | | return sema.addConstant(tuple_val.toValue()); |
| 13762 | return Air.internedToRef(tuple_val); |
| 13777 | 13763 | }; |
| 13778 | 13764 | |
| 13779 | 13765 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | ... | @@ -13897,18 +13883,18 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13897 | 13883 | while (elem_i < result_len) { |
| 13898 | 13884 | var lhs_i: usize = 0; |
| 13899 | 13885 | while (lhs_i < lhs_len) : (lhs_i += 1) { |
| 13900 | | const elem_index = try sema.addIntUnsigned(Type.usize, elem_i); |
| 13886 | const elem_index = try mod.intRef(Type.usize, elem_i); |
| 13901 | 13887 | elem_i += 1; |
| 13902 | | const lhs_index = try sema.addIntUnsigned(Type.usize, lhs_i); |
| 13888 | const lhs_index = try mod.intRef(Type.usize, lhs_i); |
| 13903 | 13889 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13904 | 13890 | const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true); |
| 13905 | 13891 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); |
| 13906 | 13892 | } |
| 13907 | 13893 | } |
| 13908 | 13894 | if (lhs_info.sentinel) |sent_val| { |
| 13909 | | const elem_index = try sema.addIntUnsigned(Type.usize, result_len); |
| 13895 | const elem_index = try mod.intRef(Type.usize, result_len); |
| 13910 | 13896 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13911 | | const init = try sema.addConstant(sent_val); |
| 13897 | const init = Air.internedToRef(sent_val.toIntern()); |
| 13912 | 13898 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); |
| 13913 | 13899 | } |
| 13914 | 13900 | |
| ... | ... | @@ -13920,7 +13906,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13920 | 13906 | while (elem_i < result_len) { |
| 13921 | 13907 | var lhs_i: usize = 0; |
| 13922 | 13908 | while (lhs_i < lhs_len) : (lhs_i += 1) { |
| 13923 | | const lhs_index = try sema.addIntUnsigned(Type.usize, lhs_i); |
| 13909 | const lhs_index = try mod.intRef(Type.usize, lhs_i); |
| 13924 | 13910 | const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true); |
| 13925 | 13911 | element_refs[elem_i] = init; |
| 13926 | 13912 | elem_i += 1; |
| ... | ... | @@ -13951,14 +13937,14 @@ fn zirNegate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 13951 | 13937 | if (rhs_scalar_ty.isAnyFloat()) { |
| 13952 | 13938 | // We handle float negation here to ensure negative zero is represented in the bits. |
| 13953 | 13939 | if (try sema.resolveMaybeUndefVal(rhs)) |rhs_val| { |
| 13954 | | if (rhs_val.isUndef(mod)) return sema.addConstUndef(rhs_ty); |
| 13955 | | return sema.addConstant(try rhs_val.floatNeg(rhs_ty, sema.arena, mod)); |
| 13940 | if (rhs_val.isUndef(mod)) return mod.undefRef(rhs_ty); |
| 13941 | return Air.internedToRef((try rhs_val.floatNeg(rhs_ty, sema.arena, mod)).toIntern()); |
| 13956 | 13942 | } |
| 13957 | 13943 | try sema.requireRuntimeBlock(block, src, null); |
| 13958 | 13944 | return block.addUnOp(if (block.float_mode == .Optimized) .neg_optimized else .neg, rhs); |
| 13959 | 13945 | } |
| 13960 | 13946 | |
| 13961 | | const lhs = try sema.addConstant(try sema.splat(rhs_ty, try mod.intValue(rhs_scalar_ty, 0))); |
| 13947 | const lhs = Air.internedToRef((try sema.splat(rhs_ty, try mod.intValue(rhs_scalar_ty, 0))).toIntern()); |
| 13962 | 13948 | return sema.analyzeArithmetic(block, .sub, lhs, rhs, src, lhs_src, rhs_src, true); |
| 13963 | 13949 | } |
| 13964 | 13950 | |
| ... | ... | @@ -13978,7 +13964,7 @@ fn zirNegateWrap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 13978 | 13964 | else => return sema.fail(block, src, "negation of type '{}'", .{rhs_ty.fmt(mod)}), |
| 13979 | 13965 | } |
| 13980 | 13966 | |
| 13981 | | const lhs = try sema.addConstant(try sema.splat(rhs_ty, try mod.intValue(rhs_scalar_ty, 0))); |
| 13967 | const lhs = Air.internedToRef((try sema.splat(rhs_ty, try mod.intValue(rhs_scalar_ty, 0))).toIntern()); |
| 13982 | 13968 | return sema.analyzeArithmetic(block, .subwrap, lhs, rhs, src, lhs_src, rhs_src, true); |
| 13983 | 13969 | } |
| 13984 | 13970 | |
| ... | ... | @@ -14095,7 +14081,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14095 | 14081 | else => unreachable, |
| 14096 | 14082 | }; |
| 14097 | 14083 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 14098 | | return sema.addConstant(zero_val); |
| 14084 | return Air.internedToRef(zero_val.toIntern()); |
| 14099 | 14085 | } |
| 14100 | 14086 | } |
| 14101 | 14087 | } |
| ... | ... | @@ -14118,12 +14104,12 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14118 | 14104 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { |
| 14119 | 14105 | if (maybe_rhs_val) |rhs_val| { |
| 14120 | 14106 | if (try sema.compareAll(rhs_val, .neq, try mod.intValue(resolved_type, -1), resolved_type)) { |
| 14121 | | return sema.addConstUndef(resolved_type); |
| 14107 | return mod.undefRef(resolved_type); |
| 14122 | 14108 | } |
| 14123 | 14109 | } |
| 14124 | 14110 | return sema.failWithUseOfUndef(block, rhs_src); |
| 14125 | 14111 | } |
| 14126 | | return sema.addConstUndef(resolved_type); |
| 14112 | return mod.undefRef(resolved_type); |
| 14127 | 14113 | } |
| 14128 | 14114 | |
| 14129 | 14115 | if (maybe_rhs_val) |rhs_val| { |
| ... | ... | @@ -14133,11 +14119,9 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14133 | 14119 | if (overflow_idx) |vec_idx| { |
| 14134 | 14120 | return sema.failWithIntegerOverflow(block, src, resolved_type, res, vec_idx); |
| 14135 | 14121 | } |
| 14136 | | return sema.addConstant(res); |
| 14122 | return Air.internedToRef(res.toIntern()); |
| 14137 | 14123 | } else { |
| 14138 | | return sema.addConstant( |
| 14139 | | try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod), |
| 14140 | | ); |
| 14124 | return Air.internedToRef((try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14141 | 14125 | } |
| 14142 | 14126 | } else { |
| 14143 | 14127 | break :rs rhs_src; |
| ... | ... | @@ -14234,7 +14218,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14234 | 14218 | else => unreachable, |
| 14235 | 14219 | }; |
| 14236 | 14220 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 14237 | | return sema.addConstant(zero_val); |
| 14221 | return Air.internedToRef(zero_val.toIntern()); |
| 14238 | 14222 | } |
| 14239 | 14223 | } |
| 14240 | 14224 | } |
| ... | ... | @@ -14259,15 +14243,13 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14259 | 14243 | if (overflow_idx) |vec_idx| { |
| 14260 | 14244 | return sema.failWithIntegerOverflow(block, src, resolved_type, res, vec_idx); |
| 14261 | 14245 | } |
| 14262 | | return sema.addConstant(res); |
| 14246 | return Air.internedToRef(res.toIntern()); |
| 14263 | 14247 | } else { |
| 14264 | 14248 | const modulus_val = try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod); |
| 14265 | 14249 | if (!(modulus_val.compareAllWithZero(.eq, mod))) { |
| 14266 | 14250 | return sema.fail(block, src, "exact division produced remainder", .{}); |
| 14267 | 14251 | } |
| 14268 | | return sema.addConstant( |
| 14269 | | try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod), |
| 14270 | | ); |
| 14252 | return Air.internedToRef((try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14271 | 14253 | } |
| 14272 | 14254 | } else break :rs rhs_src; |
| 14273 | 14255 | } else break :rs lhs_src; |
| ... | ... | @@ -14317,7 +14299,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14317 | 14299 | }; |
| 14318 | 14300 | if (resolved_type.zigTypeTag(mod) == .Vector) { |
| 14319 | 14301 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 14320 | | const zero = try sema.addConstant(zero_val); |
| 14302 | const zero = Air.internedToRef(zero_val.toIntern()); |
| 14321 | 14303 | const eql = try block.addCmpVector(remainder, zero, .eq); |
| 14322 | 14304 | break :ok try block.addInst(.{ |
| 14323 | 14305 | .tag = .reduce, |
| ... | ... | @@ -14327,7 +14309,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14327 | 14309 | } }, |
| 14328 | 14310 | }); |
| 14329 | 14311 | } else { |
| 14330 | | const zero = try sema.addConstant(scalar_zero); |
| 14312 | const zero = Air.internedToRef(scalar_zero.toIntern()); |
| 14331 | 14313 | const is_in_range = try block.addBinOp(.cmp_eq, remainder, zero); |
| 14332 | 14314 | break :ok is_in_range; |
| 14333 | 14315 | } |
| ... | ... | @@ -14404,7 +14386,7 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14404 | 14386 | else => unreachable, |
| 14405 | 14387 | }; |
| 14406 | 14388 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 14407 | | return sema.addConstant(zero_val); |
| 14389 | return Air.internedToRef(zero_val.toIntern()); |
| 14408 | 14390 | } |
| 14409 | 14391 | } |
| 14410 | 14392 | } |
| ... | ... | @@ -14422,23 +14404,19 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14422 | 14404 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { |
| 14423 | 14405 | if (maybe_rhs_val) |rhs_val| { |
| 14424 | 14406 | if (try sema.compareAll(rhs_val, .neq, try mod.intValue(resolved_type, -1), resolved_type)) { |
| 14425 | | return sema.addConstUndef(resolved_type); |
| 14407 | return mod.undefRef(resolved_type); |
| 14426 | 14408 | } |
| 14427 | 14409 | } |
| 14428 | 14410 | return sema.failWithUseOfUndef(block, rhs_src); |
| 14429 | 14411 | } |
| 14430 | | return sema.addConstUndef(resolved_type); |
| 14412 | return mod.undefRef(resolved_type); |
| 14431 | 14413 | } |
| 14432 | 14414 | |
| 14433 | 14415 | if (maybe_rhs_val) |rhs_val| { |
| 14434 | 14416 | if (is_int) { |
| 14435 | | return sema.addConstant( |
| 14436 | | try lhs_val.intDivFloor(rhs_val, resolved_type, sema.arena, mod), |
| 14437 | | ); |
| 14417 | return Air.internedToRef((try lhs_val.intDivFloor(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14438 | 14418 | } else { |
| 14439 | | return sema.addConstant( |
| 14440 | | try lhs_val.floatDivFloor(rhs_val, resolved_type, sema.arena, mod), |
| 14441 | | ); |
| 14419 | return Air.internedToRef((try lhs_val.floatDivFloor(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14442 | 14420 | } |
| 14443 | 14421 | } else break :rs rhs_src; |
| 14444 | 14422 | } else break :rs lhs_src; |
| ... | ... | @@ -14519,7 +14497,7 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14519 | 14497 | else => unreachable, |
| 14520 | 14498 | }; |
| 14521 | 14499 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 14522 | | return sema.addConstant(zero_val); |
| 14500 | return Air.internedToRef(zero_val.toIntern()); |
| 14523 | 14501 | } |
| 14524 | 14502 | } |
| 14525 | 14503 | } |
| ... | ... | @@ -14536,12 +14514,12 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14536 | 14514 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { |
| 14537 | 14515 | if (maybe_rhs_val) |rhs_val| { |
| 14538 | 14516 | if (try sema.compareAll(rhs_val, .neq, try mod.intValue(resolved_type, -1), resolved_type)) { |
| 14539 | | return sema.addConstUndef(resolved_type); |
| 14517 | return mod.undefRef(resolved_type); |
| 14540 | 14518 | } |
| 14541 | 14519 | } |
| 14542 | 14520 | return sema.failWithUseOfUndef(block, rhs_src); |
| 14543 | 14521 | } |
| 14544 | | return sema.addConstUndef(resolved_type); |
| 14522 | return mod.undefRef(resolved_type); |
| 14545 | 14523 | } |
| 14546 | 14524 | |
| 14547 | 14525 | if (maybe_rhs_val) |rhs_val| { |
| ... | ... | @@ -14551,11 +14529,9 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14551 | 14529 | if (overflow_idx) |vec_idx| { |
| 14552 | 14530 | return sema.failWithIntegerOverflow(block, src, resolved_type, res, vec_idx); |
| 14553 | 14531 | } |
| 14554 | | return sema.addConstant(res); |
| 14532 | return Air.internedToRef(res.toIntern()); |
| 14555 | 14533 | } else { |
| 14556 | | return sema.addConstant( |
| 14557 | | try lhs_val.floatDivTrunc(rhs_val, resolved_type, sema.arena, mod), |
| 14558 | | ); |
| 14534 | return Air.internedToRef((try lhs_val.floatDivTrunc(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14559 | 14535 | } |
| 14560 | 14536 | } else break :rs rhs_src; |
| 14561 | 14537 | } else break :rs lhs_src; |
| ... | ... | @@ -14612,11 +14588,11 @@ fn addDivIntOverflowSafety( |
| 14612 | 14588 | var ok: Air.Inst.Ref = .none; |
| 14613 | 14589 | if (resolved_type.zigTypeTag(mod) == .Vector) { |
| 14614 | 14590 | if (maybe_lhs_val == null) { |
| 14615 | | const min_int_ref = try sema.addConstant(min_int); |
| 14591 | const min_int_ref = Air.internedToRef(min_int.toIntern()); |
| 14616 | 14592 | ok = try block.addCmpVector(casted_lhs, min_int_ref, .neq); |
| 14617 | 14593 | } |
| 14618 | 14594 | if (maybe_rhs_val == null) { |
| 14619 | | const neg_one_ref = try sema.addConstant(neg_one); |
| 14595 | const neg_one_ref = Air.internedToRef(neg_one.toIntern()); |
| 14620 | 14596 | const rhs_ok = try block.addCmpVector(casted_rhs, neg_one_ref, .neq); |
| 14621 | 14597 | if (ok == .none) { |
| 14622 | 14598 | ok = rhs_ok; |
| ... | ... | @@ -14634,11 +14610,11 @@ fn addDivIntOverflowSafety( |
| 14634 | 14610 | }); |
| 14635 | 14611 | } else { |
| 14636 | 14612 | if (maybe_lhs_val == null) { |
| 14637 | | const min_int_ref = try sema.addConstant(min_int); |
| 14613 | const min_int_ref = Air.internedToRef(min_int.toIntern()); |
| 14638 | 14614 | ok = try block.addBinOp(.cmp_neq, casted_lhs, min_int_ref); |
| 14639 | 14615 | } |
| 14640 | 14616 | if (maybe_rhs_val == null) { |
| 14641 | | const neg_one_ref = try sema.addConstant(neg_one); |
| 14617 | const neg_one_ref = Air.internedToRef(neg_one.toIntern()); |
| 14642 | 14618 | const rhs_ok = try block.addBinOp(.cmp_neq, casted_rhs, neg_one_ref); |
| 14643 | 14619 | if (ok == .none) { |
| 14644 | 14620 | ok = rhs_ok; |
| ... | ... | @@ -14674,7 +14650,7 @@ fn addDivByZeroSafety( |
| 14674 | 14650 | try mod.floatValue(resolved_type.scalarType(mod), 0.0); |
| 14675 | 14651 | const ok = if (resolved_type.zigTypeTag(mod) == .Vector) ok: { |
| 14676 | 14652 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 14677 | | const zero = try sema.addConstant(zero_val); |
| 14653 | const zero = Air.internedToRef(zero_val.toIntern()); |
| 14678 | 14654 | const ok = try block.addCmpVector(casted_rhs, zero, .neq); |
| 14679 | 14655 | break :ok try block.addInst(.{ |
| 14680 | 14656 | .tag = if (is_int) .reduce else .reduce_optimized, |
| ... | ... | @@ -14684,7 +14660,7 @@ fn addDivByZeroSafety( |
| 14684 | 14660 | } }, |
| 14685 | 14661 | }); |
| 14686 | 14662 | } else ok: { |
| 14687 | | const zero = try sema.addConstant(scalar_zero); |
| 14663 | const zero = Air.internedToRef(scalar_zero.toIntern()); |
| 14688 | 14664 | break :ok try block.addBinOp(if (is_int) .cmp_neq else .cmp_neq_optimized, casted_rhs, zero); |
| 14689 | 14665 | }; |
| 14690 | 14666 | try sema.addSafetyCheck(block, src, ok, .divide_by_zero); |
| ... | ... | @@ -14765,7 +14741,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14765 | 14741 | .ty = resolved_type.toIntern(), |
| 14766 | 14742 | .storage = .{ .repeated_elem = scalar_zero.toIntern() }, |
| 14767 | 14743 | } })).toValue() else scalar_zero; |
| 14768 | | return sema.addConstant(zero_val); |
| 14744 | return Air.internedToRef(zero_val.toIntern()); |
| 14769 | 14745 | } |
| 14770 | 14746 | } else if (lhs_scalar_ty.isSignedInt(mod)) { |
| 14771 | 14747 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); |
| ... | ... | @@ -14789,7 +14765,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14789 | 14765 | { |
| 14790 | 14766 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); |
| 14791 | 14767 | } |
| 14792 | | return sema.addConstant(rem_result); |
| 14768 | return Air.internedToRef(rem_result.toIntern()); |
| 14793 | 14769 | } |
| 14794 | 14770 | break :rs lhs_src; |
| 14795 | 14771 | } else if (rhs_scalar_ty.isSignedInt(mod)) { |
| ... | ... | @@ -14813,9 +14789,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14813 | 14789 | if (lhs_val.isUndef(mod) or !(try lhs_val.compareAllWithZeroAdvanced(.gte, sema))) { |
| 14814 | 14790 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); |
| 14815 | 14791 | } |
| 14816 | | return sema.addConstant( |
| 14817 | | try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod), |
| 14818 | | ); |
| 14792 | return Air.internedToRef((try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14819 | 14793 | } else { |
| 14820 | 14794 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); |
| 14821 | 14795 | } |
| ... | ... | @@ -14945,9 +14919,7 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14945 | 14919 | return sema.failWithDivideByZero(block, rhs_src); |
| 14946 | 14920 | } |
| 14947 | 14921 | if (maybe_lhs_val) |lhs_val| { |
| 14948 | | return sema.addConstant( |
| 14949 | | try lhs_val.intMod(rhs_val, resolved_type, sema.arena, mod), |
| 14950 | | ); |
| 14922 | return Air.internedToRef((try lhs_val.intMod(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14951 | 14923 | } |
| 14952 | 14924 | break :rs lhs_src; |
| 14953 | 14925 | } else { |
| ... | ... | @@ -14965,12 +14937,10 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14965 | 14937 | } |
| 14966 | 14938 | if (maybe_lhs_val) |lhs_val| { |
| 14967 | 14939 | if (lhs_val.isUndef(mod)) { |
| 14968 | | return sema.addConstUndef(resolved_type); |
| 14940 | return mod.undefRef(resolved_type); |
| 14969 | 14941 | } |
| 14970 | 14942 | if (maybe_rhs_val) |rhs_val| { |
| 14971 | | return sema.addConstant( |
| 14972 | | try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod), |
| 14973 | | ); |
| 14943 | return Air.internedToRef((try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14974 | 14944 | } else break :rs rhs_src; |
| 14975 | 14945 | } else break :rs lhs_src; |
| 14976 | 14946 | }; |
| ... | ... | @@ -15045,9 +15015,7 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 15045 | 15015 | return sema.failWithDivideByZero(block, rhs_src); |
| 15046 | 15016 | } |
| 15047 | 15017 | if (maybe_lhs_val) |lhs_val| { |
| 15048 | | return sema.addConstant( |
| 15049 | | try sema.intRem(resolved_type, lhs_val, rhs_val), |
| 15050 | | ); |
| 15018 | return Air.internedToRef((try sema.intRem(resolved_type, lhs_val, rhs_val)).toIntern()); |
| 15051 | 15019 | } |
| 15052 | 15020 | break :rs lhs_src; |
| 15053 | 15021 | } else { |
| ... | ... | @@ -15065,12 +15033,10 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 15065 | 15033 | } |
| 15066 | 15034 | if (maybe_lhs_val) |lhs_val| { |
| 15067 | 15035 | if (lhs_val.isUndef(mod)) { |
| 15068 | | return sema.addConstUndef(resolved_type); |
| 15036 | return mod.undefRef(resolved_type); |
| 15069 | 15037 | } |
| 15070 | 15038 | if (maybe_rhs_val) |rhs_val| { |
| 15071 | | return sema.addConstant( |
| 15072 | | try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod), |
| 15073 | | ); |
| 15039 | return Air.internedToRef((try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15074 | 15040 | } else break :rs rhs_src; |
| 15075 | 15041 | } else break :rs lhs_src; |
| 15076 | 15042 | }; |
| ... | ... | @@ -15263,7 +15229,7 @@ fn zirOverflowArithmetic( |
| 15263 | 15229 | return block.addInst(.{ |
| 15264 | 15230 | .tag = air_tag, |
| 15265 | 15231 | .data = .{ .ty_pl = .{ |
| 15266 | | .ty = try block.sema.addType(tuple_ty), |
| 15232 | .ty = Air.internedToRef(tuple_ty.toIntern()), |
| 15267 | 15233 | .payload = try block.sema.addExtra(Air.Bin{ |
| 15268 | 15234 | .lhs = lhs, |
| 15269 | 15235 | .rhs = rhs, |
| ... | ... | @@ -15280,18 +15246,18 @@ fn zirOverflowArithmetic( |
| 15280 | 15246 | } |
| 15281 | 15247 | |
| 15282 | 15248 | if (result.inst == .none) { |
| 15283 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 15249 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 15284 | 15250 | .ty = tuple_ty.toIntern(), |
| 15285 | 15251 | .storage = .{ .elems = &.{ |
| 15286 | 15252 | result.wrapped.toIntern(), |
| 15287 | 15253 | result.overflow_bit.toIntern(), |
| 15288 | 15254 | } }, |
| 15289 | | } })).toValue()); |
| 15255 | } }))); |
| 15290 | 15256 | } |
| 15291 | 15257 | |
| 15292 | 15258 | const element_refs = try sema.arena.alloc(Air.Inst.Ref, 2); |
| 15293 | 15259 | element_refs[0] = result.inst; |
| 15294 | | element_refs[1] = try sema.addConstant(result.overflow_bit); |
| 15260 | element_refs[1] = Air.internedToRef(result.overflow_bit.toIntern()); |
| 15295 | 15261 | return block.addAggregateInit(tuple_ty, element_refs); |
| 15296 | 15262 | } |
| 15297 | 15263 | |
| ... | ... | @@ -15394,7 +15360,7 @@ fn analyzeArithmetic( |
| 15394 | 15360 | if (is_int) { |
| 15395 | 15361 | return sema.failWithUseOfUndef(block, rhs_src); |
| 15396 | 15362 | } else { |
| 15397 | | return sema.addConstUndef(resolved_type); |
| 15363 | return mod.undefRef(resolved_type); |
| 15398 | 15364 | } |
| 15399 | 15365 | } |
| 15400 | 15366 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | ... | @@ -15407,7 +15373,7 @@ fn analyzeArithmetic( |
| 15407 | 15373 | if (is_int) { |
| 15408 | 15374 | return sema.failWithUseOfUndef(block, lhs_src); |
| 15409 | 15375 | } else { |
| 15410 | | return sema.addConstUndef(resolved_type); |
| 15376 | return mod.undefRef(resolved_type); |
| 15411 | 15377 | } |
| 15412 | 15378 | } |
| 15413 | 15379 | if (maybe_rhs_val) |rhs_val| { |
| ... | ... | @@ -15417,11 +15383,9 @@ fn analyzeArithmetic( |
| 15417 | 15383 | if (overflow_idx) |vec_idx| { |
| 15418 | 15384 | return sema.failWithIntegerOverflow(block, src, resolved_type, sum, vec_idx); |
| 15419 | 15385 | } |
| 15420 | | return sema.addConstant(sum); |
| 15386 | return Air.internedToRef(sum.toIntern()); |
| 15421 | 15387 | } else { |
| 15422 | | return sema.addConstant( |
| 15423 | | try Value.floatAdd(lhs_val, rhs_val, resolved_type, sema.arena, mod), |
| 15424 | | ); |
| 15388 | return Air.internedToRef((try Value.floatAdd(lhs_val, rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15425 | 15389 | } |
| 15426 | 15390 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .add_safe }; |
| 15427 | 15391 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .add_safe }; |
| ... | ... | @@ -15437,15 +15401,13 @@ fn analyzeArithmetic( |
| 15437 | 15401 | } |
| 15438 | 15402 | if (maybe_rhs_val) |rhs_val| { |
| 15439 | 15403 | if (rhs_val.isUndef(mod)) { |
| 15440 | | return sema.addConstUndef(resolved_type); |
| 15404 | return mod.undefRef(resolved_type); |
| 15441 | 15405 | } |
| 15442 | 15406 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15443 | 15407 | return casted_lhs; |
| 15444 | 15408 | } |
| 15445 | 15409 | if (maybe_lhs_val) |lhs_val| { |
| 15446 | | return sema.addConstant( |
| 15447 | | try sema.numberAddWrapScalar(lhs_val, rhs_val, resolved_type), |
| 15448 | | ); |
| 15410 | return Air.internedToRef((try sema.numberAddWrapScalar(lhs_val, rhs_val, resolved_type)).toIntern()); |
| 15449 | 15411 | } else break :rs .{ .src = lhs_src, .air_tag = .add_wrap, .air_tag_safe = .add_wrap }; |
| 15450 | 15412 | } else break :rs .{ .src = rhs_src, .air_tag = .add_wrap, .air_tag_safe = .add_wrap }; |
| 15451 | 15413 | }, |
| ... | ... | @@ -15460,7 +15422,7 @@ fn analyzeArithmetic( |
| 15460 | 15422 | } |
| 15461 | 15423 | if (maybe_rhs_val) |rhs_val| { |
| 15462 | 15424 | if (rhs_val.isUndef(mod)) { |
| 15463 | | return sema.addConstUndef(resolved_type); |
| 15425 | return mod.undefRef(resolved_type); |
| 15464 | 15426 | } |
| 15465 | 15427 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15466 | 15428 | return casted_lhs; |
| ... | ... | @@ -15471,7 +15433,7 @@ fn analyzeArithmetic( |
| 15471 | 15433 | else |
| 15472 | 15434 | try lhs_val.intAddSat(rhs_val, resolved_type, sema.arena, mod); |
| 15473 | 15435 | |
| 15474 | | return sema.addConstant(val); |
| 15436 | return Air.internedToRef(val.toIntern()); |
| 15475 | 15437 | } else break :rs .{ |
| 15476 | 15438 | .src = lhs_src, |
| 15477 | 15439 | .air_tag = .add_sat, |
| ... | ... | @@ -15496,7 +15458,7 @@ fn analyzeArithmetic( |
| 15496 | 15458 | if (is_int) { |
| 15497 | 15459 | return sema.failWithUseOfUndef(block, rhs_src); |
| 15498 | 15460 | } else { |
| 15499 | | return sema.addConstUndef(resolved_type); |
| 15461 | return mod.undefRef(resolved_type); |
| 15500 | 15462 | } |
| 15501 | 15463 | } |
| 15502 | 15464 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | ... | @@ -15509,7 +15471,7 @@ fn analyzeArithmetic( |
| 15509 | 15471 | if (is_int) { |
| 15510 | 15472 | return sema.failWithUseOfUndef(block, lhs_src); |
| 15511 | 15473 | } else { |
| 15512 | | return sema.addConstUndef(resolved_type); |
| 15474 | return mod.undefRef(resolved_type); |
| 15513 | 15475 | } |
| 15514 | 15476 | } |
| 15515 | 15477 | if (maybe_rhs_val) |rhs_val| { |
| ... | ... | @@ -15519,11 +15481,9 @@ fn analyzeArithmetic( |
| 15519 | 15481 | if (overflow_idx) |vec_idx| { |
| 15520 | 15482 | return sema.failWithIntegerOverflow(block, src, resolved_type, diff, vec_idx); |
| 15521 | 15483 | } |
| 15522 | | return sema.addConstant(diff); |
| 15484 | return Air.internedToRef(diff.toIntern()); |
| 15523 | 15485 | } else { |
| 15524 | | return sema.addConstant( |
| 15525 | | try Value.floatSub(lhs_val, rhs_val, resolved_type, sema.arena, mod), |
| 15526 | | ); |
| 15486 | return Air.internedToRef((try Value.floatSub(lhs_val, rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15527 | 15487 | } |
| 15528 | 15488 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .sub_safe }; |
| 15529 | 15489 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .sub_safe }; |
| ... | ... | @@ -15534,7 +15494,7 @@ fn analyzeArithmetic( |
| 15534 | 15494 | // If either of the operands are undefined, the result is undefined. |
| 15535 | 15495 | if (maybe_rhs_val) |rhs_val| { |
| 15536 | 15496 | if (rhs_val.isUndef(mod)) { |
| 15537 | | return sema.addConstUndef(resolved_type); |
| 15497 | return mod.undefRef(resolved_type); |
| 15538 | 15498 | } |
| 15539 | 15499 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15540 | 15500 | return casted_lhs; |
| ... | ... | @@ -15542,12 +15502,10 @@ fn analyzeArithmetic( |
| 15542 | 15502 | } |
| 15543 | 15503 | if (maybe_lhs_val) |lhs_val| { |
| 15544 | 15504 | if (lhs_val.isUndef(mod)) { |
| 15545 | | return sema.addConstUndef(resolved_type); |
| 15505 | return mod.undefRef(resolved_type); |
| 15546 | 15506 | } |
| 15547 | 15507 | if (maybe_rhs_val) |rhs_val| { |
| 15548 | | return sema.addConstant( |
| 15549 | | try sema.numberSubWrapScalar(lhs_val, rhs_val, resolved_type), |
| 15550 | | ); |
| 15508 | return Air.internedToRef((try sema.numberSubWrapScalar(lhs_val, rhs_val, resolved_type)).toIntern()); |
| 15551 | 15509 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_wrap, .air_tag_safe = .sub_wrap }; |
| 15552 | 15510 | } else break :rs .{ .src = lhs_src, .air_tag = .sub_wrap, .air_tag_safe = .sub_wrap }; |
| 15553 | 15511 | }, |
| ... | ... | @@ -15557,7 +15515,7 @@ fn analyzeArithmetic( |
| 15557 | 15515 | // If either of the operands are undefined, result is undefined. |
| 15558 | 15516 | if (maybe_rhs_val) |rhs_val| { |
| 15559 | 15517 | if (rhs_val.isUndef(mod)) { |
| 15560 | | return sema.addConstUndef(resolved_type); |
| 15518 | return mod.undefRef(resolved_type); |
| 15561 | 15519 | } |
| 15562 | 15520 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15563 | 15521 | return casted_lhs; |
| ... | ... | @@ -15565,7 +15523,7 @@ fn analyzeArithmetic( |
| 15565 | 15523 | } |
| 15566 | 15524 | if (maybe_lhs_val) |lhs_val| { |
| 15567 | 15525 | if (lhs_val.isUndef(mod)) { |
| 15568 | | return sema.addConstUndef(resolved_type); |
| 15526 | return mod.undefRef(resolved_type); |
| 15569 | 15527 | } |
| 15570 | 15528 | if (maybe_rhs_val) |rhs_val| { |
| 15571 | 15529 | const val = if (scalar_tag == .ComptimeInt) |
| ... | ... | @@ -15573,7 +15531,7 @@ fn analyzeArithmetic( |
| 15573 | 15531 | else |
| 15574 | 15532 | try lhs_val.intSubSat(rhs_val, resolved_type, sema.arena, mod); |
| 15575 | 15533 | |
| 15576 | | return sema.addConstant(val); |
| 15534 | return Air.internedToRef(val.toIntern()); |
| 15577 | 15535 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat, .air_tag_safe = .sub_sat }; |
| 15578 | 15536 | } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat, .air_tag_safe = .sub_sat }; |
| 15579 | 15537 | }, |
| ... | ... | @@ -15602,23 +15560,21 @@ fn analyzeArithmetic( |
| 15602 | 15560 | if (maybe_lhs_val) |lhs_val| { |
| 15603 | 15561 | if (!lhs_val.isUndef(mod)) { |
| 15604 | 15562 | if (lhs_val.isNan(mod)) { |
| 15605 | | return sema.addConstant(lhs_val); |
| 15563 | return Air.internedToRef(lhs_val.toIntern()); |
| 15606 | 15564 | } |
| 15607 | 15565 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) lz: { |
| 15608 | 15566 | if (maybe_rhs_val) |rhs_val| { |
| 15609 | 15567 | if (rhs_val.isNan(mod)) { |
| 15610 | | return sema.addConstant(rhs_val); |
| 15568 | return Air.internedToRef(rhs_val.toIntern()); |
| 15611 | 15569 | } |
| 15612 | 15570 | if (rhs_val.isInf(mod)) { |
| 15613 | | return sema.addConstant( |
| 15614 | | try mod.floatValue(resolved_type, std.math.nan_f128), |
| 15615 | | ); |
| 15571 | return Air.internedToRef((try mod.floatValue(resolved_type, std.math.nan_f128)).toIntern()); |
| 15616 | 15572 | } |
| 15617 | 15573 | } else if (resolved_type.isAnyFloat()) { |
| 15618 | 15574 | break :lz; |
| 15619 | 15575 | } |
| 15620 | 15576 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 15621 | | return sema.addConstant(zero_val); |
| 15577 | return Air.internedToRef(zero_val.toIntern()); |
| 15622 | 15578 | } |
| 15623 | 15579 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15624 | 15580 | return casted_rhs; |
| ... | ... | @@ -15631,24 +15587,22 @@ fn analyzeArithmetic( |
| 15631 | 15587 | if (is_int) { |
| 15632 | 15588 | return sema.failWithUseOfUndef(block, rhs_src); |
| 15633 | 15589 | } else { |
| 15634 | | return sema.addConstUndef(resolved_type); |
| 15590 | return mod.undefRef(resolved_type); |
| 15635 | 15591 | } |
| 15636 | 15592 | } |
| 15637 | 15593 | if (rhs_val.isNan(mod)) { |
| 15638 | | return sema.addConstant(rhs_val); |
| 15594 | return Air.internedToRef(rhs_val.toIntern()); |
| 15639 | 15595 | } |
| 15640 | 15596 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) rz: { |
| 15641 | 15597 | if (maybe_lhs_val) |lhs_val| { |
| 15642 | 15598 | if (lhs_val.isInf(mod)) { |
| 15643 | | return sema.addConstant( |
| 15644 | | try mod.floatValue(resolved_type, std.math.nan_f128), |
| 15645 | | ); |
| 15599 | return Air.internedToRef((try mod.floatValue(resolved_type, std.math.nan_f128)).toIntern()); |
| 15646 | 15600 | } |
| 15647 | 15601 | } else if (resolved_type.isAnyFloat()) { |
| 15648 | 15602 | break :rz; |
| 15649 | 15603 | } |
| 15650 | 15604 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 15651 | | return sema.addConstant(zero_val); |
| 15605 | return Air.internedToRef(zero_val.toIntern()); |
| 15652 | 15606 | } |
| 15653 | 15607 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15654 | 15608 | return casted_lhs; |
| ... | ... | @@ -15658,7 +15612,7 @@ fn analyzeArithmetic( |
| 15658 | 15612 | if (is_int) { |
| 15659 | 15613 | return sema.failWithUseOfUndef(block, lhs_src); |
| 15660 | 15614 | } else { |
| 15661 | | return sema.addConstUndef(resolved_type); |
| 15615 | return mod.undefRef(resolved_type); |
| 15662 | 15616 | } |
| 15663 | 15617 | } |
| 15664 | 15618 | if (is_int) { |
| ... | ... | @@ -15667,11 +15621,9 @@ fn analyzeArithmetic( |
| 15667 | 15621 | if (overflow_idx) |vec_idx| { |
| 15668 | 15622 | return sema.failWithIntegerOverflow(block, src, resolved_type, product, vec_idx); |
| 15669 | 15623 | } |
| 15670 | | return sema.addConstant(product); |
| 15624 | return Air.internedToRef(product.toIntern()); |
| 15671 | 15625 | } else { |
| 15672 | | return sema.addConstant( |
| 15673 | | try lhs_val.floatMul(rhs_val, resolved_type, sema.arena, mod), |
| 15674 | | ); |
| 15626 | return Air.internedToRef((try lhs_val.floatMul(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15675 | 15627 | } |
| 15676 | 15628 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .mul_safe }; |
| 15677 | 15629 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .mul_safe }; |
| ... | ... | @@ -15695,7 +15647,7 @@ fn analyzeArithmetic( |
| 15695 | 15647 | if (!lhs_val.isUndef(mod)) { |
| 15696 | 15648 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15697 | 15649 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 15698 | | return sema.addConstant(zero_val); |
| 15650 | return Air.internedToRef(zero_val.toIntern()); |
| 15699 | 15651 | } |
| 15700 | 15652 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15701 | 15653 | return casted_rhs; |
| ... | ... | @@ -15704,22 +15656,20 @@ fn analyzeArithmetic( |
| 15704 | 15656 | } |
| 15705 | 15657 | if (maybe_rhs_val) |rhs_val| { |
| 15706 | 15658 | if (rhs_val.isUndef(mod)) { |
| 15707 | | return sema.addConstUndef(resolved_type); |
| 15659 | return mod.undefRef(resolved_type); |
| 15708 | 15660 | } |
| 15709 | 15661 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15710 | 15662 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 15711 | | return sema.addConstant(zero_val); |
| 15663 | return Air.internedToRef(zero_val.toIntern()); |
| 15712 | 15664 | } |
| 15713 | 15665 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15714 | 15666 | return casted_lhs; |
| 15715 | 15667 | } |
| 15716 | 15668 | if (maybe_lhs_val) |lhs_val| { |
| 15717 | 15669 | if (lhs_val.isUndef(mod)) { |
| 15718 | | return sema.addConstUndef(resolved_type); |
| 15670 | return mod.undefRef(resolved_type); |
| 15719 | 15671 | } |
| 15720 | | return sema.addConstant( |
| 15721 | | try lhs_val.numberMulWrap(rhs_val, resolved_type, sema.arena, mod), |
| 15722 | | ); |
| 15672 | return Air.internedToRef((try lhs_val.numberMulWrap(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15723 | 15673 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_wrap, .air_tag_safe = .mul_wrap }; |
| 15724 | 15674 | } else break :rs .{ .src = rhs_src, .air_tag = .mul_wrap, .air_tag_safe = .mul_wrap }; |
| 15725 | 15675 | }, |
| ... | ... | @@ -15742,7 +15692,7 @@ fn analyzeArithmetic( |
| 15742 | 15692 | if (!lhs_val.isUndef(mod)) { |
| 15743 | 15693 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15744 | 15694 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 15745 | | return sema.addConstant(zero_val); |
| 15695 | return Air.internedToRef(zero_val.toIntern()); |
| 15746 | 15696 | } |
| 15747 | 15697 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15748 | 15698 | return casted_rhs; |
| ... | ... | @@ -15751,18 +15701,18 @@ fn analyzeArithmetic( |
| 15751 | 15701 | } |
| 15752 | 15702 | if (maybe_rhs_val) |rhs_val| { |
| 15753 | 15703 | if (rhs_val.isUndef(mod)) { |
| 15754 | | return sema.addConstUndef(resolved_type); |
| 15704 | return mod.undefRef(resolved_type); |
| 15755 | 15705 | } |
| 15756 | 15706 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15757 | 15707 | const zero_val = try sema.splat(resolved_type, scalar_zero); |
| 15758 | | return sema.addConstant(zero_val); |
| 15708 | return Air.internedToRef(zero_val.toIntern()); |
| 15759 | 15709 | } |
| 15760 | 15710 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15761 | 15711 | return casted_lhs; |
| 15762 | 15712 | } |
| 15763 | 15713 | if (maybe_lhs_val) |lhs_val| { |
| 15764 | 15714 | if (lhs_val.isUndef(mod)) { |
| 15765 | | return sema.addConstUndef(resolved_type); |
| 15715 | return mod.undefRef(resolved_type); |
| 15766 | 15716 | } |
| 15767 | 15717 | |
| 15768 | 15718 | const val = if (scalar_tag == .ComptimeInt) |
| ... | ... | @@ -15770,7 +15720,7 @@ fn analyzeArithmetic( |
| 15770 | 15720 | else |
| 15771 | 15721 | try lhs_val.intMulSat(rhs_val, resolved_type, sema.arena, mod); |
| 15772 | 15722 | |
| 15773 | | return sema.addConstant(val); |
| 15723 | return Air.internedToRef(val.toIntern()); |
| 15774 | 15724 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat, .air_tag_safe = .mul_sat }; |
| 15775 | 15725 | } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat, .air_tag_safe = .mul_sat }; |
| 15776 | 15726 | }, |
| ... | ... | @@ -15795,7 +15745,7 @@ fn analyzeArithmetic( |
| 15795 | 15745 | const op_ov = try block.addInst(.{ |
| 15796 | 15746 | .tag = op_ov_tag, |
| 15797 | 15747 | .data = .{ .ty_pl = .{ |
| 15798 | | .ty = try sema.addType(op_ov_tuple_ty), |
| 15748 | .ty = Air.internedToRef(op_ov_tuple_ty.toIntern()), |
| 15799 | 15749 | .payload = try sema.addExtra(Air.Bin{ |
| 15800 | 15750 | .lhs = casted_lhs, |
| 15801 | 15751 | .rhs = casted_rhs, |
| ... | ... | @@ -15813,7 +15763,7 @@ fn analyzeArithmetic( |
| 15813 | 15763 | }) |
| 15814 | 15764 | else |
| 15815 | 15765 | ov_bit; |
| 15816 | | const zero_ov = try sema.addConstant(try mod.intValue(Type.u1, 0)); |
| 15766 | const zero_ov = Air.internedToRef((try mod.intValue(Type.u1, 0)).toIntern()); |
| 15817 | 15767 | const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov); |
| 15818 | 15768 | |
| 15819 | 15769 | try sema.addSafetyCheck(block, src, no_ov, .integer_overflow); |
| ... | ... | @@ -15885,7 +15835,7 @@ fn analyzePtrArithmetic( |
| 15885 | 15835 | const runtime_src = rs: { |
| 15886 | 15836 | if (opt_ptr_val) |ptr_val| { |
| 15887 | 15837 | if (opt_off_val) |offset_val| { |
| 15888 | | if (ptr_val.isUndef(mod)) return sema.addConstUndef(new_ptr_ty); |
| 15838 | if (ptr_val.isUndef(mod)) return mod.undefRef(new_ptr_ty); |
| 15889 | 15839 | |
| 15890 | 15840 | const offset_int = try sema.usizeCast(block, offset_src, offset_val.toUnsignedInt(mod)); |
| 15891 | 15841 | if (offset_int == 0) return ptr; |
| ... | ... | @@ -15897,13 +15847,13 @@ fn analyzePtrArithmetic( |
| 15897 | 15847 | else => unreachable, |
| 15898 | 15848 | }; |
| 15899 | 15849 | const new_ptr_val = try mod.ptrIntValue(new_ptr_ty, new_addr); |
| 15900 | | return sema.addConstant(new_ptr_val); |
| 15850 | return Air.internedToRef(new_ptr_val.toIntern()); |
| 15901 | 15851 | } |
| 15902 | 15852 | if (air_tag == .ptr_sub) { |
| 15903 | 15853 | return sema.fail(block, op_src, "TODO implement Sema comptime pointer subtraction", .{}); |
| 15904 | 15854 | } |
| 15905 | 15855 | const new_ptr_val = try ptr_val.elemPtr(new_ptr_ty, offset_int, mod); |
| 15906 | | return sema.addConstant(new_ptr_val); |
| 15856 | return Air.internedToRef(new_ptr_val.toIntern()); |
| 15907 | 15857 | } else break :rs offset_src; |
| 15908 | 15858 | } else break :rs ptr_src; |
| 15909 | 15859 | }; |
| ... | ... | @@ -15912,7 +15862,7 @@ fn analyzePtrArithmetic( |
| 15912 | 15862 | return block.addInst(.{ |
| 15913 | 15863 | .tag = air_tag, |
| 15914 | 15864 | .data = .{ .ty_pl = .{ |
| 15915 | | .ty = try sema.addType(new_ptr_ty), |
| 15865 | .ty = Air.internedToRef(new_ptr_ty.toIntern()), |
| 15916 | 15866 | .payload = try sema.addExtra(Air.Bin{ |
| 15917 | 15867 | .lhs = ptr, |
| 15918 | 15868 | .rhs = offset, |
| ... | ... | @@ -15998,7 +15948,7 @@ fn zirAsm( |
| 15998 | 15948 | arg.* = .none; |
| 15999 | 15949 | const out_ty = try sema.resolveType(block, ret_ty_src, output.data.operand); |
| 16000 | 15950 | try sema.queueFullTypeResolution(out_ty); |
| 16001 | | expr_ty = try sema.addType(out_ty); |
| 15951 | expr_ty = Air.internedToRef(out_ty.toIntern()); |
| 16002 | 15952 | } else { |
| 16003 | 15953 | arg.* = try sema.resolveInst(output.data.operand); |
| 16004 | 15954 | } |
| ... | ... | @@ -16149,7 +16099,7 @@ fn zirCmpEq( |
| 16149 | 16099 | if (try sema.resolveMaybeUndefVal(lhs)) |lval| { |
| 16150 | 16100 | if (try sema.resolveMaybeUndefVal(rhs)) |rval| { |
| 16151 | 16101 | if (lval.isUndef(mod) or rval.isUndef(mod)) { |
| 16152 | | return sema.addConstUndef(Type.bool); |
| 16102 | return mod.undefRef(Type.bool); |
| 16153 | 16103 | } |
| 16154 | 16104 | const lkey = mod.intern_pool.indexToKey(lval.toIntern()); |
| 16155 | 16105 | const rkey = mod.intern_pool.indexToKey(rval.toIntern()); |
| ... | ... | @@ -16207,7 +16157,7 @@ fn analyzeCmpUnionTag( |
| 16207 | 16157 | const coerced_union = try sema.coerce(block, union_tag_ty, un, un_src); |
| 16208 | 16158 | |
| 16209 | 16159 | if (try sema.resolveMaybeUndefVal(coerced_tag)) |enum_val| { |
| 16210 | | if (enum_val.isUndef(mod)) return sema.addConstUndef(Type.bool); |
| 16160 | if (enum_val.isUndef(mod)) return mod.undefRef(Type.bool); |
| 16211 | 16161 | const field_ty = union_ty.unionFieldType(enum_val, mod); |
| 16212 | 16162 | if (field_ty.zigTypeTag(mod) == .NoReturn) { |
| 16213 | 16163 | return Air.Inst.Ref.bool_false; |
| ... | ... | @@ -16309,13 +16259,13 @@ fn cmpSelf( |
| 16309 | 16259 | const resolved_type = sema.typeOf(casted_lhs); |
| 16310 | 16260 | const runtime_src: LazySrcLoc = src: { |
| 16311 | 16261 | if (try sema.resolveMaybeUndefVal(casted_lhs)) |lhs_val| { |
| 16312 | | if (lhs_val.isUndef(mod)) return sema.addConstUndef(Type.bool); |
| 16262 | if (lhs_val.isUndef(mod)) return mod.undefRef(Type.bool); |
| 16313 | 16263 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { |
| 16314 | | if (rhs_val.isUndef(mod)) return sema.addConstUndef(Type.bool); |
| 16264 | if (rhs_val.isUndef(mod)) return mod.undefRef(Type.bool); |
| 16315 | 16265 | |
| 16316 | 16266 | if (resolved_type.zigTypeTag(mod) == .Vector) { |
| 16317 | 16267 | const cmp_val = try sema.compareVector(lhs_val, op, rhs_val, resolved_type); |
| 16318 | | return sema.addConstant(cmp_val); |
| 16268 | return Air.internedToRef(cmp_val.toIntern()); |
| 16319 | 16269 | } |
| 16320 | 16270 | |
| 16321 | 16271 | if (try sema.compareAll(lhs_val, op, rhs_val, resolved_type)) { |
| ... | ... | @@ -16335,7 +16285,7 @@ fn cmpSelf( |
| 16335 | 16285 | // bool eq/neq more efficiently. |
| 16336 | 16286 | if (resolved_type.zigTypeTag(mod) == .Bool) { |
| 16337 | 16287 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { |
| 16338 | | if (rhs_val.isUndef(mod)) return sema.addConstUndef(Type.bool); |
| 16288 | if (rhs_val.isUndef(mod)) return mod.undefRef(Type.bool); |
| 16339 | 16289 | return sema.runtimeBoolCmp(block, src, op, casted_lhs, rhs_val.toBool(), lhs_src); |
| 16340 | 16290 | } |
| 16341 | 16291 | } |
| ... | ... | @@ -16389,7 +16339,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 16389 | 16339 | .ComptimeFloat, |
| 16390 | 16340 | .ComptimeInt, |
| 16391 | 16341 | .Void, |
| 16392 | | => return sema.addIntUnsigned(Type.comptime_int, 0), |
| 16342 | => return mod.intRef(Type.comptime_int, 0), |
| 16393 | 16343 | |
| 16394 | 16344 | .Bool, |
| 16395 | 16345 | .Int, |
| ... | ... | @@ -16411,7 +16361,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 16411 | 16361 | if (val.isLazySize(mod)) { |
| 16412 | 16362 | try sema.queueFullTypeResolution(ty); |
| 16413 | 16363 | } |
| 16414 | | return sema.addConstant(val); |
| 16364 | return Air.internedToRef(val.toIntern()); |
| 16415 | 16365 | } |
| 16416 | 16366 | |
| 16417 | 16367 | fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -16432,7 +16382,7 @@ fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 16432 | 16382 | .ComptimeFloat, |
| 16433 | 16383 | .ComptimeInt, |
| 16434 | 16384 | .Void, |
| 16435 | | => return sema.addIntUnsigned(Type.comptime_int, 0), |
| 16385 | => return mod.intRef(Type.comptime_int, 0), |
| 16436 | 16386 | |
| 16437 | 16387 | .Bool, |
| 16438 | 16388 | .Int, |
| ... | ... | @@ -16451,7 +16401,7 @@ fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 16451 | 16401 | => {}, |
| 16452 | 16402 | } |
| 16453 | 16403 | const bit_size = try operand_ty.bitSizeAdvanced(mod, sema); |
| 16454 | | return sema.addIntUnsigned(Type.comptime_int, bit_size); |
| 16404 | return mod.intRef(Type.comptime_int, bit_size); |
| 16455 | 16405 | } |
| 16456 | 16406 | |
| 16457 | 16407 | fn zirThis( |
| ... | ... | @@ -16575,7 +16525,7 @@ fn zirClosureGet(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 16575 | 16525 | return block.addTy(.alloc, ty_ip_index.toType()); |
| 16576 | 16526 | }, |
| 16577 | 16527 | .comptime_val => |val_ip_index| { |
| 16578 | | return sema.addConstant(val_ip_index.toValue()); |
| 16528 | return Air.internedToRef(val_ip_index); |
| 16579 | 16529 | }, |
| 16580 | 16530 | } |
| 16581 | 16531 | } |
| ... | ... | @@ -16588,7 +16538,7 @@ fn zirRetAddr( |
| 16588 | 16538 | _ = extended; |
| 16589 | 16539 | if (block.is_comptime) { |
| 16590 | 16540 | // TODO: we could give a meaningful lazy value here. #14938 |
| 16591 | | return sema.addIntUnsigned(Type.usize, 0); |
| 16541 | return sema.mod.intRef(Type.usize, 0); |
| 16592 | 16542 | } else { |
| 16593 | 16543 | return block.addNoOp(.ret_addr); |
| 16594 | 16544 | } |
| ... | ... | @@ -16682,10 +16632,10 @@ fn zirBuiltinSrc( |
| 16682 | 16632 | // column: u32, |
| 16683 | 16633 | (try mod.intValue(Type.u32, extra.column + 1)).toIntern(), |
| 16684 | 16634 | }; |
| 16685 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 16635 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 16686 | 16636 | .ty = src_loc_ty.toIntern(), |
| 16687 | 16637 | .storage = .{ .elems = &fields }, |
| 16688 | | } })).toValue()); |
| 16638 | } }))); |
| 16689 | 16639 | } |
| 16690 | 16640 | |
| 16691 | 16641 | fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -16708,11 +16658,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16708 | 16658 | .Undefined, |
| 16709 | 16659 | .Null, |
| 16710 | 16660 | .EnumLiteral, |
| 16711 | | => |type_info_tag| return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16661 | => |type_info_tag| return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16712 | 16662 | .ty = type_info_ty.toIntern(), |
| 16713 | 16663 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(type_info_tag))).toIntern(), |
| 16714 | 16664 | .val = .void_value, |
| 16715 | | } })).toValue()), |
| 16665 | } }))), |
| 16716 | 16666 | .Fn => { |
| 16717 | 16667 | // TODO: look into memoizing this result. |
| 16718 | 16668 | var params_anon_decl = try block.startAnonDecl(); |
| ... | ... | @@ -16819,14 +16769,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16819 | 16769 | // args: []const Fn.Param, |
| 16820 | 16770 | args_val, |
| 16821 | 16771 | }; |
| 16822 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16772 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16823 | 16773 | .ty = type_info_ty.toIntern(), |
| 16824 | 16774 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Fn))).toIntern(), |
| 16825 | 16775 | .val = try mod.intern(.{ .aggregate = .{ |
| 16826 | 16776 | .ty = fn_info_ty.toIntern(), |
| 16827 | 16777 | .storage = .{ .elems = &field_values }, |
| 16828 | 16778 | } }), |
| 16829 | | } })).toValue()); |
| 16779 | } }))); |
| 16830 | 16780 | }, |
| 16831 | 16781 | .Int => { |
| 16832 | 16782 | const int_info_decl_index = (try sema.namespaceLookup( |
| ... | ... | @@ -16848,14 +16798,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16848 | 16798 | // bits: u16, |
| 16849 | 16799 | (try mod.intValue(Type.u16, info.bits)).toIntern(), |
| 16850 | 16800 | }; |
| 16851 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16801 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16852 | 16802 | .ty = type_info_ty.toIntern(), |
| 16853 | 16803 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Int))).toIntern(), |
| 16854 | 16804 | .val = try mod.intern(.{ .aggregate = .{ |
| 16855 | 16805 | .ty = int_info_ty.toIntern(), |
| 16856 | 16806 | .storage = .{ .elems = &field_values }, |
| 16857 | 16807 | } }), |
| 16858 | | } })).toValue()); |
| 16808 | } }))); |
| 16859 | 16809 | }, |
| 16860 | 16810 | .Float => { |
| 16861 | 16811 | const float_info_decl_index = (try sema.namespaceLookup( |
| ... | ... | @@ -16873,14 +16823,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16873 | 16823 | // bits: u16, |
| 16874 | 16824 | (try mod.intValue(Type.u16, ty.bitSize(mod))).toIntern(), |
| 16875 | 16825 | }; |
| 16876 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16826 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16877 | 16827 | .ty = type_info_ty.toIntern(), |
| 16878 | 16828 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Float))).toIntern(), |
| 16879 | 16829 | .val = try mod.intern(.{ .aggregate = .{ |
| 16880 | 16830 | .ty = float_info_ty.toIntern(), |
| 16881 | 16831 | .storage = .{ .elems = &field_vals }, |
| 16882 | 16832 | } }), |
| 16883 | | } })).toValue()); |
| 16833 | } }))); |
| 16884 | 16834 | }, |
| 16885 | 16835 | .Pointer => { |
| 16886 | 16836 | const info = ty.ptrInfo(mod); |
| ... | ... | @@ -16936,14 +16886,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16936 | 16886 | else => info.sentinel.toValue(), |
| 16937 | 16887 | })).toIntern(), |
| 16938 | 16888 | }; |
| 16939 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16889 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16940 | 16890 | .ty = type_info_ty.toIntern(), |
| 16941 | 16891 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Pointer))).toIntern(), |
| 16942 | 16892 | .val = try mod.intern(.{ .aggregate = .{ |
| 16943 | 16893 | .ty = pointer_ty.toIntern(), |
| 16944 | 16894 | .storage = .{ .elems = &field_values }, |
| 16945 | 16895 | } }), |
| 16946 | | } })).toValue()); |
| 16896 | } }))); |
| 16947 | 16897 | }, |
| 16948 | 16898 | .Array => { |
| 16949 | 16899 | const array_field_ty = t: { |
| ... | ... | @@ -16968,14 +16918,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16968 | 16918 | // sentinel: ?*const anyopaque, |
| 16969 | 16919 | (try sema.optRefValue(block, info.elem_type, info.sentinel)).toIntern(), |
| 16970 | 16920 | }; |
| 16971 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16921 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16972 | 16922 | .ty = type_info_ty.toIntern(), |
| 16973 | 16923 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Array))).toIntern(), |
| 16974 | 16924 | .val = try mod.intern(.{ .aggregate = .{ |
| 16975 | 16925 | .ty = array_field_ty.toIntern(), |
| 16976 | 16926 | .storage = .{ .elems = &field_values }, |
| 16977 | 16927 | } }), |
| 16978 | | } })).toValue()); |
| 16928 | } }))); |
| 16979 | 16929 | }, |
| 16980 | 16930 | .Vector => { |
| 16981 | 16931 | const vector_field_ty = t: { |
| ... | ... | @@ -16998,14 +16948,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16998 | 16948 | // child: type, |
| 16999 | 16949 | info.elem_type.toIntern(), |
| 17000 | 16950 | }; |
| 17001 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16951 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17002 | 16952 | .ty = type_info_ty.toIntern(), |
| 17003 | 16953 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Vector))).toIntern(), |
| 17004 | 16954 | .val = try mod.intern(.{ .aggregate = .{ |
| 17005 | 16955 | .ty = vector_field_ty.toIntern(), |
| 17006 | 16956 | .storage = .{ .elems = &field_values }, |
| 17007 | 16957 | } }), |
| 17008 | | } })).toValue()); |
| 16958 | } }))); |
| 17009 | 16959 | }, |
| 17010 | 16960 | .Optional => { |
| 17011 | 16961 | const optional_field_ty = t: { |
| ... | ... | @@ -17025,14 +16975,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17025 | 16975 | // child: type, |
| 17026 | 16976 | ty.optionalChild(mod).toIntern(), |
| 17027 | 16977 | }; |
| 17028 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 16978 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17029 | 16979 | .ty = type_info_ty.toIntern(), |
| 17030 | 16980 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Optional))).toIntern(), |
| 17031 | 16981 | .val = try mod.intern(.{ .aggregate = .{ |
| 17032 | 16982 | .ty = optional_field_ty.toIntern(), |
| 17033 | 16983 | .storage = .{ .elems = &field_values }, |
| 17034 | 16984 | } }), |
| 17035 | | } })).toValue()); |
| 16985 | } }))); |
| 17036 | 16986 | }, |
| 17037 | 16987 | .ErrorSet => { |
| 17038 | 16988 | var fields_anon_decl = try block.startAnonDecl(); |
| ... | ... | @@ -17135,11 +17085,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17135 | 17085 | } }); |
| 17136 | 17086 | |
| 17137 | 17087 | // Construct Type{ .ErrorSet = errors_val } |
| 17138 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 17088 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17139 | 17089 | .ty = type_info_ty.toIntern(), |
| 17140 | 17090 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.ErrorSet))).toIntern(), |
| 17141 | 17091 | .val = errors_val, |
| 17142 | | } })).toValue()); |
| 17092 | } }))); |
| 17143 | 17093 | }, |
| 17144 | 17094 | .ErrorUnion => { |
| 17145 | 17095 | const error_union_field_ty = t: { |
| ... | ... | @@ -17161,14 +17111,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17161 | 17111 | // payload: type, |
| 17162 | 17112 | ty.errorUnionPayload(mod).toIntern(), |
| 17163 | 17113 | }; |
| 17164 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 17114 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17165 | 17115 | .ty = type_info_ty.toIntern(), |
| 17166 | 17116 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.ErrorUnion))).toIntern(), |
| 17167 | 17117 | .val = try mod.intern(.{ .aggregate = .{ |
| 17168 | 17118 | .ty = error_union_field_ty.toIntern(), |
| 17169 | 17119 | .storage = .{ .elems = &field_values }, |
| 17170 | 17120 | } }), |
| 17171 | | } })).toValue()); |
| 17121 | } }))); |
| 17172 | 17122 | }, |
| 17173 | 17123 | .Enum => { |
| 17174 | 17124 | // TODO: look into memoizing this result. |
| ... | ... | @@ -17287,14 +17237,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17287 | 17237 | // is_exhaustive: bool, |
| 17288 | 17238 | is_exhaustive.toIntern(), |
| 17289 | 17239 | }; |
| 17290 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 17240 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17291 | 17241 | .ty = type_info_ty.toIntern(), |
| 17292 | 17242 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Enum))).toIntern(), |
| 17293 | 17243 | .val = try mod.intern(.{ .aggregate = .{ |
| 17294 | 17244 | .ty = type_enum_ty.toIntern(), |
| 17295 | 17245 | .storage = .{ .elems = &field_values }, |
| 17296 | 17246 | } }), |
| 17297 | | } })).toValue()); |
| 17247 | } }))); |
| 17298 | 17248 | }, |
| 17299 | 17249 | .Union => { |
| 17300 | 17250 | // TODO: look into memoizing this result. |
| ... | ... | @@ -17438,14 +17388,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17438 | 17388 | // decls: []const Declaration, |
| 17439 | 17389 | decls_val, |
| 17440 | 17390 | }; |
| 17441 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 17391 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17442 | 17392 | .ty = type_info_ty.toIntern(), |
| 17443 | 17393 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Union))).toIntern(), |
| 17444 | 17394 | .val = try mod.intern(.{ .aggregate = .{ |
| 17445 | 17395 | .ty = type_union_ty.toIntern(), |
| 17446 | 17396 | .storage = .{ .elems = &field_values }, |
| 17447 | 17397 | } }), |
| 17448 | | } })).toValue()); |
| 17398 | } }))); |
| 17449 | 17399 | }, |
| 17450 | 17400 | .Struct => { |
| 17451 | 17401 | // TODO: look into memoizing this result. |
| ... | ... | @@ -17669,14 +17619,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17669 | 17619 | // is_tuple: bool, |
| 17670 | 17620 | Value.makeBool(struct_ty.isTuple(mod)).toIntern(), |
| 17671 | 17621 | }; |
| 17672 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 17622 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17673 | 17623 | .ty = type_info_ty.toIntern(), |
| 17674 | 17624 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Struct))).toIntern(), |
| 17675 | 17625 | .val = try mod.intern(.{ .aggregate = .{ |
| 17676 | 17626 | .ty = type_struct_ty.toIntern(), |
| 17677 | 17627 | .storage = .{ .elems = &field_values }, |
| 17678 | 17628 | } }), |
| 17679 | | } })).toValue()); |
| 17629 | } }))); |
| 17680 | 17630 | }, |
| 17681 | 17631 | .Opaque => { |
| 17682 | 17632 | // TODO: look into memoizing this result. |
| ... | ... | @@ -17701,14 +17651,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17701 | 17651 | // decls: []const Declaration, |
| 17702 | 17652 | decls_val, |
| 17703 | 17653 | }; |
| 17704 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 17654 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17705 | 17655 | .ty = type_info_ty.toIntern(), |
| 17706 | 17656 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Opaque))).toIntern(), |
| 17707 | 17657 | .val = try mod.intern(.{ .aggregate = .{ |
| 17708 | 17658 | .ty = type_opaque_ty.toIntern(), |
| 17709 | 17659 | .storage = .{ .elems = &field_values }, |
| 17710 | 17660 | } }), |
| 17711 | | } })).toValue()); |
| 17661 | } }))); |
| 17712 | 17662 | }, |
| 17713 | 17663 | .Frame => return sema.failWithUseOfAsync(block, src), |
| 17714 | 17664 | .AnyFrame => return sema.failWithUseOfAsync(block, src), |
| ... | ... | @@ -17842,7 +17792,7 @@ fn zirTypeof(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 17842 | 17792 | const inst_data = zir_datas[inst].un_node; |
| 17843 | 17793 | const operand = try sema.resolveInst(inst_data.operand); |
| 17844 | 17794 | const operand_ty = sema.typeOf(operand); |
| 17845 | | return sema.addType(operand_ty); |
| 17795 | return Air.internedToRef(operand_ty.toIntern()); |
| 17846 | 17796 | } |
| 17847 | 17797 | |
| 17848 | 17798 | fn zirTypeofBuiltin(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -17868,7 +17818,7 @@ fn zirTypeofBuiltin(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 17868 | 17818 | const operand = try sema.resolveBody(&child_block, body, inst); |
| 17869 | 17819 | const operand_ty = sema.typeOf(operand); |
| 17870 | 17820 | if (operand_ty.isGenericPoison()) return error.GenericPoison; |
| 17871 | | return sema.addType(operand_ty); |
| 17821 | return Air.internedToRef(operand_ty.toIntern()); |
| 17872 | 17822 | } |
| 17873 | 17823 | |
| 17874 | 17824 | fn zirTypeofLog2IntType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -17877,7 +17827,7 @@ fn zirTypeofLog2IntType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil |
| 17877 | 17827 | const operand = try sema.resolveInst(inst_data.operand); |
| 17878 | 17828 | const operand_ty = sema.typeOf(operand); |
| 17879 | 17829 | const res_ty = try sema.log2IntType(block, operand_ty, src); |
| 17880 | | return sema.addType(res_ty); |
| 17830 | return Air.internedToRef(res_ty.toIntern()); |
| 17881 | 17831 | } |
| 17882 | 17832 | |
| 17883 | 17833 | fn log2IntType(sema: *Sema, block: *Block, operand: Type, src: LazySrcLoc) CompileError!Type { |
| ... | ... | @@ -17956,7 +17906,7 @@ fn zirTypeofPeer( |
| 17956 | 17906 | } |
| 17957 | 17907 | |
| 17958 | 17908 | const result_type = try sema.resolvePeerTypes(block, src, inst_list, .{ .typeof_builtin_call_node_offset = extra.data.src_node }); |
| 17959 | | return sema.addType(result_type); |
| 17909 | return Air.internedToRef(result_type.toIntern()); |
| 17960 | 17910 | } |
| 17961 | 17911 | |
| 17962 | 17912 | fn zirBoolNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -17972,7 +17922,7 @@ fn zirBoolNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 17972 | 17922 | const operand = try sema.coerce(block, Type.bool, uncasted_operand, operand_src); |
| 17973 | 17923 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 17974 | 17924 | return if (val.isUndef(mod)) |
| 17975 | | sema.addConstUndef(Type.bool) |
| 17925 | mod.undefRef(Type.bool) |
| 17976 | 17926 | else if (val.toBool()) |
| 17977 | 17927 | Air.Inst.Ref.bool_false |
| 17978 | 17928 | else |
| ... | ... | @@ -18348,7 +18298,7 @@ fn zirTryPtr(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileErr |
| 18348 | 18298 | .address_space = ptr_info.flags.address_space, |
| 18349 | 18299 | }, |
| 18350 | 18300 | }); |
| 18351 | | const res_ty_ref = try sema.addType(res_ty); |
| 18301 | const res_ty_ref = Air.internedToRef(res_ty.toIntern()); |
| 18352 | 18302 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, @typeInfo(Air.TryPtr).Struct.fields.len + |
| 18353 | 18303 | sub_block.instructions.items.len); |
| 18354 | 18304 | const try_inst = try parent_block.addInst(.{ |
| ... | ... | @@ -18453,10 +18403,10 @@ fn zirRetErrValue( |
| 18453 | 18403 | const src = inst_data.src(); |
| 18454 | 18404 | // Return the error code from the function. |
| 18455 | 18405 | const error_set_type = try mod.singleErrorSetType(err_name); |
| 18456 | | const result_inst = try sema.addConstant((try mod.intern(.{ .err = .{ |
| 18406 | const result_inst = Air.internedToRef((try mod.intern(.{ .err = .{ |
| 18457 | 18407 | .ty = error_set_type.toIntern(), |
| 18458 | 18408 | .name = err_name, |
| 18459 | | } })).toValue()); |
| 18409 | } }))); |
| 18460 | 18410 | return sema.analyzeRet(block, result_inst, src); |
| 18461 | 18411 | } |
| 18462 | 18412 | |
| ... | ... | @@ -18900,7 +18850,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 18900 | 18850 | .host_size = host_size, |
| 18901 | 18851 | }, |
| 18902 | 18852 | }); |
| 18903 | | return sema.addType(ty); |
| 18853 | return Air.internedToRef(ty.toIntern()); |
| 18904 | 18854 | } |
| 18905 | 18855 | |
| 18906 | 18856 | fn zirStructInitEmpty(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -18915,7 +18865,7 @@ fn zirStructInitEmpty(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 18915 | 18865 | switch (obj_ty.zigTypeTag(mod)) { |
| 18916 | 18866 | .Struct => return sema.structInitEmpty(block, obj_ty, src, src), |
| 18917 | 18867 | .Array, .Vector => return sema.arrayInitEmpty(block, src, obj_ty), |
| 18918 | | .Void => return sema.addConstant(Value.void), |
| 18868 | .Void => return Air.internedToRef(Value.void.toIntern()), |
| 18919 | 18869 | .Union => return sema.fail(block, src, "union initializer must initialize one field", .{}), |
| 18920 | 18870 | else => return sema.failWithArrayInitNotSupported(block, src, obj_ty), |
| 18921 | 18871 | } |
| ... | ... | @@ -18951,10 +18901,10 @@ fn arrayInitEmpty(sema: *Sema, block: *Block, src: LazySrcLoc, obj_ty: Type) Com |
| 18951 | 18901 | return sema.fail(block, src, "expected {d} vector elements; found 0", .{arr_len}); |
| 18952 | 18902 | } |
| 18953 | 18903 | } |
| 18954 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 18904 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 18955 | 18905 | .ty = obj_ty.toIntern(), |
| 18956 | 18906 | .storage = .{ .elems = &.{} }, |
| 18957 | | } })).toValue()); |
| 18907 | } }))); |
| 18958 | 18908 | } |
| 18959 | 18909 | |
| 18960 | 18910 | fn zirUnionInit(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -18997,11 +18947,11 @@ fn unionInit( |
| 18997 | 18947 | const tag_ty = union_ty.unionTagTypeHypothetical(mod); |
| 18998 | 18948 | const enum_field_index = @as(u32, @intCast(tag_ty.enumFieldIndex(field_name, mod).?)); |
| 18999 | 18949 | const tag_val = try mod.enumValueFieldIndex(tag_ty, enum_field_index); |
| 19000 | | return sema.addConstant((try mod.intern(.{ .un = .{ |
| 18950 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 19001 | 18951 | .ty = union_ty.toIntern(), |
| 19002 | 18952 | .tag = try tag_val.intern(tag_ty, mod), |
| 19003 | 18953 | .val = try init_val.intern(field.ty, mod), |
| 19004 | | } })).toValue()); |
| 18954 | } }))); |
| 19005 | 18955 | } |
| 19006 | 18956 | |
| 19007 | 18957 | try sema.requireRuntimeBlock(block, init_src, null); |
| ... | ... | @@ -19125,7 +19075,7 @@ fn zirStructInit( |
| 19125 | 19075 | const alloc = try block.addTy(.alloc, alloc_ty); |
| 19126 | 19076 | const field_ptr = try sema.unionFieldPtr(block, field_src, alloc, field_name, field_src, resolved_ty, true); |
| 19127 | 19077 | try sema.storePtr(block, src, field_ptr, init_inst); |
| 19128 | | const new_tag = try sema.addConstant(tag_val); |
| 19078 | const new_tag = Air.internedToRef(tag_val.toIntern()); |
| 19129 | 19079 | _ = try block.addBinOp(.set_union_tag, alloc, new_tag); |
| 19130 | 19080 | return sema.makePtrConst(block, alloc); |
| 19131 | 19081 | } |
| ... | ... | @@ -19178,7 +19128,7 @@ fn finishStructInit( |
| 19178 | 19128 | } |
| 19179 | 19129 | } |
| 19180 | 19130 | } else { |
| 19181 | | field_inits[i] = try sema.addConstant(default_val.toValue()); |
| 19131 | field_inits[i] = Air.internedToRef(default_val); |
| 19182 | 19132 | } |
| 19183 | 19133 | } |
| 19184 | 19134 | }, |
| ... | ... | @@ -19197,7 +19147,7 @@ fn finishStructInit( |
| 19197 | 19147 | root_msg = try sema.errMsg(block, init_src, template, args); |
| 19198 | 19148 | } |
| 19199 | 19149 | } else { |
| 19200 | | field_inits[i] = try sema.addConstant(field.default_val.toValue()); |
| 19150 | field_inits[i] = Air.internedToRef(field.default_val); |
| 19201 | 19151 | } |
| 19202 | 19152 | } |
| 19203 | 19153 | }, |
| ... | ... | @@ -19492,7 +19442,7 @@ fn zirArrayInit( |
| 19492 | 19442 | } |
| 19493 | 19443 | |
| 19494 | 19444 | if (sentinel_val) |some| { |
| 19495 | | resolved_args[resolved_args.len - 1] = try sema.addConstant(some); |
| 19445 | resolved_args[resolved_args.len - 1] = Air.internedToRef(some.toIntern()); |
| 19496 | 19446 | } |
| 19497 | 19447 | |
| 19498 | 19448 | const opt_runtime_index: ?u32 = for (resolved_args, 0..) |arg, i| { |
| ... | ... | @@ -19541,9 +19491,9 @@ fn zirArrayInit( |
| 19541 | 19491 | .child = array_ty.structFieldType(i, mod).toIntern(), |
| 19542 | 19492 | .flags = .{ .address_space = target_util.defaultAddressSpace(target, .local) }, |
| 19543 | 19493 | }); |
| 19544 | | const elem_ptr_ty_ref = try sema.addType(elem_ptr_ty); |
| 19494 | const elem_ptr_ty_ref = Air.internedToRef(elem_ptr_ty.toIntern()); |
| 19545 | 19495 | |
| 19546 | | const index = try sema.addIntUnsigned(Type.usize, i); |
| 19496 | const index = try mod.intRef(Type.usize, i); |
| 19547 | 19497 | const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); |
| 19548 | 19498 | _ = try block.addBinOp(.store, elem_ptr, arg); |
| 19549 | 19499 | } |
| ... | ... | @@ -19554,10 +19504,10 @@ fn zirArrayInit( |
| 19554 | 19504 | .child = array_ty.elemType2(mod).toIntern(), |
| 19555 | 19505 | .flags = .{ .address_space = target_util.defaultAddressSpace(target, .local) }, |
| 19556 | 19506 | }); |
| 19557 | | const elem_ptr_ty_ref = try sema.addType(elem_ptr_ty); |
| 19507 | const elem_ptr_ty_ref = Air.internedToRef(elem_ptr_ty.toIntern()); |
| 19558 | 19508 | |
| 19559 | 19509 | for (resolved_args, 0..) |arg, i| { |
| 19560 | | const index = try sema.addIntUnsigned(Type.usize, i); |
| 19510 | const index = try mod.intRef(Type.usize, i); |
| 19561 | 19511 | const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); |
| 19562 | 19512 | _ = try block.addBinOp(.store, elem_ptr, arg); |
| 19563 | 19513 | } |
| ... | ... | @@ -19671,7 +19621,7 @@ fn addConstantMaybeRef( |
| 19671 | 19621 | val: Value, |
| 19672 | 19622 | is_ref: bool, |
| 19673 | 19623 | ) !Air.Inst.Ref { |
| 19674 | | if (!is_ref) return sema.addConstant(val); |
| 19624 | if (!is_ref) return Air.internedToRef(val.toIntern()); |
| 19675 | 19625 | |
| 19676 | 19626 | var anon_decl = try block.startAnonDecl(); |
| 19677 | 19627 | defer anon_decl.deinit(); |
| ... | ... | @@ -19730,13 +19680,13 @@ fn fieldType( |
| 19730 | 19680 | .Struct => switch (mod.intern_pool.indexToKey(cur_ty.toIntern())) { |
| 19731 | 19681 | .anon_struct_type => |anon_struct| { |
| 19732 | 19682 | const field_index = try sema.anonStructFieldIndex(block, cur_ty, field_name, field_src); |
| 19733 | | return sema.addType(anon_struct.types[field_index].toType()); |
| 19683 | return Air.internedToRef(anon_struct.types[field_index]); |
| 19734 | 19684 | }, |
| 19735 | 19685 | .struct_type => |struct_type| { |
| 19736 | 19686 | const struct_obj = mod.structPtrUnwrap(struct_type.index).?; |
| 19737 | 19687 | const field = struct_obj.fields.get(field_name) orelse |
| 19738 | 19688 | return sema.failWithBadStructFieldAccess(block, struct_obj, field_src, field_name); |
| 19739 | | return sema.addType(field.ty); |
| 19689 | return Air.internedToRef(field.ty.toIntern()); |
| 19740 | 19690 | }, |
| 19741 | 19691 | else => unreachable, |
| 19742 | 19692 | }, |
| ... | ... | @@ -19744,7 +19694,7 @@ fn fieldType( |
| 19744 | 19694 | const union_obj = mod.typeToUnion(cur_ty).?; |
| 19745 | 19695 | const field = union_obj.fields.get(field_name) orelse |
| 19746 | 19696 | return sema.failWithBadUnionFieldAccess(block, union_obj, field_src, field_name); |
| 19747 | | return sema.addType(field.ty); |
| 19697 | return Air.internedToRef(field.ty.toIntern()); |
| 19748 | 19698 | }, |
| 19749 | 19699 | .Optional => { |
| 19750 | 19700 | // Struct/array init through optional requires the child type to not be a pointer. |
| ... | ... | @@ -19783,10 +19733,10 @@ fn getErrorReturnTrace(sema: *Sema, block: *Block) CompileError!Air.Inst.Ref { |
| 19783 | 19733 | { |
| 19784 | 19734 | return block.addTy(.err_return_trace, opt_ptr_stack_trace_ty); |
| 19785 | 19735 | } |
| 19786 | | return sema.addConstant((try mod.intern(.{ .opt = .{ |
| 19736 | return Air.internedToRef((try mod.intern(.{ .opt = .{ |
| 19787 | 19737 | .ty = opt_ptr_stack_trace_ty.toIntern(), |
| 19788 | 19738 | .val = .none, |
| 19789 | | } })).toValue()); |
| 19739 | } }))); |
| 19790 | 19740 | } |
| 19791 | 19741 | |
| 19792 | 19742 | fn zirFrame( |
| ... | ... | @@ -19810,7 +19760,7 @@ fn zirAlignOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 19810 | 19760 | if (val.isLazyAlign(mod)) { |
| 19811 | 19761 | try sema.queueFullTypeResolution(ty); |
| 19812 | 19762 | } |
| 19813 | | return sema.addConstant(val); |
| 19763 | return Air.internedToRef(val.toIntern()); |
| 19814 | 19764 | } |
| 19815 | 19765 | |
| 19816 | 19766 | fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -19818,9 +19768,9 @@ fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 19818 | 19768 | const inst_data = sema.code.instructions.items(.data)[inst].un_node; |
| 19819 | 19769 | const operand = try sema.resolveInst(inst_data.operand); |
| 19820 | 19770 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 19821 | | if (val.isUndef(mod)) return sema.addConstUndef(Type.u1); |
| 19822 | | if (val.toBool()) return sema.addConstant(try mod.intValue(Type.u1, 1)); |
| 19823 | | return sema.addConstant(try mod.intValue(Type.u1, 0)); |
| 19771 | if (val.isUndef(mod)) return mod.undefRef(Type.u1); |
| 19772 | if (val.toBool()) return Air.internedToRef((try mod.intValue(Type.u1, 1)).toIntern()); |
| 19773 | return Air.internedToRef((try mod.intValue(Type.u1, 0)).toIntern()); |
| 19824 | 19774 | } |
| 19825 | 19775 | return block.addUnOp(.int_from_bool, operand); |
| 19826 | 19776 | } |
| ... | ... | @@ -19878,17 +19828,17 @@ fn zirUnaryMath( |
| 19878 | 19828 | }); |
| 19879 | 19829 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 19880 | 19830 | if (val.isUndef(mod)) |
| 19881 | | return sema.addConstUndef(result_ty); |
| 19831 | return mod.undefRef(result_ty); |
| 19882 | 19832 | |
| 19883 | 19833 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| 19884 | 19834 | for (elems, 0..) |*elem, i| { |
| 19885 | 19835 | const elem_val = try val.elemValue(sema.mod, i); |
| 19886 | 19836 | elem.* = try (try eval(elem_val, scalar_ty, sema.arena, sema.mod)).intern(scalar_ty, mod); |
| 19887 | 19837 | } |
| 19888 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 19838 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 19889 | 19839 | .ty = result_ty.toIntern(), |
| 19890 | 19840 | .storage = .{ .elems = elems }, |
| 19891 | | } })).toValue()); |
| 19841 | } }))); |
| 19892 | 19842 | } |
| 19893 | 19843 | |
| 19894 | 19844 | try sema.requireRuntimeBlock(block, operand_src, null); |
| ... | ... | @@ -19897,9 +19847,9 @@ fn zirUnaryMath( |
| 19897 | 19847 | .ComptimeFloat, .Float => { |
| 19898 | 19848 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { |
| 19899 | 19849 | if (operand_val.isUndef(mod)) |
| 19900 | | return sema.addConstUndef(operand_ty); |
| 19850 | return mod.undefRef(operand_ty); |
| 19901 | 19851 | const result_val = try eval(operand_val, operand_ty, sema.arena, sema.mod); |
| 19902 | | return sema.addConstant(result_val); |
| 19852 | return Air.internedToRef(result_val.toIntern()); |
| 19903 | 19853 | } |
| 19904 | 19854 | |
| 19905 | 19855 | try sema.requireRuntimeBlock(block, operand_src, null); |
| ... | ... | @@ -20024,7 +19974,7 @@ fn zirReify( |
| 20024 | 19974 | const signedness = mod.toEnum(std.builtin.Signedness, signedness_val); |
| 20025 | 19975 | const bits = @as(u16, @intCast(bits_val.toUnsignedInt(mod))); |
| 20026 | 19976 | const ty = try mod.intType(signedness, bits); |
| 20027 | | return sema.addType(ty); |
| 19977 | return Air.internedToRef(ty.toIntern()); |
| 20028 | 19978 | }, |
| 20029 | 19979 | .Vector => { |
| 20030 | 19980 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20044,7 +19994,7 @@ fn zirReify( |
| 20044 | 19994 | .len = len, |
| 20045 | 19995 | .child = child_ty.toIntern(), |
| 20046 | 19996 | }); |
| 20047 | | return sema.addType(ty); |
| 19997 | return Air.internedToRef(ty.toIntern()); |
| 20048 | 19998 | }, |
| 20049 | 19999 | .Float => { |
| 20050 | 20000 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20061,7 +20011,7 @@ fn zirReify( |
| 20061 | 20011 | 128 => Type.f128, |
| 20062 | 20012 | else => return sema.fail(block, src, "{}-bit float unsupported", .{bits}), |
| 20063 | 20013 | }; |
| 20064 | | return sema.addType(ty); |
| 20014 | return Air.internedToRef(ty.toIntern()); |
| 20065 | 20015 | }, |
| 20066 | 20016 | .Pointer => { |
| 20067 | 20017 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20167,7 +20117,7 @@ fn zirReify( |
| 20167 | 20117 | .is_allowzero = is_allowzero_val.toBool(), |
| 20168 | 20118 | }, |
| 20169 | 20119 | }); |
| 20170 | | return sema.addType(ty); |
| 20120 | return Air.internedToRef(ty.toIntern()); |
| 20171 | 20121 | }, |
| 20172 | 20122 | .Array => { |
| 20173 | 20123 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20193,7 +20143,7 @@ fn zirReify( |
| 20193 | 20143 | .sentinel = if (sentinel) |s| s.toIntern() else .none, |
| 20194 | 20144 | .child = child_ty.toIntern(), |
| 20195 | 20145 | }); |
| 20196 | | return sema.addType(ty); |
| 20146 | return Air.internedToRef(ty.toIntern()); |
| 20197 | 20147 | }, |
| 20198 | 20148 | .Optional => { |
| 20199 | 20149 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20204,7 +20154,7 @@ fn zirReify( |
| 20204 | 20154 | const child_ty = child_val.toType(); |
| 20205 | 20155 | |
| 20206 | 20156 | const ty = try mod.optionalType(child_ty.toIntern()); |
| 20207 | | return sema.addType(ty); |
| 20157 | return Air.internedToRef(ty.toIntern()); |
| 20208 | 20158 | }, |
| 20209 | 20159 | .ErrorUnion => { |
| 20210 | 20160 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20223,11 +20173,11 @@ fn zirReify( |
| 20223 | 20173 | } |
| 20224 | 20174 | |
| 20225 | 20175 | const ty = try mod.errorUnionType(error_set_ty, payload_ty); |
| 20226 | | return sema.addType(ty); |
| 20176 | return Air.internedToRef(ty.toIntern()); |
| 20227 | 20177 | }, |
| 20228 | 20178 | .ErrorSet => { |
| 20229 | 20179 | const payload_val = union_val.val.toValue().optionalValue(mod) orelse |
| 20230 | | return sema.addType(Type.anyerror); |
| 20180 | return Air.internedToRef(Type.anyerror.toIntern()); |
| 20231 | 20181 | |
| 20232 | 20182 | const len = try sema.usizeCast(block, src, payload_val.sliceLen(mod)); |
| 20233 | 20183 | var names: InferredErrorSet.NameMap = .{}; |
| ... | ... | @@ -20250,7 +20200,7 @@ fn zirReify( |
| 20250 | 20200 | } |
| 20251 | 20201 | |
| 20252 | 20202 | const ty = try mod.errorSetFromUnsortedNames(names.keys()); |
| 20253 | | return sema.addType(ty); |
| 20203 | return Air.internedToRef(ty.toIntern()); |
| 20254 | 20204 | }, |
| 20255 | 20205 | .Struct => { |
| 20256 | 20206 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | ... | @@ -20744,7 +20694,7 @@ fn zirReify( |
| 20744 | 20694 | .section_is_generic = false, |
| 20745 | 20695 | .addrspace_is_generic = false, |
| 20746 | 20696 | }); |
| 20747 | | return sema.addType(ty); |
| 20697 | return Air.internedToRef(ty.toIntern()); |
| 20748 | 20698 | }, |
| 20749 | 20699 | .Frame => return sema.failWithUseOfAsync(block, src), |
| 20750 | 20700 | } |
| ... | ... | @@ -21106,7 +21056,7 @@ fn zirIntFromFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 21106 | 21056 | |
| 21107 | 21057 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21108 | 21058 | const result_val = try sema.intFromFloat(block, operand_src, val, operand_ty, dest_ty); |
| 21109 | | return sema.addConstant(result_val); |
| 21059 | return Air.internedToRef(result_val.toIntern()); |
| 21110 | 21060 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { |
| 21111 | 21061 | return sema.failWithNeededComptime(block, operand_src, "value being casted to 'comptime_int' must be comptime-known"); |
| 21112 | 21062 | } |
| ... | ... | @@ -21114,17 +21064,17 @@ fn zirIntFromFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 21114 | 21064 | try sema.requireRuntimeBlock(block, inst_data.src(), operand_src); |
| 21115 | 21065 | if (dest_ty.intInfo(mod).bits == 0) { |
| 21116 | 21066 | if (block.wantSafety()) { |
| 21117 | | const ok = try block.addBinOp(if (block.float_mode == .Optimized) .cmp_eq_optimized else .cmp_eq, operand, try sema.addConstant(try mod.floatValue(operand_ty, 0.0))); |
| 21067 | const ok = try block.addBinOp(if (block.float_mode == .Optimized) .cmp_eq_optimized else .cmp_eq, operand, Air.internedToRef((try mod.floatValue(operand_ty, 0.0)).toIntern())); |
| 21118 | 21068 | try sema.addSafetyCheck(block, src, ok, .integer_part_out_of_bounds); |
| 21119 | 21069 | } |
| 21120 | | return sema.addConstant(try mod.intValue(dest_ty, 0)); |
| 21070 | return Air.internedToRef((try mod.intValue(dest_ty, 0)).toIntern()); |
| 21121 | 21071 | } |
| 21122 | 21072 | const result = try block.addTyOp(if (block.float_mode == .Optimized) .int_from_float_optimized else .int_from_float, dest_ty, operand); |
| 21123 | 21073 | if (block.wantSafety()) { |
| 21124 | 21074 | const back = try block.addTyOp(.float_from_int, operand_ty, result); |
| 21125 | 21075 | const diff = try block.addBinOp(.sub, operand, back); |
| 21126 | | const ok_pos = try block.addBinOp(if (block.float_mode == .Optimized) .cmp_lt_optimized else .cmp_lt, diff, try sema.addConstant(try mod.floatValue(operand_ty, 1.0))); |
| 21127 | | const ok_neg = try block.addBinOp(if (block.float_mode == .Optimized) .cmp_gt_optimized else .cmp_gt, diff, try sema.addConstant(try mod.floatValue(operand_ty, -1.0))); |
| 21076 | const ok_pos = try block.addBinOp(if (block.float_mode == .Optimized) .cmp_lt_optimized else .cmp_lt, diff, Air.internedToRef((try mod.floatValue(operand_ty, 1.0)).toIntern())); |
| 21077 | const ok_neg = try block.addBinOp(if (block.float_mode == .Optimized) .cmp_gt_optimized else .cmp_gt, diff, Air.internedToRef((try mod.floatValue(operand_ty, -1.0)).toIntern())); |
| 21128 | 21078 | const ok = try block.addBinOp(.bool_and, ok_pos, ok_neg); |
| 21129 | 21079 | try sema.addSafetyCheck(block, src, ok, .integer_part_out_of_bounds); |
| 21130 | 21080 | } |
| ... | ... | @@ -21146,7 +21096,7 @@ fn zirFloatFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 21146 | 21096 | |
| 21147 | 21097 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21148 | 21098 | const result_val = try val.floatFromIntAdvanced(sema.arena, operand_ty, dest_ty, sema.mod, sema); |
| 21149 | | return sema.addConstant(result_val); |
| 21099 | return Air.internedToRef(result_val.toIntern()); |
| 21150 | 21100 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { |
| 21151 | 21101 | return sema.failWithNeededComptime(block, operand_src, "value being casted to 'comptime_float' must be comptime-known"); |
| 21152 | 21102 | } |
| ... | ... | @@ -21196,7 +21146,7 @@ fn zirPtrFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21196 | 21146 | .Pointer => try mod.ptrIntValue(ptr_ty, addr), |
| 21197 | 21147 | else => unreachable, |
| 21198 | 21148 | }; |
| 21199 | | return sema.addConstant(ptr_val); |
| 21149 | return Air.internedToRef(ptr_val.toIntern()); |
| 21200 | 21150 | } |
| 21201 | 21151 | |
| 21202 | 21152 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | ... | @@ -21207,9 +21157,7 @@ fn zirPtrFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21207 | 21157 | } |
| 21208 | 21158 | |
| 21209 | 21159 | if (ptr_align > 1) { |
| 21210 | | const align_minus_1 = try sema.addConstant( |
| 21211 | | try mod.intValue(Type.usize, ptr_align - 1), |
| 21212 | | ); |
| 21160 | const align_minus_1 = Air.internedToRef((try mod.intValue(Type.usize, ptr_align - 1)).toIntern()); |
| 21213 | 21161 | const remainder = try block.addBinOp(.bit_and, operand_coerced, align_minus_1); |
| 21214 | 21162 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); |
| 21215 | 21163 | try sema.addSafetyCheck(block, src, is_aligned, .incorrect_alignment); |
| ... | ... | @@ -21293,7 +21241,7 @@ fn zirErrSetCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat |
| 21293 | 21241 | } |
| 21294 | 21242 | } |
| 21295 | 21243 | |
| 21296 | | return sema.addConstant(try mod.getCoerced(val, dest_ty)); |
| 21244 | return Air.internedToRef((try mod.getCoerced(val, dest_ty)).toIntern()); |
| 21297 | 21245 | } |
| 21298 | 21246 | |
| 21299 | 21247 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | ... | @@ -21620,16 +21568,16 @@ fn ptrCastFull( |
| 21620 | 21568 | } |
| 21621 | 21569 | } |
| 21622 | 21570 | if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { |
| 21623 | | if (ptr_val.isUndef(mod)) return sema.addConstUndef(dest_ty); |
| 21571 | if (ptr_val.isUndef(mod)) return mod.undefRef(dest_ty); |
| 21624 | 21572 | const arr_len = try mod.intValue(Type.usize, src_info.child.toType().arrayLen(mod)); |
| 21625 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 21573 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 21626 | 21574 | .ty = dest_ty.toIntern(), |
| 21627 | 21575 | .addr = mod.intern_pool.indexToKey(ptr_val.toIntern()).ptr.addr, |
| 21628 | 21576 | .len = arr_len.toIntern(), |
| 21629 | | } })).toValue()); |
| 21577 | } }))); |
| 21630 | 21578 | } else { |
| 21631 | 21579 | assert(dest_ptr_ty.eql(dest_ty, mod)); |
| 21632 | | return sema.addConstant(try mod.getCoerced(ptr_val, dest_ty)); |
| 21580 | return Air.internedToRef((try mod.getCoerced(ptr_val, dest_ty)).toIntern()); |
| 21633 | 21581 | } |
| 21634 | 21582 | } |
| 21635 | 21583 | } |
| ... | ... | @@ -21650,9 +21598,7 @@ fn ptrCastFull( |
| 21650 | 21598 | } |
| 21651 | 21599 | |
| 21652 | 21600 | if (block.wantSafety() and dest_align > src_align and try sema.typeHasRuntimeBits(dest_info.child.toType())) { |
| 21653 | | const align_minus_1 = try sema.addConstant( |
| 21654 | | try mod.intValue(Type.usize, dest_align - 1), |
| 21655 | | ); |
| 21601 | const align_minus_1 = Air.internedToRef((try mod.intValue(Type.usize, dest_align - 1)).toIntern()); |
| 21656 | 21602 | const ptr_int = try block.addUnOp(.int_from_ptr, ptr); |
| 21657 | 21603 | const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); |
| 21658 | 21604 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); |
| ... | ... | @@ -21676,7 +21622,7 @@ fn ptrCastFull( |
| 21676 | 21622 | const intermediate = try block.addInst(.{ |
| 21677 | 21623 | .tag = .addrspace_cast, |
| 21678 | 21624 | .data = .{ .ty_op = .{ |
| 21679 | | .ty = try sema.addType(intermediate_ty), |
| 21625 | .ty = Air.internedToRef(intermediate_ty.toIntern()), |
| 21680 | 21626 | .operand = ptr, |
| 21681 | 21627 | } }, |
| 21682 | 21628 | }); |
| ... | ... | @@ -21692,13 +21638,11 @@ fn ptrCastFull( |
| 21692 | 21638 | if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { |
| 21693 | 21639 | // We have to construct a slice using the operand's child's array length |
| 21694 | 21640 | // Note that we know from the check at the start of the function that operand_ty is slice-like |
| 21695 | | const arr_len = try sema.addConstant( |
| 21696 | | try mod.intValue(Type.usize, src_info.child.toType().arrayLen(mod)), |
| 21697 | | ); |
| 21641 | const arr_len = Air.internedToRef((try mod.intValue(Type.usize, src_info.child.toType().arrayLen(mod))).toIntern()); |
| 21698 | 21642 | return block.addInst(.{ |
| 21699 | 21643 | .tag = .slice, |
| 21700 | 21644 | .data = .{ .ty_pl = .{ |
| 21701 | | .ty = try sema.addType(dest_ty), |
| 21645 | .ty = Air.internedToRef(dest_ty.toIntern()), |
| 21702 | 21646 | .payload = try sema.addExtra(Air.Bin{ |
| 21703 | 21647 | .lhs = result_ptr, |
| 21704 | 21648 | .rhs = arr_len, |
| ... | ... | @@ -21727,7 +21671,7 @@ fn zirPtrCastNoDest(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst |
| 21727 | 21671 | const dest_ty = try mod.ptrType(ptr_info); |
| 21728 | 21672 | |
| 21729 | 21673 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { |
| 21730 | | return sema.addConstant(try mod.getCoerced(operand_val, dest_ty)); |
| 21674 | return Air.internedToRef((try mod.getCoerced(operand_val, dest_ty)).toIntern()); |
| 21731 | 21675 | } |
| 21732 | 21676 | |
| 21733 | 21677 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -21759,13 +21703,13 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21759 | 21703 | const dest_info = dest_scalar_ty.intInfo(mod); |
| 21760 | 21704 | |
| 21761 | 21705 | if (try sema.typeHasOnePossibleValue(dest_ty)) |val| { |
| 21762 | | return sema.addConstant(val); |
| 21706 | return Air.internedToRef(val.toIntern()); |
| 21763 | 21707 | } |
| 21764 | 21708 | |
| 21765 | 21709 | if (operand_scalar_ty.zigTypeTag(mod) != .ComptimeInt) { |
| 21766 | 21710 | const operand_info = operand_ty.intInfo(mod); |
| 21767 | 21711 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21768 | | return sema.addConstant(val); |
| 21712 | return Air.internedToRef(val.toIntern()); |
| 21769 | 21713 | } |
| 21770 | 21714 | |
| 21771 | 21715 | if (operand_info.signedness != dest_info.signedness) { |
| ... | ... | @@ -21795,22 +21739,22 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21795 | 21739 | } |
| 21796 | 21740 | |
| 21797 | 21741 | if (try sema.resolveMaybeUndefValIntable(operand)) |val| { |
| 21798 | | if (val.isUndef(mod)) return sema.addConstUndef(dest_ty); |
| 21742 | if (val.isUndef(mod)) return mod.undefRef(dest_ty); |
| 21799 | 21743 | if (!dest_is_vector) { |
| 21800 | | return sema.addConstant(try mod.getCoerced( |
| 21744 | return Air.internedToRef((try mod.getCoerced( |
| 21801 | 21745 | try val.intTrunc(operand_ty, sema.arena, dest_info.signedness, dest_info.bits, mod), |
| 21802 | 21746 | dest_ty, |
| 21803 | | )); |
| 21747 | )).toIntern()); |
| 21804 | 21748 | } |
| 21805 | 21749 | const elems = try sema.arena.alloc(InternPool.Index, operand_ty.vectorLen(mod)); |
| 21806 | 21750 | for (elems, 0..) |*elem, i| { |
| 21807 | 21751 | const elem_val = try val.elemValue(mod, i); |
| 21808 | 21752 | elem.* = try (try elem_val.intTrunc(operand_scalar_ty, sema.arena, dest_info.signedness, dest_info.bits, mod)).intern(dest_scalar_ty, mod); |
| 21809 | 21753 | } |
| 21810 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 21754 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 21811 | 21755 | .ty = dest_ty.toIntern(), |
| 21812 | 21756 | .storage = .{ .elems = elems }, |
| 21813 | | } })).toValue()); |
| 21757 | } }))); |
| 21814 | 21758 | } |
| 21815 | 21759 | |
| 21816 | 21760 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | ... | @@ -21834,7 +21778,7 @@ fn zirBitCount( |
| 21834 | 21778 | const bits = operand_ty.intInfo(mod).bits; |
| 21835 | 21779 | |
| 21836 | 21780 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21837 | | return sema.addConstant(val); |
| 21781 | return Air.internedToRef(val.toIntern()); |
| 21838 | 21782 | } |
| 21839 | 21783 | |
| 21840 | 21784 | const result_scalar_ty = try mod.smallestUnsignedInt(bits); |
| ... | ... | @@ -21846,7 +21790,7 @@ fn zirBitCount( |
| 21846 | 21790 | .child = result_scalar_ty.toIntern(), |
| 21847 | 21791 | }); |
| 21848 | 21792 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21849 | | if (val.isUndef(mod)) return sema.addConstUndef(result_ty); |
| 21793 | if (val.isUndef(mod)) return mod.undefRef(result_ty); |
| 21850 | 21794 | |
| 21851 | 21795 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| 21852 | 21796 | const scalar_ty = operand_ty.scalarType(mod); |
| ... | ... | @@ -21855,10 +21799,10 @@ fn zirBitCount( |
| 21855 | 21799 | const count = comptimeOp(elem_val, scalar_ty, mod); |
| 21856 | 21800 | elem.* = (try mod.intValue(result_scalar_ty, count)).toIntern(); |
| 21857 | 21801 | } |
| 21858 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 21802 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 21859 | 21803 | .ty = result_ty.toIntern(), |
| 21860 | 21804 | .storage = .{ .elems = elems }, |
| 21861 | | } })).toValue()); |
| 21805 | } }))); |
| 21862 | 21806 | } else { |
| 21863 | 21807 | try sema.requireRuntimeBlock(block, src, operand_src); |
| 21864 | 21808 | return block.addTyOp(air_tag, result_ty, operand); |
| ... | ... | @@ -21866,8 +21810,8 @@ fn zirBitCount( |
| 21866 | 21810 | }, |
| 21867 | 21811 | .Int => { |
| 21868 | 21812 | if (try sema.resolveMaybeUndefLazyVal(operand)) |val| { |
| 21869 | | if (val.isUndef(mod)) return sema.addConstUndef(result_scalar_ty); |
| 21870 | | return sema.addIntUnsigned(result_scalar_ty, comptimeOp(val, operand_ty, mod)); |
| 21813 | if (val.isUndef(mod)) return mod.undefRef(result_scalar_ty); |
| 21814 | return mod.intRef(result_scalar_ty, comptimeOp(val, operand_ty, mod)); |
| 21871 | 21815 | } else { |
| 21872 | 21816 | try sema.requireRuntimeBlock(block, src, operand_src); |
| 21873 | 21817 | return block.addTyOp(air_tag, result_scalar_ty, operand); |
| ... | ... | @@ -21896,15 +21840,15 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21896 | 21840 | } |
| 21897 | 21841 | |
| 21898 | 21842 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21899 | | return sema.addConstant(val); |
| 21843 | return Air.internedToRef(val.toIntern()); |
| 21900 | 21844 | } |
| 21901 | 21845 | |
| 21902 | 21846 | switch (operand_ty.zigTypeTag(mod)) { |
| 21903 | 21847 | .Int => { |
| 21904 | 21848 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21905 | | if (val.isUndef(mod)) return sema.addConstUndef(operand_ty); |
| 21849 | if (val.isUndef(mod)) return mod.undefRef(operand_ty); |
| 21906 | 21850 | const result_val = try val.byteSwap(operand_ty, mod, sema.arena); |
| 21907 | | return sema.addConstant(result_val); |
| 21851 | return Air.internedToRef(result_val.toIntern()); |
| 21908 | 21852 | } else operand_src; |
| 21909 | 21853 | |
| 21910 | 21854 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | ... | @@ -21913,7 +21857,7 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21913 | 21857 | .Vector => { |
| 21914 | 21858 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21915 | 21859 | if (val.isUndef(mod)) |
| 21916 | | return sema.addConstUndef(operand_ty); |
| 21860 | return mod.undefRef(operand_ty); |
| 21917 | 21861 | |
| 21918 | 21862 | const vec_len = operand_ty.vectorLen(mod); |
| 21919 | 21863 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| ... | ... | @@ -21921,10 +21865,10 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21921 | 21865 | const elem_val = try val.elemValue(mod, i); |
| 21922 | 21866 | elem.* = try (try elem_val.byteSwap(scalar_ty, mod, sema.arena)).intern(scalar_ty, mod); |
| 21923 | 21867 | } |
| 21924 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 21868 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 21925 | 21869 | .ty = operand_ty.toIntern(), |
| 21926 | 21870 | .storage = .{ .elems = elems }, |
| 21927 | | } })).toValue()); |
| 21871 | } }))); |
| 21928 | 21872 | } else operand_src; |
| 21929 | 21873 | |
| 21930 | 21874 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | ... | @@ -21943,16 +21887,16 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21943 | 21887 | const scalar_ty = try sema.checkIntOrVector(block, operand, operand_src); |
| 21944 | 21888 | |
| 21945 | 21889 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21946 | | return sema.addConstant(val); |
| 21890 | return Air.internedToRef(val.toIntern()); |
| 21947 | 21891 | } |
| 21948 | 21892 | |
| 21949 | 21893 | const mod = sema.mod; |
| 21950 | 21894 | switch (operand_ty.zigTypeTag(mod)) { |
| 21951 | 21895 | .Int => { |
| 21952 | 21896 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21953 | | if (val.isUndef(mod)) return sema.addConstUndef(operand_ty); |
| 21897 | if (val.isUndef(mod)) return mod.undefRef(operand_ty); |
| 21954 | 21898 | const result_val = try val.bitReverse(operand_ty, mod, sema.arena); |
| 21955 | | return sema.addConstant(result_val); |
| 21899 | return Air.internedToRef(result_val.toIntern()); |
| 21956 | 21900 | } else operand_src; |
| 21957 | 21901 | |
| 21958 | 21902 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | ... | @@ -21961,7 +21905,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21961 | 21905 | .Vector => { |
| 21962 | 21906 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21963 | 21907 | if (val.isUndef(mod)) |
| 21964 | | return sema.addConstUndef(operand_ty); |
| 21908 | return mod.undefRef(operand_ty); |
| 21965 | 21909 | |
| 21966 | 21910 | const vec_len = operand_ty.vectorLen(mod); |
| 21967 | 21911 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| ... | ... | @@ -21969,10 +21913,10 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21969 | 21913 | const elem_val = try val.elemValue(mod, i); |
| 21970 | 21914 | elem.* = try (try elem_val.bitReverse(scalar_ty, mod, sema.arena)).intern(scalar_ty, mod); |
| 21971 | 21915 | } |
| 21972 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 21916 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 21973 | 21917 | .ty = operand_ty.toIntern(), |
| 21974 | 21918 | .storage = .{ .elems = elems }, |
| 21975 | | } })).toValue()); |
| 21919 | } }))); |
| 21976 | 21920 | } else operand_src; |
| 21977 | 21921 | |
| 21978 | 21922 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | ... | @@ -21984,13 +21928,13 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21984 | 21928 | |
| 21985 | 21929 | fn zirBitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 21986 | 21930 | const offset = try sema.bitOffsetOf(block, inst); |
| 21987 | | return sema.addIntUnsigned(Type.comptime_int, offset); |
| 21931 | return sema.mod.intRef(Type.comptime_int, offset); |
| 21988 | 21932 | } |
| 21989 | 21933 | |
| 21990 | 21934 | fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 21991 | 21935 | const offset = try sema.bitOffsetOf(block, inst); |
| 21992 | 21936 | // TODO reminder to make this a compile error for packed structs |
| 21993 | | return sema.addIntUnsigned(Type.comptime_int, offset / 8); |
| 21937 | return sema.mod.intRef(Type.comptime_int, offset / 8); |
| 21994 | 21938 | } |
| 21995 | 21939 | |
| 21996 | 21940 | fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 { |
| ... | ... | @@ -22622,10 +22566,10 @@ fn zirCmpxchg( |
| 22622 | 22566 | |
| 22623 | 22567 | // special case zero bit types |
| 22624 | 22568 | if ((try sema.typeHasOnePossibleValue(elem_ty)) != null) { |
| 22625 | | return sema.addConstant((try mod.intern(.{ .opt = .{ |
| 22569 | return Air.internedToRef((try mod.intern(.{ .opt = .{ |
| 22626 | 22570 | .ty = result_ty.toIntern(), |
| 22627 | 22571 | .val = .none, |
| 22628 | | } })).toValue()); |
| 22572 | } }))); |
| 22629 | 22573 | } |
| 22630 | 22574 | |
| 22631 | 22575 | const runtime_src = if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| rs: { |
| ... | ... | @@ -22634,7 +22578,7 @@ fn zirCmpxchg( |
| 22634 | 22578 | if (expected_val.isUndef(mod) or new_val.isUndef(mod)) { |
| 22635 | 22579 | // TODO: this should probably cause the memory stored at the pointer |
| 22636 | 22580 | // to become undef as well |
| 22637 | | return sema.addConstUndef(result_ty); |
| 22581 | return mod.undefRef(result_ty); |
| 22638 | 22582 | } |
| 22639 | 22583 | const ptr_ty = sema.typeOf(ptr); |
| 22640 | 22584 | const stored_val = (try sema.pointerDeref(block, ptr_src, ptr_val, ptr_ty)) orelse break :rs ptr_src; |
| ... | ... | @@ -22645,7 +22589,7 @@ fn zirCmpxchg( |
| 22645 | 22589 | break :blk .none; |
| 22646 | 22590 | } else stored_val.toIntern(), |
| 22647 | 22591 | } }); |
| 22648 | | return sema.addConstant(result_val.toValue()); |
| 22592 | return Air.internedToRef(result_val); |
| 22649 | 22593 | } else break :rs new_value_src; |
| 22650 | 22594 | } else break :rs expected_src; |
| 22651 | 22595 | } else ptr_src; |
| ... | ... | @@ -22657,7 +22601,7 @@ fn zirCmpxchg( |
| 22657 | 22601 | return block.addInst(.{ |
| 22658 | 22602 | .tag = air_tag, |
| 22659 | 22603 | .data = .{ .ty_pl = .{ |
| 22660 | | .ty = try sema.addType(result_ty), |
| 22604 | .ty = Air.internedToRef(result_ty.toIntern()), |
| 22661 | 22605 | .payload = try sema.addExtra(Air.Cmpxchg{ |
| 22662 | 22606 | .ptr = ptr, |
| 22663 | 22607 | .expected_value = expected_value, |
| ... | ... | @@ -22682,8 +22626,8 @@ fn zirSplat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I |
| 22682 | 22626 | const scalar_ty = dest_ty.childType(mod); |
| 22683 | 22627 | const scalar = try sema.coerce(block, scalar_ty, operand, scalar_src); |
| 22684 | 22628 | if (try sema.resolveMaybeUndefVal(scalar)) |scalar_val| { |
| 22685 | | if (scalar_val.isUndef(mod)) return sema.addConstUndef(dest_ty); |
| 22686 | | return sema.addConstant(try sema.splat(dest_ty, scalar_val)); |
| 22629 | if (scalar_val.isUndef(mod)) return mod.undefRef(dest_ty); |
| 22630 | return Air.internedToRef((try sema.splat(dest_ty, scalar_val)).toIntern()); |
| 22687 | 22631 | } |
| 22688 | 22632 | |
| 22689 | 22633 | try sema.requireRuntimeBlock(block, inst_data.src(), scalar_src); |
| ... | ... | @@ -22730,7 +22674,7 @@ fn zirReduce(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 22730 | 22674 | } |
| 22731 | 22675 | |
| 22732 | 22676 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { |
| 22733 | | if (operand_val.isUndef(mod)) return sema.addConstUndef(scalar_ty); |
| 22677 | if (operand_val.isUndef(mod)) return mod.undefRef(scalar_ty); |
| 22734 | 22678 | |
| 22735 | 22679 | var accum: Value = try operand_val.elemValue(mod, 0); |
| 22736 | 22680 | var i: u32 = 1; |
| ... | ... | @@ -22746,7 +22690,7 @@ fn zirReduce(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 22746 | 22690 | .Mul => accum = try accum.numberMulWrap(elem_val, scalar_ty, sema.arena, mod), |
| 22747 | 22691 | } |
| 22748 | 22692 | } |
| 22749 | | return sema.addConstant(accum); |
| 22693 | return Air.internedToRef(accum.toIntern()); |
| 22750 | 22694 | } |
| 22751 | 22695 | |
| 22752 | 22696 | try sema.requireRuntimeBlock(block, inst_data.src(), operand_src); |
| ... | ... | @@ -22825,7 +22769,7 @@ fn analyzeShuffle( |
| 22825 | 22769 | }), |
| 22826 | 22770 | }; |
| 22827 | 22771 | if (maybe_a_len == null and maybe_b_len == null) { |
| 22828 | | return sema.addConstUndef(res_ty); |
| 22772 | return mod.undefRef(res_ty); |
| 22829 | 22773 | } |
| 22830 | 22774 | const a_len = @as(u32, @intCast(maybe_a_len orelse maybe_b_len.?)); |
| 22831 | 22775 | const b_len = @as(u32, @intCast(maybe_b_len orelse a_len)); |
| ... | ... | @@ -22839,8 +22783,8 @@ fn analyzeShuffle( |
| 22839 | 22783 | .child = elem_ty.toIntern(), |
| 22840 | 22784 | }); |
| 22841 | 22785 | |
| 22842 | | if (maybe_a_len == null) a = try sema.addConstUndef(a_ty) else a = try sema.coerce(block, a_ty, a, a_src); |
| 22843 | | if (maybe_b_len == null) b = try sema.addConstUndef(b_ty) else b = try sema.coerce(block, b_ty, b, b_src); |
| 22786 | if (maybe_a_len == null) a = try mod.undefRef(a_ty) else a = try sema.coerce(block, a_ty, a, a_src); |
| 22787 | if (maybe_b_len == null) b = try mod.undefRef(b_ty) else b = try sema.coerce(block, b_ty, b, b_src); |
| 22844 | 22788 | |
| 22845 | 22789 | const operand_info = [2]std.meta.Tuple(&.{ u64, LazySrcLoc, Type }){ |
| 22846 | 22790 | .{ a_len, a_src, a_ty }, |
| ... | ... | @@ -22893,10 +22837,10 @@ fn analyzeShuffle( |
| 22893 | 22837 | const unsigned = if (int >= 0) @as(u32, @intCast(int)) else @as(u32, @intCast(~int)); |
| 22894 | 22838 | values[i] = try (try (if (int >= 0) a_val else b_val).elemValue(mod, unsigned)).intern(elem_ty, mod); |
| 22895 | 22839 | } |
| 22896 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 22840 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 22897 | 22841 | .ty = res_ty.toIntern(), |
| 22898 | 22842 | .storage = .{ .elems = values }, |
| 22899 | | } })).toValue()); |
| 22843 | } }))); |
| 22900 | 22844 | } |
| 22901 | 22845 | } |
| 22902 | 22846 | |
| ... | ... | @@ -22923,10 +22867,10 @@ fn analyzeShuffle( |
| 22923 | 22867 | } }); |
| 22924 | 22868 | |
| 22925 | 22869 | if (a_len < b_len) { |
| 22926 | | const undef = try sema.addConstUndef(a_ty); |
| 22870 | const undef = try mod.undefRef(a_ty); |
| 22927 | 22871 | a = try sema.analyzeShuffle(block, src_node, elem_ty, a, undef, expand_mask.toValue(), @as(u32, @intCast(max_len))); |
| 22928 | 22872 | } else { |
| 22929 | | const undef = try sema.addConstUndef(b_ty); |
| 22873 | const undef = try mod.undefRef(b_ty); |
| 22930 | 22874 | b = try sema.analyzeShuffle(block, src_node, elem_ty, b, undef, expand_mask.toValue(), @as(u32, @intCast(max_len))); |
| 22931 | 22875 | } |
| 22932 | 22876 | } |
| ... | ... | @@ -22934,7 +22878,7 @@ fn analyzeShuffle( |
| 22934 | 22878 | return block.addInst(.{ |
| 22935 | 22879 | .tag = .shuffle, |
| 22936 | 22880 | .data = .{ .ty_pl = .{ |
| 22937 | | .ty = try sema.addType(res_ty), |
| 22881 | .ty = Air.internedToRef(res_ty.toIntern()), |
| 22938 | 22882 | .payload = try block.sema.addExtra(Air.Shuffle{ |
| 22939 | 22883 | .a = a, |
| 22940 | 22884 | .b = b, |
| ... | ... | @@ -22984,13 +22928,13 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C |
| 22984 | 22928 | const maybe_b = try sema.resolveMaybeUndefVal(b); |
| 22985 | 22929 | |
| 22986 | 22930 | const runtime_src = if (maybe_pred) |pred_val| rs: { |
| 22987 | | if (pred_val.isUndef(mod)) return sema.addConstUndef(vec_ty); |
| 22931 | if (pred_val.isUndef(mod)) return mod.undefRef(vec_ty); |
| 22988 | 22932 | |
| 22989 | 22933 | if (maybe_a) |a_val| { |
| 22990 | | if (a_val.isUndef(mod)) return sema.addConstUndef(vec_ty); |
| 22934 | if (a_val.isUndef(mod)) return mod.undefRef(vec_ty); |
| 22991 | 22935 | |
| 22992 | 22936 | if (maybe_b) |b_val| { |
| 22993 | | if (b_val.isUndef(mod)) return sema.addConstUndef(vec_ty); |
| 22937 | if (b_val.isUndef(mod)) return mod.undefRef(vec_ty); |
| 22994 | 22938 | |
| 22995 | 22939 | const elems = try sema.gpa.alloc(InternPool.Index, vec_len); |
| 22996 | 22940 | for (elems, 0..) |*elem, i| { |
| ... | ... | @@ -22999,25 +22943,25 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C |
| 22999 | 22943 | elem.* = try (try (if (should_choose_a) a_val else b_val).elemValue(mod, i)).intern(elem_ty, mod); |
| 23000 | 22944 | } |
| 23001 | 22945 | |
| 23002 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 22946 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 23003 | 22947 | .ty = vec_ty.toIntern(), |
| 23004 | 22948 | .storage = .{ .elems = elems }, |
| 23005 | | } })).toValue()); |
| 22949 | } }))); |
| 23006 | 22950 | } else { |
| 23007 | 22951 | break :rs b_src; |
| 23008 | 22952 | } |
| 23009 | 22953 | } else { |
| 23010 | 22954 | if (maybe_b) |b_val| { |
| 23011 | | if (b_val.isUndef(mod)) return sema.addConstUndef(vec_ty); |
| 22955 | if (b_val.isUndef(mod)) return mod.undefRef(vec_ty); |
| 23012 | 22956 | } |
| 23013 | 22957 | break :rs a_src; |
| 23014 | 22958 | } |
| 23015 | 22959 | } else rs: { |
| 23016 | 22960 | if (maybe_a) |a_val| { |
| 23017 | | if (a_val.isUndef(mod)) return sema.addConstUndef(vec_ty); |
| 22961 | if (a_val.isUndef(mod)) return mod.undefRef(vec_ty); |
| 23018 | 22962 | } |
| 23019 | 22963 | if (maybe_b) |b_val| { |
| 23020 | | if (b_val.isUndef(mod)) return sema.addConstUndef(vec_ty); |
| 22964 | if (b_val.isUndef(mod)) return mod.undefRef(vec_ty); |
| 23021 | 22965 | } |
| 23022 | 22966 | break :rs pred_src; |
| 23023 | 22967 | }; |
| ... | ... | @@ -23061,12 +23005,12 @@ fn zirAtomicLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 23061 | 23005 | } |
| 23062 | 23006 | |
| 23063 | 23007 | if (try sema.typeHasOnePossibleValue(elem_ty)) |val| { |
| 23064 | | return sema.addConstant(val); |
| 23008 | return Air.internedToRef(val.toIntern()); |
| 23065 | 23009 | } |
| 23066 | 23010 | |
| 23067 | 23011 | if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { |
| 23068 | 23012 | if (try sema.pointerDeref(block, ptr_src, ptr_val, sema.typeOf(ptr))) |elem_val| { |
| 23069 | | return sema.addConstant(elem_val); |
| 23013 | return Air.internedToRef(elem_val.toIntern()); |
| 23070 | 23014 | } |
| 23071 | 23015 | } |
| 23072 | 23016 | |
| ... | ... | @@ -23119,7 +23063,7 @@ fn zirAtomicRmw(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 23119 | 23063 | |
| 23120 | 23064 | // special case zero bit types |
| 23121 | 23065 | if (try sema.typeHasOnePossibleValue(elem_ty)) |val| { |
| 23122 | | return sema.addConstant(val); |
| 23066 | return Air.internedToRef(val.toIntern()); |
| 23123 | 23067 | } |
| 23124 | 23068 | |
| 23125 | 23069 | const runtime_src = if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| rs: { |
| ... | ... | @@ -23145,7 +23089,7 @@ fn zirAtomicRmw(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 23145 | 23089 | // zig fmt: on |
| 23146 | 23090 | }; |
| 23147 | 23091 | try sema.storePtrVal(block, src, ptr_val, new_val, elem_ty); |
| 23148 | | return sema.addConstant(stored_val); |
| 23092 | return Air.internedToRef(stored_val.toIntern()); |
| 23149 | 23093 | } else break :rs ptr_src; |
| 23150 | 23094 | } else ptr_src; |
| 23151 | 23095 | |
| ... | ... | @@ -23224,27 +23168,27 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 23224 | 23168 | |
| 23225 | 23169 | const runtime_src = if (maybe_mulend1) |mulend1_val| rs: { |
| 23226 | 23170 | if (maybe_mulend2) |mulend2_val| { |
| 23227 | | if (mulend2_val.isUndef(mod)) return sema.addConstUndef(ty); |
| 23171 | if (mulend2_val.isUndef(mod)) return mod.undefRef(ty); |
| 23228 | 23172 | |
| 23229 | 23173 | if (maybe_addend) |addend_val| { |
| 23230 | | if (addend_val.isUndef(mod)) return sema.addConstUndef(ty); |
| 23174 | if (addend_val.isUndef(mod)) return mod.undefRef(ty); |
| 23231 | 23175 | const result_val = try Value.mulAdd(ty, mulend1_val, mulend2_val, addend_val, sema.arena, sema.mod); |
| 23232 | | return sema.addConstant(result_val); |
| 23176 | return Air.internedToRef(result_val.toIntern()); |
| 23233 | 23177 | } else { |
| 23234 | 23178 | break :rs addend_src; |
| 23235 | 23179 | } |
| 23236 | 23180 | } else { |
| 23237 | 23181 | if (maybe_addend) |addend_val| { |
| 23238 | | if (addend_val.isUndef(mod)) return sema.addConstUndef(ty); |
| 23182 | if (addend_val.isUndef(mod)) return mod.undefRef(ty); |
| 23239 | 23183 | } |
| 23240 | 23184 | break :rs mulend2_src; |
| 23241 | 23185 | } |
| 23242 | 23186 | } else rs: { |
| 23243 | 23187 | if (maybe_mulend2) |mulend2_val| { |
| 23244 | | if (mulend2_val.isUndef(mod)) return sema.addConstUndef(ty); |
| 23188 | if (mulend2_val.isUndef(mod)) return mod.undefRef(ty); |
| 23245 | 23189 | } |
| 23246 | 23190 | if (maybe_addend) |addend_val| { |
| 23247 | | if (addend_val.isUndef(mod)) return sema.addConstUndef(ty); |
| 23191 | if (addend_val.isUndef(mod)) return mod.undefRef(ty); |
| 23248 | 23192 | } |
| 23249 | 23193 | break :rs mulend1_src; |
| 23250 | 23194 | }; |
| ... | ... | @@ -23453,7 +23397,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 23453 | 23397 | }; |
| 23454 | 23398 | return sema.failWithOwnedErrorMsg(msg); |
| 23455 | 23399 | } |
| 23456 | | return sema.addConstant(field.base.toValue()); |
| 23400 | return Air.internedToRef(field.base); |
| 23457 | 23401 | } |
| 23458 | 23402 | |
| 23459 | 23403 | try sema.requireRuntimeBlock(block, src, ptr_src); |
| ... | ... | @@ -23461,7 +23405,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 23461 | 23405 | return block.addInst(.{ |
| 23462 | 23406 | .tag = .field_parent_ptr, |
| 23463 | 23407 | .data = .{ .ty_pl = .{ |
| 23464 | | .ty = try sema.addType(result_ptr), |
| 23408 | .ty = Air.internedToRef(result_ptr.toIntern()), |
| 23465 | 23409 | .payload = try block.sema.addExtra(Air.FieldParentPtr{ |
| 23466 | 23410 | .field_ptr = casted_field_ptr, |
| 23467 | 23411 | .field_index = @as(u32, @intCast(field_index)), |
| ... | ... | @@ -23611,7 +23555,7 @@ fn analyzeMinMax( |
| 23611 | 23555 | |
| 23612 | 23556 | const vec_len = simd_op.len orelse { |
| 23613 | 23557 | const result_val = opFunc(cur_val, operand_val, mod); |
| 23614 | | cur_minmax = try sema.addConstant(result_val); |
| 23558 | cur_minmax = Air.internedToRef(result_val.toIntern()); |
| 23615 | 23559 | continue; |
| 23616 | 23560 | }; |
| 23617 | 23561 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| ... | ... | @@ -23621,10 +23565,10 @@ fn analyzeMinMax( |
| 23621 | 23565 | const uncoerced_elem = opFunc(lhs_elem_val, rhs_elem_val, mod); |
| 23622 | 23566 | elem.* = (try mod.getCoerced(uncoerced_elem, simd_op.scalar_ty)).toIntern(); |
| 23623 | 23567 | } |
| 23624 | | cur_minmax = try sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 23568 | cur_minmax = Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 23625 | 23569 | .ty = simd_op.result_ty.toIntern(), |
| 23626 | 23570 | .storage = .{ .elems = elems }, |
| 23627 | | } })).toValue()); |
| 23571 | } }))); |
| 23628 | 23572 | } |
| 23629 | 23573 | |
| 23630 | 23574 | const opt_runtime_idx = runtime_known.findFirstSet(); |
| ... | ... | @@ -23699,7 +23643,7 @@ fn analyzeMinMax( |
| 23699 | 23643 | const rhs_src = operand_srcs[idx]; |
| 23700 | 23644 | const simd_op = try sema.checkSimdBinOp(block, src, lhs, rhs, lhs_src, rhs_src); |
| 23701 | 23645 | if (known_undef) { |
| 23702 | | cur_minmax = try sema.addConstUndef(simd_op.result_ty); |
| 23646 | cur_minmax = try mod.undefRef(simd_op.result_ty); |
| 23703 | 23647 | } else { |
| 23704 | 23648 | cur_minmax = try block.addBinOp(air_tag, simd_op.lhs, simd_op.rhs); |
| 23705 | 23649 | } |
| ... | ... | @@ -23855,7 +23799,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 23855 | 23799 | const len_u64 = (try len_val.?.getUnsignedIntAdvanced(mod, sema)).?; |
| 23856 | 23800 | const len = try sema.usizeCast(block, dest_src, len_u64); |
| 23857 | 23801 | for (0..len) |i| { |
| 23858 | | const elem_index = try sema.addIntUnsigned(Type.usize, i); |
| 23802 | const elem_index = try mod.intRef(Type.usize, i); |
| 23859 | 23803 | const dest_elem_ptr = try sema.elemPtrOneLayerOnly( |
| 23860 | 23804 | block, |
| 23861 | 23805 | src, |
| ... | ... | @@ -23942,7 +23886,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 23942 | 23886 | // Aliasing safety check. |
| 23943 | 23887 | if (block.wantSafety()) { |
| 23944 | 23888 | const len = if (len_val) |v| |
| 23945 | | try sema.addConstant(v) |
| 23889 | Air.internedToRef(v.toIntern()) |
| 23946 | 23890 | else if (dest_len != .none) |
| 23947 | 23891 | dest_len |
| 23948 | 23892 | else |
| ... | ... | @@ -24025,7 +23969,7 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 24025 | 23969 | if (!ptr_val.isComptimeMutablePtr(mod)) break :rs dest_src; |
| 24026 | 23970 | if (try sema.resolveMaybeUndefVal(uncoerced_elem)) |_| { |
| 24027 | 23971 | for (0..len) |i| { |
| 24028 | | const elem_index = try sema.addIntUnsigned(Type.usize, i); |
| 23972 | const elem_index = try mod.intRef(Type.usize, i); |
| 24029 | 23973 | const elem_ptr = try sema.elemPtrOneLayerOnly( |
| 24030 | 23974 | block, |
| 24031 | 23975 | src, |
| ... | ... | @@ -24142,7 +24086,7 @@ fn zirVarExtended( |
| 24142 | 24086 | |
| 24143 | 24087 | try sema.validateVarType(block, ty_src, var_ty, small.is_extern); |
| 24144 | 24088 | |
| 24145 | | return sema.addConstant((try mod.intern(.{ .variable = .{ |
| 24089 | return Air.internedToRef((try mod.intern(.{ .variable = .{ |
| 24146 | 24090 | .ty = var_ty.toIntern(), |
| 24147 | 24091 | .init = init_val, |
| 24148 | 24092 | .decl = sema.owner_decl_index, |
| ... | ... | @@ -24152,7 +24096,7 @@ fn zirVarExtended( |
| 24152 | 24096 | )).toOptional() else .none, |
| 24153 | 24097 | .is_extern = small.is_extern, |
| 24154 | 24098 | .is_threadlocal = small.is_threadlocal, |
| 24155 | | } })).toValue()); |
| 24099 | } }))); |
| 24156 | 24100 | } |
| 24157 | 24101 | |
| 24158 | 24102 | fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | ... | @@ -24650,14 +24594,14 @@ fn zirBuiltinExtern( |
| 24650 | 24594 | try mod.declareDeclDependency(sema.owner_decl_index, new_decl_index); |
| 24651 | 24595 | try sema.ensureDeclAnalyzed(new_decl_index); |
| 24652 | 24596 | |
| 24653 | | return sema.addConstant(try mod.getCoerced((try mod.intern(.{ .ptr = .{ |
| 24597 | return Air.internedToRef((try mod.getCoerced((try mod.intern(.{ .ptr = .{ |
| 24654 | 24598 | .ty = switch (mod.intern_pool.indexToKey(ty.toIntern())) { |
| 24655 | 24599 | .ptr_type => ty.toIntern(), |
| 24656 | 24600 | .opt_type => |child_type| child_type, |
| 24657 | 24601 | else => unreachable, |
| 24658 | 24602 | }, |
| 24659 | 24603 | .addr = .{ .decl = new_decl_index }, |
| 24660 | | } })).toValue(), ty)); |
| 24604 | } })).toValue(), ty)).toIntern()); |
| 24661 | 24605 | } |
| 24662 | 24606 | |
| 24663 | 24607 | fn zirWorkItem( |
| ... | ... | @@ -25259,13 +25203,13 @@ fn panicWithMsg(sema: *Sema, block: *Block, src: LazySrcLoc, msg_inst: Air.Inst. |
| 25259 | 25203 | |
| 25260 | 25204 | const panic_func = mod.funcInfo(mod.panic_func_index); |
| 25261 | 25205 | const panic_fn = try sema.analyzeDeclVal(block, .unneeded, panic_func.owner_decl); |
| 25262 | | const null_stack_trace = try sema.addConstant(mod.null_stack_trace.toValue()); |
| 25206 | const null_stack_trace = Air.internedToRef(mod.null_stack_trace); |
| 25263 | 25207 | |
| 25264 | 25208 | const opt_usize_ty = try mod.optionalType(.usize_type); |
| 25265 | | const null_ret_addr = try sema.addConstant((try mod.intern(.{ .opt = .{ |
| 25209 | const null_ret_addr = Air.internedToRef((try mod.intern(.{ .opt = .{ |
| 25266 | 25210 | .ty = opt_usize_ty.toIntern(), |
| 25267 | 25211 | .val = .none, |
| 25268 | | } })).toValue()); |
| 25212 | } }))); |
| 25269 | 25213 | try sema.callBuiltin(block, src, panic_fn, .auto, &.{ msg_inst, null_stack_trace, null_ret_addr }, operation); |
| 25270 | 25214 | } |
| 25271 | 25215 | |
| ... | ... | @@ -25354,7 +25298,7 @@ fn panicSentinelMismatch( |
| 25354 | 25298 | assert(!parent_block.is_comptime); |
| 25355 | 25299 | const mod = sema.mod; |
| 25356 | 25300 | const expected_sentinel_val = maybe_sentinel orelse return; |
| 25357 | | const expected_sentinel = try sema.addConstant(expected_sentinel_val); |
| 25301 | const expected_sentinel = Air.internedToRef(expected_sentinel_val.toIntern()); |
| 25358 | 25302 | |
| 25359 | 25303 | const ptr_ty = sema.typeOf(ptr); |
| 25360 | 25304 | const actual_sentinel = if (ptr_ty.isSlice(mod)) |
| ... | ... | @@ -25478,9 +25422,7 @@ fn fieldVal( |
| 25478 | 25422 | switch (inner_ty.zigTypeTag(mod)) { |
| 25479 | 25423 | .Array => { |
| 25480 | 25424 | if (ip.stringEqlSlice(field_name, "len")) { |
| 25481 | | return sema.addConstant( |
| 25482 | | try mod.intValue(Type.usize, inner_ty.arrayLen(mod)), |
| 25483 | | ); |
| 25425 | return Air.internedToRef((try mod.intValue(Type.usize, inner_ty.arrayLen(mod))).toIntern()); |
| 25484 | 25426 | } else if (ip.stringEqlSlice(field_name, "ptr") and is_pointer_to) { |
| 25485 | 25427 | const ptr_info = object_ty.ptrInfo(mod); |
| 25486 | 25428 | const result_ty = try mod.ptrType(.{ |
| ... | ... | @@ -25570,10 +25512,10 @@ fn fieldVal( |
| 25570 | 25512 | child_type |
| 25571 | 25513 | else |
| 25572 | 25514 | try mod.singleErrorSetType(field_name); |
| 25573 | | return sema.addConstant((try mod.intern(.{ .err = .{ |
| 25515 | return Air.internedToRef((try mod.intern(.{ .err = .{ |
| 25574 | 25516 | .ty = error_set_type.toIntern(), |
| 25575 | 25517 | .name = field_name, |
| 25576 | | } })).toValue()); |
| 25518 | } }))); |
| 25577 | 25519 | }, |
| 25578 | 25520 | .Union => { |
| 25579 | 25521 | if (child_type.getNamespaceIndex(mod).unwrap()) |namespace| { |
| ... | ... | @@ -25585,9 +25527,7 @@ fn fieldVal( |
| 25585 | 25527 | if (union_ty.unionTagType(mod)) |enum_ty| { |
| 25586 | 25528 | if (enum_ty.enumFieldIndex(field_name, mod)) |field_index_usize| { |
| 25587 | 25529 | const field_index = @as(u32, @intCast(field_index_usize)); |
| 25588 | | return sema.addConstant( |
| 25589 | | try mod.enumValueFieldIndex(enum_ty, field_index), |
| 25590 | | ); |
| 25530 | return Air.internedToRef((try mod.enumValueFieldIndex(enum_ty, field_index)).toIntern()); |
| 25591 | 25531 | } |
| 25592 | 25532 | } |
| 25593 | 25533 | return sema.failWithBadMemberAccess(block, union_ty, field_name_src, field_name); |
| ... | ... | @@ -25602,7 +25542,7 @@ fn fieldVal( |
| 25602 | 25542 | return sema.failWithBadMemberAccess(block, child_type, field_name_src, field_name); |
| 25603 | 25543 | const field_index = @as(u32, @intCast(field_index_usize)); |
| 25604 | 25544 | const enum_val = try mod.enumValueFieldIndex(child_type, field_index); |
| 25605 | | return sema.addConstant(enum_val); |
| 25545 | return Air.internedToRef(enum_val.toIntern()); |
| 25606 | 25546 | }, |
| 25607 | 25547 | .Struct, .Opaque => { |
| 25608 | 25548 | if (child_type.getNamespaceIndex(mod).unwrap()) |namespace| { |
| ... | ... | @@ -25714,13 +25654,13 @@ fn fieldPtr( |
| 25714 | 25654 | }); |
| 25715 | 25655 | |
| 25716 | 25656 | if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| { |
| 25717 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 25657 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 25718 | 25658 | .ty = result_ty.toIntern(), |
| 25719 | 25659 | .addr = .{ .field = .{ |
| 25720 | 25660 | .base = val.toIntern(), |
| 25721 | 25661 | .index = Value.slice_ptr_index, |
| 25722 | 25662 | } }, |
| 25723 | | } })).toValue()); |
| 25663 | } }))); |
| 25724 | 25664 | } |
| 25725 | 25665 | try sema.requireRuntimeBlock(block, src, null); |
| 25726 | 25666 | |
| ... | ... | @@ -25736,13 +25676,13 @@ fn fieldPtr( |
| 25736 | 25676 | }); |
| 25737 | 25677 | |
| 25738 | 25678 | if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| { |
| 25739 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 25679 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 25740 | 25680 | .ty = result_ty.toIntern(), |
| 25741 | 25681 | .addr = .{ .field = .{ |
| 25742 | 25682 | .base = val.toIntern(), |
| 25743 | 25683 | .index = Value.slice_len_index, |
| 25744 | 25684 | } }, |
| 25745 | | } })).toValue()); |
| 25685 | } }))); |
| 25746 | 25686 | } |
| 25747 | 25687 | try sema.requireRuntimeBlock(block, src, null); |
| 25748 | 25688 | |
| ... | ... | @@ -25924,7 +25864,7 @@ fn fieldCallBind( |
| 25924 | 25864 | return sema.finishFieldCallBind(block, src, ptr_ty, field.ty, field_index, object_ptr); |
| 25925 | 25865 | } else if (struct_ty.isTuple(mod)) { |
| 25926 | 25866 | if (ip.stringEqlSlice(field_name, "len")) { |
| 25927 | | return .{ .direct = try sema.addIntUnsigned(Type.usize, struct_ty.structFieldCount(mod)) }; |
| 25867 | return .{ .direct = try mod.intRef(Type.usize, struct_ty.structFieldCount(mod)) }; |
| 25928 | 25868 | } |
| 25929 | 25869 | if (field_name.toUnsigned(ip)) |field_index| { |
| 25930 | 25870 | if (field_index >= struct_ty.structFieldCount(mod)) break :find_field; |
| ... | ... | @@ -26064,18 +26004,18 @@ fn finishFieldCallBind( |
| 26064 | 26004 | const container_ty = ptr_ty.childType(mod); |
| 26065 | 26005 | if (container_ty.zigTypeTag(mod) == .Struct) { |
| 26066 | 26006 | if (try container_ty.structFieldValueComptime(mod, field_index)) |default_val| { |
| 26067 | | return .{ .direct = try sema.addConstant(default_val) }; |
| 26007 | return .{ .direct = Air.internedToRef(default_val.toIntern()) }; |
| 26068 | 26008 | } |
| 26069 | 26009 | } |
| 26070 | 26010 | |
| 26071 | 26011 | if (try sema.resolveDefinedValue(block, src, object_ptr)) |struct_ptr_val| { |
| 26072 | | const pointer = try sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 26012 | const pointer = Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 26073 | 26013 | .ty = ptr_field_ty.toIntern(), |
| 26074 | 26014 | .addr = .{ .field = .{ |
| 26075 | 26015 | .base = struct_ptr_val.toIntern(), |
| 26076 | 26016 | .index = field_index, |
| 26077 | 26017 | } }, |
| 26078 | | } })).toValue()); |
| 26018 | } }))); |
| 26079 | 26019 | return .{ .direct = try sema.analyzeLoad(block, src, pointer, src) }; |
| 26080 | 26020 | } |
| 26081 | 26021 | |
| ... | ... | @@ -26152,7 +26092,7 @@ fn structFieldPtr( |
| 26152 | 26092 | |
| 26153 | 26093 | if (struct_ty.isTuple(mod)) { |
| 26154 | 26094 | if (mod.intern_pool.stringEqlSlice(field_name, "len")) { |
| 26155 | | const len_inst = try sema.addIntUnsigned(Type.usize, struct_ty.structFieldCount(mod)); |
| 26095 | const len_inst = try mod.intRef(Type.usize, struct_ty.structFieldCount(mod)); |
| 26156 | 26096 | return sema.analyzeRef(block, src, len_inst); |
| 26157 | 26097 | } |
| 26158 | 26098 | const field_index = try sema.tupleFieldIndex(block, struct_ty, field_name, field_name_src); |
| ... | ... | @@ -26269,7 +26209,7 @@ fn structFieldPtrByIndex( |
| 26269 | 26209 | .ty = ptr_field_ty.toIntern(), |
| 26270 | 26210 | .addr = .{ .comptime_field = field.default_val }, |
| 26271 | 26211 | } }); |
| 26272 | | return sema.addConstant(val.toValue()); |
| 26212 | return Air.internedToRef(val); |
| 26273 | 26213 | } |
| 26274 | 26214 | |
| 26275 | 26215 | if (try sema.resolveDefinedValue(block, src, struct_ptr)) |struct_ptr_val| { |
| ... | ... | @@ -26280,7 +26220,7 @@ fn structFieldPtrByIndex( |
| 26280 | 26220 | .index = field_index, |
| 26281 | 26221 | } }, |
| 26282 | 26222 | } }); |
| 26283 | | return sema.addConstant(val.toValue()); |
| 26223 | return Air.internedToRef(val); |
| 26284 | 26224 | } |
| 26285 | 26225 | |
| 26286 | 26226 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -26311,15 +26251,15 @@ fn structFieldVal( |
| 26311 | 26251 | const field = struct_obj.fields.values()[field_index]; |
| 26312 | 26252 | |
| 26313 | 26253 | if (field.is_comptime) { |
| 26314 | | return sema.addConstant(field.default_val.toValue()); |
| 26254 | return Air.internedToRef(field.default_val); |
| 26315 | 26255 | } |
| 26316 | 26256 | |
| 26317 | 26257 | if (try sema.resolveMaybeUndefVal(struct_byval)) |struct_val| { |
| 26318 | | if (struct_val.isUndef(mod)) return sema.addConstUndef(field.ty); |
| 26258 | if (struct_val.isUndef(mod)) return mod.undefRef(field.ty); |
| 26319 | 26259 | if ((try sema.typeHasOnePossibleValue(field.ty))) |opv| { |
| 26320 | | return sema.addConstant(opv); |
| 26260 | return Air.internedToRef(opv.toIntern()); |
| 26321 | 26261 | } |
| 26322 | | return sema.addConstant(try struct_val.fieldValue(mod, field_index)); |
| 26262 | return Air.internedToRef((try struct_val.fieldValue(mod, field_index)).toIntern()); |
| 26323 | 26263 | } |
| 26324 | 26264 | |
| 26325 | 26265 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -26348,7 +26288,7 @@ fn tupleFieldVal( |
| 26348 | 26288 | ) CompileError!Air.Inst.Ref { |
| 26349 | 26289 | const mod = sema.mod; |
| 26350 | 26290 | if (mod.intern_pool.stringEqlSlice(field_name, "len")) { |
| 26351 | | return sema.addIntUnsigned(Type.usize, tuple_ty.structFieldCount(mod)); |
| 26291 | return mod.intRef(Type.usize, tuple_ty.structFieldCount(mod)); |
| 26352 | 26292 | } |
| 26353 | 26293 | const field_index = try sema.tupleFieldIndex(block, tuple_ty, field_name, field_name_src); |
| 26354 | 26294 | return sema.tupleFieldValByIndex(block, src, tuple_byval, field_index, tuple_ty); |
| ... | ... | @@ -26388,26 +26328,26 @@ fn tupleFieldValByIndex( |
| 26388 | 26328 | const field_ty = tuple_ty.structFieldType(field_index, mod); |
| 26389 | 26329 | |
| 26390 | 26330 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| { |
| 26391 | | return sema.addConstant(default_value); |
| 26331 | return Air.internedToRef(default_value.toIntern()); |
| 26392 | 26332 | } |
| 26393 | 26333 | |
| 26394 | 26334 | if (try sema.resolveMaybeUndefVal(tuple_byval)) |tuple_val| { |
| 26395 | 26335 | if ((try sema.typeHasOnePossibleValue(field_ty))) |opv| { |
| 26396 | | return sema.addConstant(opv); |
| 26336 | return Air.internedToRef(opv.toIntern()); |
| 26397 | 26337 | } |
| 26398 | 26338 | return switch (mod.intern_pool.indexToKey(tuple_val.toIntern())) { |
| 26399 | | .undef => sema.addConstUndef(field_ty), |
| 26400 | | .aggregate => |aggregate| sema.addConstant(switch (aggregate.storage) { |
| 26339 | .undef => mod.undefRef(field_ty), |
| 26340 | .aggregate => |aggregate| Air.internedToRef(switch (aggregate.storage) { |
| 26401 | 26341 | .bytes => |bytes| try mod.intValue(Type.u8, bytes[0]), |
| 26402 | 26342 | .elems => |elems| elems[field_index].toValue(), |
| 26403 | 26343 | .repeated_elem => |elem| elem.toValue(), |
| 26404 | | }), |
| 26344 | }.toIntern()), |
| 26405 | 26345 | else => unreachable, |
| 26406 | 26346 | }; |
| 26407 | 26347 | } |
| 26408 | 26348 | |
| 26409 | 26349 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| { |
| 26410 | | return sema.addConstant(default_val); |
| 26350 | return Air.internedToRef(default_val.toIntern()); |
| 26411 | 26351 | } |
| 26412 | 26352 | |
| 26413 | 26353 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -26493,13 +26433,13 @@ fn unionFieldPtr( |
| 26493 | 26433 | }, |
| 26494 | 26434 | .Packed, .Extern => {}, |
| 26495 | 26435 | } |
| 26496 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 26436 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 26497 | 26437 | .ty = ptr_field_ty.toIntern(), |
| 26498 | 26438 | .addr = .{ .field = .{ |
| 26499 | 26439 | .base = union_ptr_val.toIntern(), |
| 26500 | 26440 | .index = field_index, |
| 26501 | 26441 | } }, |
| 26502 | | } })).toValue()); |
| 26442 | } }))); |
| 26503 | 26443 | } |
| 26504 | 26444 | |
| 26505 | 26445 | try sema.requireRuntimeBlock(block, src, null); |
| ... | ... | @@ -26507,7 +26447,7 @@ fn unionFieldPtr( |
| 26507 | 26447 | union_ty.unionTagTypeSafety(mod) != null and union_obj.fields.count() > 1) |
| 26508 | 26448 | { |
| 26509 | 26449 | const wanted_tag_val = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); |
| 26510 | | const wanted_tag = try sema.addConstant(wanted_tag_val); |
| 26450 | const wanted_tag = Air.internedToRef(wanted_tag_val.toIntern()); |
| 26511 | 26451 | // TODO would it be better if get_union_tag supported pointers to unions? |
| 26512 | 26452 | const union_val = try block.addTyOp(.load, union_ty, union_ptr); |
| 26513 | 26453 | const active_tag = try block.addTyOp(.get_union_tag, union_obj.tag_ty, union_val); |
| ... | ... | @@ -26540,7 +26480,7 @@ fn unionFieldVal( |
| 26540 | 26480 | const enum_field_index = @as(u32, @intCast(union_obj.tag_ty.enumFieldIndex(field_name, mod).?)); |
| 26541 | 26481 | |
| 26542 | 26482 | if (try sema.resolveMaybeUndefVal(union_byval)) |union_val| { |
| 26543 | | if (union_val.isUndef(mod)) return sema.addConstUndef(field.ty); |
| 26483 | if (union_val.isUndef(mod)) return mod.undefRef(field.ty); |
| 26544 | 26484 | |
| 26545 | 26485 | const un = ip.indexToKey(union_val.toIntern()).un; |
| 26546 | 26486 | const field_tag = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); |
| ... | ... | @@ -26548,7 +26488,7 @@ fn unionFieldVal( |
| 26548 | 26488 | switch (union_obj.layout) { |
| 26549 | 26489 | .Auto => { |
| 26550 | 26490 | if (tag_matches) { |
| 26551 | | return sema.addConstant(un.val.toValue()); |
| 26491 | return Air.internedToRef(un.val); |
| 26552 | 26492 | } else { |
| 26553 | 26493 | const msg = msg: { |
| 26554 | 26494 | const active_index = union_obj.tag_ty.enumTagFieldIndex(un.tag.toValue(), mod).?; |
| ... | ... | @@ -26565,11 +26505,11 @@ fn unionFieldVal( |
| 26565 | 26505 | }, |
| 26566 | 26506 | .Packed, .Extern => { |
| 26567 | 26507 | if (tag_matches) { |
| 26568 | | return sema.addConstant(un.val.toValue()); |
| 26508 | return Air.internedToRef(un.val); |
| 26569 | 26509 | } else { |
| 26570 | 26510 | const old_ty = union_ty.unionFieldType(un.tag.toValue(), mod); |
| 26571 | 26511 | if (try sema.bitCastVal(block, src, un.val.toValue(), old_ty, field.ty, 0)) |new_val| { |
| 26572 | | return sema.addConstant(new_val); |
| 26512 | return Air.internedToRef(new_val.toIntern()); |
| 26573 | 26513 | } |
| 26574 | 26514 | } |
| 26575 | 26515 | }, |
| ... | ... | @@ -26581,7 +26521,7 @@ fn unionFieldVal( |
| 26581 | 26521 | union_ty.unionTagTypeSafety(mod) != null and union_obj.fields.count() > 1) |
| 26582 | 26522 | { |
| 26583 | 26523 | const wanted_tag_val = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); |
| 26584 | | const wanted_tag = try sema.addConstant(wanted_tag_val); |
| 26524 | const wanted_tag = Air.internedToRef(wanted_tag_val.toIntern()); |
| 26585 | 26525 | const active_tag = try block.addTyOp(.get_union_tag, union_obj.tag_ty, union_byval); |
| 26586 | 26526 | try sema.panicInactiveUnionField(block, src, active_tag, wanted_tag); |
| 26587 | 26527 | } |
| ... | ... | @@ -26655,7 +26595,7 @@ fn elemPtrOneLayerOnly( |
| 26655 | 26595 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); |
| 26656 | 26596 | const result_ty = try sema.elemPtrType(indexable_ty, index); |
| 26657 | 26597 | const elem_ptr = try ptr_val.elemPtr(result_ty, index, mod); |
| 26658 | | return sema.addConstant(elem_ptr); |
| 26598 | return Air.internedToRef(elem_ptr.toIntern()); |
| 26659 | 26599 | }; |
| 26660 | 26600 | const result_ty = try sema.elemPtrType(indexable_ty, null); |
| 26661 | 26601 | |
| ... | ... | @@ -26716,7 +26656,7 @@ fn elemVal( |
| 26716 | 26656 | const elem_ptr_ty = try mod.singleConstPtrType(elem_ty); |
| 26717 | 26657 | const elem_ptr_val = try many_ptr_val.elemPtr(elem_ptr_ty, index, mod); |
| 26718 | 26658 | if (try sema.pointerDeref(block, indexable_src, elem_ptr_val, elem_ptr_ty)) |elem_val| { |
| 26719 | | return sema.addConstant(try mod.getCoerced(elem_val, elem_ty)); |
| 26659 | return Air.internedToRef((try mod.getCoerced(elem_val, elem_ty)).toIntern()); |
| 26720 | 26660 | } |
| 26721 | 26661 | break :rs indexable_src; |
| 26722 | 26662 | }; |
| ... | ... | @@ -26732,7 +26672,7 @@ fn elemVal( |
| 26732 | 26672 | const index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index) orelse break :arr_sent; |
| 26733 | 26673 | const index = try sema.usizeCast(block, src, index_val.toUnsignedInt(mod)); |
| 26734 | 26674 | if (index != inner_ty.arrayLen(mod)) break :arr_sent; |
| 26735 | | return sema.addConstant(sentinel); |
| 26675 | return Air.internedToRef(sentinel.toIntern()); |
| 26736 | 26676 | } |
| 26737 | 26677 | const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety); |
| 26738 | 26678 | return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src); |
| ... | ... | @@ -26817,20 +26757,20 @@ fn tupleFieldPtr( |
| 26817 | 26757 | }); |
| 26818 | 26758 | |
| 26819 | 26759 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| { |
| 26820 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 26760 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 26821 | 26761 | .ty = ptr_field_ty.toIntern(), |
| 26822 | 26762 | .addr = .{ .comptime_field = default_val.toIntern() }, |
| 26823 | | } })).toValue()); |
| 26763 | } }))); |
| 26824 | 26764 | } |
| 26825 | 26765 | |
| 26826 | 26766 | if (try sema.resolveMaybeUndefVal(tuple_ptr)) |tuple_ptr_val| { |
| 26827 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 26767 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 26828 | 26768 | .ty = ptr_field_ty.toIntern(), |
| 26829 | 26769 | .addr = .{ .field = .{ |
| 26830 | 26770 | .base = tuple_ptr_val.toIntern(), |
| 26831 | 26771 | .index = field_index, |
| 26832 | 26772 | } }, |
| 26833 | | } })).toValue()); |
| 26773 | } }))); |
| 26834 | 26774 | } |
| 26835 | 26775 | |
| 26836 | 26776 | if (!init) { |
| ... | ... | @@ -26866,12 +26806,12 @@ fn tupleField( |
| 26866 | 26806 | const field_ty = tuple_ty.structFieldType(field_index, mod); |
| 26867 | 26807 | |
| 26868 | 26808 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| { |
| 26869 | | return sema.addConstant(default_value); // comptime field |
| 26809 | return Air.internedToRef(default_value.toIntern()); // comptime field |
| 26870 | 26810 | } |
| 26871 | 26811 | |
| 26872 | 26812 | if (try sema.resolveMaybeUndefVal(tuple)) |tuple_val| { |
| 26873 | | if (tuple_val.isUndef(mod)) return sema.addConstUndef(field_ty); |
| 26874 | | return sema.addConstant(try tuple_val.fieldValue(mod, field_index)); |
| 26813 | if (tuple_val.isUndef(mod)) return mod.undefRef(field_ty); |
| 26814 | return Air.internedToRef((try tuple_val.fieldValue(mod, field_index)).toIntern()); |
| 26875 | 26815 | } |
| 26876 | 26816 | |
| 26877 | 26817 | try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_src); |
| ... | ... | @@ -26909,7 +26849,7 @@ fn elemValArray( |
| 26909 | 26849 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); |
| 26910 | 26850 | if (array_sent) |s| { |
| 26911 | 26851 | if (index == array_len) { |
| 26912 | | return sema.addConstant(s); |
| 26852 | return Air.internedToRef(s.toIntern()); |
| 26913 | 26853 | } |
| 26914 | 26854 | } |
| 26915 | 26855 | if (index >= array_len_s) { |
| ... | ... | @@ -26919,12 +26859,12 @@ fn elemValArray( |
| 26919 | 26859 | } |
| 26920 | 26860 | if (maybe_undef_array_val) |array_val| { |
| 26921 | 26861 | if (array_val.isUndef(mod)) { |
| 26922 | | return sema.addConstUndef(elem_ty); |
| 26862 | return mod.undefRef(elem_ty); |
| 26923 | 26863 | } |
| 26924 | 26864 | if (maybe_index_val) |index_val| { |
| 26925 | 26865 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); |
| 26926 | 26866 | const elem_val = try array_val.elemValue(mod, index); |
| 26927 | | return sema.addConstant(elem_val); |
| 26867 | return Air.internedToRef(elem_val.toIntern()); |
| 26928 | 26868 | } |
| 26929 | 26869 | } |
| 26930 | 26870 | |
| ... | ... | @@ -26935,7 +26875,7 @@ fn elemValArray( |
| 26935 | 26875 | if (oob_safety and block.wantSafety()) { |
| 26936 | 26876 | // Runtime check is only needed if unable to comptime check |
| 26937 | 26877 | if (maybe_index_val == null) { |
| 26938 | | const len_inst = try sema.addIntUnsigned(Type.usize, array_len); |
| 26878 | const len_inst = try mod.intRef(Type.usize, array_len); |
| 26939 | 26879 | const cmp_op: Air.Inst.Tag = if (array_sent != null) .cmp_lte else .cmp_lt; |
| 26940 | 26880 | try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op); |
| 26941 | 26881 | } |
| ... | ... | @@ -26980,11 +26920,11 @@ fn elemPtrArray( |
| 26980 | 26920 | |
| 26981 | 26921 | if (maybe_undef_array_ptr_val) |array_ptr_val| { |
| 26982 | 26922 | if (array_ptr_val.isUndef(mod)) { |
| 26983 | | return sema.addConstUndef(elem_ptr_ty); |
| 26923 | return mod.undefRef(elem_ptr_ty); |
| 26984 | 26924 | } |
| 26985 | 26925 | if (offset) |index| { |
| 26986 | 26926 | const elem_ptr = try array_ptr_val.elemPtr(elem_ptr_ty, index, mod); |
| 26987 | | return sema.addConstant(elem_ptr); |
| 26927 | return Air.internedToRef(elem_ptr.toIntern()); |
| 26988 | 26928 | } |
| 26989 | 26929 | } |
| 26990 | 26930 | |
| ... | ... | @@ -26997,7 +26937,7 @@ fn elemPtrArray( |
| 26997 | 26937 | |
| 26998 | 26938 | // Runtime check is only needed if unable to comptime check. |
| 26999 | 26939 | if (oob_safety and block.wantSafety() and offset == null) { |
| 27000 | | const len_inst = try sema.addIntUnsigned(Type.usize, array_len); |
| 26940 | const len_inst = try mod.intRef(Type.usize, array_len); |
| 27001 | 26941 | const cmp_op: Air.Inst.Tag = if (array_sent) .cmp_lte else .cmp_lt; |
| 27002 | 26942 | try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op); |
| 27003 | 26943 | } |
| ... | ... | @@ -27042,7 +26982,7 @@ fn elemValSlice( |
| 27042 | 26982 | const elem_ptr_ty = try sema.elemPtrType(slice_ty, index); |
| 27043 | 26983 | const elem_ptr_val = try slice_val.elemPtr(elem_ptr_ty, index, mod); |
| 27044 | 26984 | if (try sema.pointerDeref(block, slice_src, elem_ptr_val, elem_ptr_ty)) |elem_val| { |
| 27045 | | return sema.addConstant(elem_val); |
| 26985 | return Air.internedToRef(elem_val.toIntern()); |
| 27046 | 26986 | } |
| 27047 | 26987 | runtime_src = slice_src; |
| 27048 | 26988 | } |
| ... | ... | @@ -27053,7 +26993,7 @@ fn elemValSlice( |
| 27053 | 26993 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| 27054 | 26994 | if (oob_safety and block.wantSafety()) { |
| 27055 | 26995 | const len_inst = if (maybe_slice_val) |slice_val| |
| 27056 | | try sema.addIntUnsigned(Type.usize, slice_val.sliceLen(mod)) |
| 26996 | try mod.intRef(Type.usize, slice_val.sliceLen(mod)) |
| 27057 | 26997 | else |
| 27058 | 26998 | try block.addTyOp(.slice_len, Type.usize, slice); |
| 27059 | 26999 | const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt; |
| ... | ... | @@ -27088,7 +27028,7 @@ fn elemPtrSlice( |
| 27088 | 27028 | |
| 27089 | 27029 | if (maybe_undef_slice_val) |slice_val| { |
| 27090 | 27030 | if (slice_val.isUndef(mod)) { |
| 27091 | | return sema.addConstUndef(elem_ptr_ty); |
| 27031 | return mod.undefRef(elem_ptr_ty); |
| 27092 | 27032 | } |
| 27093 | 27033 | const slice_len = slice_val.sliceLen(mod); |
| 27094 | 27034 | const slice_len_s = slice_len + @intFromBool(slice_sent); |
| ... | ... | @@ -27101,7 +27041,7 @@ fn elemPtrSlice( |
| 27101 | 27041 | return sema.fail(block, elem_index_src, "index {d} outside slice of length {d}{s}", .{ index, slice_len, sentinel_label }); |
| 27102 | 27042 | } |
| 27103 | 27043 | const elem_ptr_val = try slice_val.elemPtr(elem_ptr_ty, index, mod); |
| 27104 | | return sema.addConstant(elem_ptr_val); |
| 27044 | return Air.internedToRef(elem_ptr_val.toIntern()); |
| 27105 | 27045 | } |
| 27106 | 27046 | } |
| 27107 | 27047 | |
| ... | ... | @@ -27113,7 +27053,7 @@ fn elemPtrSlice( |
| 27113 | 27053 | const len_inst = len: { |
| 27114 | 27054 | if (maybe_undef_slice_val) |slice_val| |
| 27115 | 27055 | if (!slice_val.isUndef(mod)) |
| 27116 | | break :len try sema.addIntUnsigned(Type.usize, slice_val.sliceLen(mod)); |
| 27056 | break :len try mod.intRef(Type.usize, slice_val.sliceLen(mod)); |
| 27117 | 27057 | break :len try block.addTyOp(.slice_len, Type.usize, slice); |
| 27118 | 27058 | }; |
| 27119 | 27059 | const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt; |
| ... | ... | @@ -27205,15 +27145,15 @@ fn coerceExtra( |
| 27205 | 27145 | .Optional => optional: { |
| 27206 | 27146 | // undefined sets the optional bit also to undefined. |
| 27207 | 27147 | if (is_undef) { |
| 27208 | | return sema.addConstUndef(dest_ty); |
| 27148 | return mod.undefRef(dest_ty); |
| 27209 | 27149 | } |
| 27210 | 27150 | |
| 27211 | 27151 | // null to ?T |
| 27212 | 27152 | if (inst_ty.zigTypeTag(mod) == .Null) { |
| 27213 | | return sema.addConstant((try mod.intern(.{ .opt = .{ |
| 27153 | return Air.internedToRef((try mod.intern(.{ .opt = .{ |
| 27214 | 27154 | .ty = dest_ty.toIntern(), |
| 27215 | 27155 | .val = .none, |
| 27216 | | } })).toValue()); |
| 27156 | } }))); |
| 27217 | 27157 | } |
| 27218 | 27158 | |
| 27219 | 27159 | // cast from ?*T and ?[*]T to ?*anyopaque |
| ... | ... | @@ -27382,7 +27322,7 @@ fn coerceExtra( |
| 27382 | 27322 | // coercion to C pointer |
| 27383 | 27323 | .C => switch (inst_ty.zigTypeTag(mod)) { |
| 27384 | 27324 | .Null => { |
| 27385 | | return sema.addConstant(try mod.getCoerced(Value.null, dest_ty)); |
| 27325 | return Air.internedToRef((try mod.getCoerced(Value.null, dest_ty)).toIntern()); |
| 27386 | 27326 | }, |
| 27387 | 27327 | .ComptimeInt => { |
| 27388 | 27328 | const addr = sema.coerceExtra(block, Type.usize, inst, inst_src, .{ .report_err = false }) catch |err| switch (err) { |
| ... | ... | @@ -27486,14 +27426,14 @@ fn coerceExtra( |
| 27486 | 27426 | if (inst_child_ty.structFieldCount(mod) == 0) { |
| 27487 | 27427 | // Optional slice is represented with a null pointer so |
| 27488 | 27428 | // we use a dummy pointer value with the required alignment. |
| 27489 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 27429 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 27490 | 27430 | .ty = dest_ty.toIntern(), |
| 27491 | 27431 | .addr = .{ .int = (if (dest_info.flags.alignment != .none) |
| 27492 | 27432 | try mod.intValue(Type.usize, dest_info.flags.alignment.toByteUnitsOptional().?) |
| 27493 | 27433 | else |
| 27494 | 27434 | try mod.getCoerced(try dest_info.child.toType().lazyAbiAlignment(mod), Type.usize)).toIntern() }, |
| 27495 | 27435 | .len = (try mod.intValue(Type.usize, 0)).toIntern(), |
| 27496 | | } })).toValue()); |
| 27436 | } }))); |
| 27497 | 27437 | } |
| 27498 | 27438 | |
| 27499 | 27439 | // pointer to tuple to slice |
| ... | ... | @@ -27539,7 +27479,7 @@ fn coerceExtra( |
| 27539 | 27479 | .Int, .ComptimeInt => switch (inst_ty.zigTypeTag(mod)) { |
| 27540 | 27480 | .Float, .ComptimeFloat => float: { |
| 27541 | 27481 | if (is_undef) { |
| 27542 | | return sema.addConstUndef(dest_ty); |
| 27482 | return mod.undefRef(dest_ty); |
| 27543 | 27483 | } |
| 27544 | 27484 | const val = (try sema.resolveMaybeUndefVal(inst)) orelse { |
| 27545 | 27485 | if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { |
| ... | ... | @@ -27558,11 +27498,11 @@ fn coerceExtra( |
| 27558 | 27498 | ); |
| 27559 | 27499 | } |
| 27560 | 27500 | const result_val = try sema.intFromFloat(block, inst_src, val, inst_ty, dest_ty); |
| 27561 | | return try sema.addConstant(result_val); |
| 27501 | return Air.internedToRef(result_val.toIntern()); |
| 27562 | 27502 | }, |
| 27563 | 27503 | .Int, .ComptimeInt => { |
| 27564 | 27504 | if (is_undef) { |
| 27565 | | return sema.addConstUndef(dest_ty); |
| 27505 | return mod.undefRef(dest_ty); |
| 27566 | 27506 | } |
| 27567 | 27507 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 27568 | 27508 | // comptime-known integer to other number |
| ... | ... | @@ -27570,7 +27510,7 @@ fn coerceExtra( |
| 27570 | 27510 | if (!opts.report_err) return error.NotCoercible; |
| 27571 | 27511 | return sema.fail(block, inst_src, "type '{}' cannot represent integer value '{}'", .{ dest_ty.fmt(mod), val.fmtValue(inst_ty, mod) }); |
| 27572 | 27512 | } |
| 27573 | | return try sema.addConstant(try mod.getCoerced(val, dest_ty)); |
| 27513 | return Air.internedToRef((try mod.getCoerced(val, dest_ty)).toIntern()); |
| 27574 | 27514 | } |
| 27575 | 27515 | if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { |
| 27576 | 27516 | if (!opts.report_err) return error.NotCoercible; |
| ... | ... | @@ -27590,7 +27530,7 @@ fn coerceExtra( |
| 27590 | 27530 | } |
| 27591 | 27531 | }, |
| 27592 | 27532 | .Undefined => { |
| 27593 | | return sema.addConstUndef(dest_ty); |
| 27533 | return mod.undefRef(dest_ty); |
| 27594 | 27534 | }, |
| 27595 | 27535 | else => {}, |
| 27596 | 27536 | }, |
| ... | ... | @@ -27598,11 +27538,11 @@ fn coerceExtra( |
| 27598 | 27538 | .ComptimeFloat => { |
| 27599 | 27539 | const val = try sema.resolveConstValue(block, .unneeded, inst, ""); |
| 27600 | 27540 | const result_val = try val.floatCast(dest_ty, mod); |
| 27601 | | return try sema.addConstant(result_val); |
| 27541 | return Air.internedToRef(result_val.toIntern()); |
| 27602 | 27542 | }, |
| 27603 | 27543 | .Float => { |
| 27604 | 27544 | if (is_undef) { |
| 27605 | | return sema.addConstUndef(dest_ty); |
| 27545 | return mod.undefRef(dest_ty); |
| 27606 | 27546 | } |
| 27607 | 27547 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 27608 | 27548 | const result_val = try val.floatCast(dest_ty, mod); |
| ... | ... | @@ -27614,7 +27554,7 @@ fn coerceExtra( |
| 27614 | 27554 | .{ dest_ty.fmt(mod), val.fmtValue(inst_ty, mod) }, |
| 27615 | 27555 | ); |
| 27616 | 27556 | } |
| 27617 | | return try sema.addConstant(result_val); |
| 27557 | return Air.internedToRef(result_val.toIntern()); |
| 27618 | 27558 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { |
| 27619 | 27559 | if (!opts.report_err) return error.NotCoercible; |
| 27620 | 27560 | return sema.failWithNeededComptime(block, inst_src, "value being casted to 'comptime_float' must be comptime-known"); |
| ... | ... | @@ -27630,7 +27570,7 @@ fn coerceExtra( |
| 27630 | 27570 | }, |
| 27631 | 27571 | .Int, .ComptimeInt => int: { |
| 27632 | 27572 | if (is_undef) { |
| 27633 | | return sema.addConstUndef(dest_ty); |
| 27573 | return mod.undefRef(dest_ty); |
| 27634 | 27574 | } |
| 27635 | 27575 | const val = (try sema.resolveMaybeUndefVal(inst)) orelse { |
| 27636 | 27576 | if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { |
| ... | ... | @@ -27650,10 +27590,10 @@ fn coerceExtra( |
| 27650 | 27590 | // .{ dest_ty.fmt(mod), val }, |
| 27651 | 27591 | // ); |
| 27652 | 27592 | //} |
| 27653 | | return try sema.addConstant(result_val); |
| 27593 | return Air.internedToRef(result_val.toIntern()); |
| 27654 | 27594 | }, |
| 27655 | 27595 | .Undefined => { |
| 27656 | | return sema.addConstUndef(dest_ty); |
| 27596 | return mod.undefRef(dest_ty); |
| 27657 | 27597 | }, |
| 27658 | 27598 | else => {}, |
| 27659 | 27599 | }, |
| ... | ... | @@ -27676,9 +27616,7 @@ fn coerceExtra( |
| 27676 | 27616 | }; |
| 27677 | 27617 | return sema.failWithOwnedErrorMsg(msg); |
| 27678 | 27618 | }; |
| 27679 | | return sema.addConstant( |
| 27680 | | try mod.enumValueFieldIndex(dest_ty, @as(u32, @intCast(field_index))), |
| 27681 | | ); |
| 27619 | return Air.internedToRef((try mod.enumValueFieldIndex(dest_ty, @as(u32, @intCast(field_index)))).toIntern()); |
| 27682 | 27620 | }, |
| 27683 | 27621 | .Union => blk: { |
| 27684 | 27622 | // union to its own tag type |
| ... | ... | @@ -27688,7 +27626,7 @@ fn coerceExtra( |
| 27688 | 27626 | } |
| 27689 | 27627 | }, |
| 27690 | 27628 | .Undefined => { |
| 27691 | | return sema.addConstUndef(dest_ty); |
| 27629 | return mod.undefRef(dest_ty); |
| 27692 | 27630 | }, |
| 27693 | 27631 | else => {}, |
| 27694 | 27632 | }, |
| ... | ... | @@ -27696,21 +27634,19 @@ fn coerceExtra( |
| 27696 | 27634 | .ErrorUnion => eu: { |
| 27697 | 27635 | if (maybe_inst_val) |inst_val| { |
| 27698 | 27636 | switch (inst_val.toIntern()) { |
| 27699 | | .undef => return sema.addConstUndef(dest_ty), |
| 27637 | .undef => return mod.undefRef(dest_ty), |
| 27700 | 27638 | else => switch (mod.intern_pool.indexToKey(inst_val.toIntern())) { |
| 27701 | 27639 | .error_union => |error_union| switch (error_union.val) { |
| 27702 | 27640 | .err_name => |err_name| { |
| 27703 | 27641 | const error_set_ty = inst_ty.errorUnionSet(mod); |
| 27704 | | const error_set_val = try sema.addConstant((try mod.intern(.{ .err = .{ |
| 27642 | const error_set_val = Air.internedToRef((try mod.intern(.{ .err = .{ |
| 27705 | 27643 | .ty = error_set_ty.toIntern(), |
| 27706 | 27644 | .name = err_name, |
| 27707 | | } })).toValue()); |
| 27645 | } }))); |
| 27708 | 27646 | return sema.wrapErrorUnionSet(block, dest_ty, error_set_val, inst_src); |
| 27709 | 27647 | }, |
| 27710 | 27648 | .payload => |payload| { |
| 27711 | | const payload_val = try sema.addConstant( |
| 27712 | | payload.toValue(), |
| 27713 | | ); |
| 27649 | const payload_val = Air.internedToRef(payload); |
| 27714 | 27650 | return sema.wrapErrorUnionPayload(block, dest_ty, payload_val, inst_src) catch |err| switch (err) { |
| 27715 | 27651 | error.NotCoercible => break :eu, |
| 27716 | 27652 | else => |e| return e, |
| ... | ... | @@ -27727,7 +27663,7 @@ fn coerceExtra( |
| 27727 | 27663 | return sema.wrapErrorUnionSet(block, dest_ty, inst, inst_src); |
| 27728 | 27664 | }, |
| 27729 | 27665 | .Undefined => { |
| 27730 | | return sema.addConstUndef(dest_ty); |
| 27666 | return mod.undefRef(dest_ty); |
| 27731 | 27667 | }, |
| 27732 | 27668 | else => eu: { |
| 27733 | 27669 | // T to E!T |
| ... | ... | @@ -27745,7 +27681,7 @@ fn coerceExtra( |
| 27745 | 27681 | } |
| 27746 | 27682 | }, |
| 27747 | 27683 | .Undefined => { |
| 27748 | | return sema.addConstUndef(dest_ty); |
| 27684 | return mod.undefRef(dest_ty); |
| 27749 | 27685 | }, |
| 27750 | 27686 | else => {}, |
| 27751 | 27687 | }, |
| ... | ... | @@ -27760,7 +27696,7 @@ fn coerceExtra( |
| 27760 | 27696 | } |
| 27761 | 27697 | }, |
| 27762 | 27698 | .Undefined => { |
| 27763 | | return sema.addConstUndef(dest_ty); |
| 27699 | return mod.undefRef(dest_ty); |
| 27764 | 27700 | }, |
| 27765 | 27701 | else => {}, |
| 27766 | 27702 | }, |
| ... | ... | @@ -27772,7 +27708,7 @@ fn coerceExtra( |
| 27772 | 27708 | } |
| 27773 | 27709 | }, |
| 27774 | 27710 | .Undefined => { |
| 27775 | | return sema.addConstUndef(dest_ty); |
| 27711 | return mod.undefRef(dest_ty); |
| 27776 | 27712 | }, |
| 27777 | 27713 | else => {}, |
| 27778 | 27714 | }, |
| ... | ... | @@ -27794,7 +27730,7 @@ fn coerceExtra( |
| 27794 | 27730 | // special logic has a chance to run first, such as `*[N]T` to `[]T` which |
| 27795 | 27731 | // should initialize the length field of the slice. |
| 27796 | 27732 | if (is_undef) { |
| 27797 | | return sema.addConstUndef(dest_ty); |
| 27733 | return mod.undefRef(dest_ty); |
| 27798 | 27734 | } |
| 27799 | 27735 | |
| 27800 | 27736 | if (!opts.report_err) return error.NotCoercible; |
| ... | ... | @@ -27863,7 +27799,7 @@ fn coerceInMemory( |
| 27863 | 27799 | val: Value, |
| 27864 | 27800 | dst_ty: Type, |
| 27865 | 27801 | ) CompileError!Air.Inst.Ref { |
| 27866 | | return sema.addConstant(try sema.mod.getCoerced(val, dst_ty)); |
| 27802 | return Air.internedToRef((try sema.mod.getCoerced(val, dst_ty)).toIntern()); |
| 27867 | 27803 | } |
| 27868 | 27804 | |
| 27869 | 27805 | const InMemoryCoercionResult = union(enum) { |
| ... | ... | @@ -28880,7 +28816,7 @@ fn storePtr2( |
| 28880 | 28816 | while (i < field_count) : (i += 1) { |
| 28881 | 28817 | const elem_src = operand_src; // TODO better source location |
| 28882 | 28818 | const elem = try sema.tupleField(block, operand_src, uncasted_operand, elem_src, i); |
| 28883 | | const elem_index = try sema.addIntUnsigned(Type.usize, i); |
| 28819 | const elem_index = try mod.intRef(Type.usize, i); |
| 28884 | 28820 | const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src, false, true); |
| 28885 | 28821 | try sema.storePtr2(block, src, elem_ptr, elem_src, elem, elem_src, .store); |
| 28886 | 28822 | } |
| ... | ... | @@ -29920,7 +29856,7 @@ fn bitCast( |
| 29920 | 29856 | |
| 29921 | 29857 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 29922 | 29858 | if (try sema.bitCastVal(block, inst_src, val, old_ty, dest_ty, 0)) |result_val| { |
| 29923 | | return sema.addConstant(result_val); |
| 29859 | return Air.internedToRef(result_val.toIntern()); |
| 29924 | 29860 | } |
| 29925 | 29861 | } |
| 29926 | 29862 | try sema.requireRuntimeBlock(block, inst_src, operand_src); |
| ... | ... | @@ -29973,7 +29909,7 @@ fn coerceArrayPtrToSlice( |
| 29973 | 29909 | }, |
| 29974 | 29910 | .len = (try mod.intValue(Type.usize, array_ty.arrayLen(mod))).toIntern(), |
| 29975 | 29911 | } }); |
| 29976 | | return sema.addConstant(slice_val.toValue()); |
| 29912 | return Air.internedToRef(slice_val); |
| 29977 | 29913 | } |
| 29978 | 29914 | try sema.requireRuntimeBlock(block, inst_src, null); |
| 29979 | 29915 | return block.addTyOp(.array_to_slice, dest_ty, inst); |
| ... | ... | @@ -30040,8 +29976,8 @@ fn coerceCompatiblePtrs( |
| 30040 | 29976 | return sema.fail(block, inst_src, "null pointer casted to type '{}'", .{dest_ty.fmt(sema.mod)}); |
| 30041 | 29977 | } |
| 30042 | 29978 | // The comptime Value representation is compatible with both types. |
| 30043 | | return sema.addConstant( |
| 30044 | | try mod.getCoerced((try val.intern(inst_ty, mod)).toValue(), dest_ty), |
| 29979 | return Air.internedToRef( |
| 29980 | (try mod.getCoerced((try val.intern(inst_ty, mod)).toValue(), dest_ty)).toIntern(), |
| 30045 | 29981 | ); |
| 30046 | 29982 | } |
| 30047 | 29983 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | ... | @@ -30139,7 +30075,7 @@ fn coerceEnumToUnion( |
| 30139 | 30075 | return sema.failWithOwnedErrorMsg(msg); |
| 30140 | 30076 | }; |
| 30141 | 30077 | |
| 30142 | | return sema.addConstant(try mod.unionValue(union_ty, val, opv)); |
| 30078 | return Air.internedToRef((try mod.unionValue(union_ty, val, opv)).toIntern()); |
| 30143 | 30079 | } |
| 30144 | 30080 | |
| 30145 | 30081 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | ... | @@ -30347,7 +30283,7 @@ fn coerceArrayLike( |
| 30347 | 30283 | var runtime_src: ?LazySrcLoc = null; |
| 30348 | 30284 | |
| 30349 | 30285 | for (element_vals, element_refs, 0..) |*val, *ref, i| { |
| 30350 | | const index_ref = try sema.addConstant(try mod.intValue(Type.usize, i)); |
| 30286 | const index_ref = Air.internedToRef((try mod.intValue(Type.usize, i)).toIntern()); |
| 30351 | 30287 | const src = inst_src; // TODO better source location |
| 30352 | 30288 | const elem_src = inst_src; // TODO better source location |
| 30353 | 30289 | const elem_ref = try sema.elemValArray(block, src, inst_src, inst, elem_src, index_ref, true); |
| ... | ... | @@ -30367,10 +30303,10 @@ fn coerceArrayLike( |
| 30367 | 30303 | return block.addAggregateInit(dest_ty, element_refs); |
| 30368 | 30304 | } |
| 30369 | 30305 | |
| 30370 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 30306 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 30371 | 30307 | .ty = dest_ty.toIntern(), |
| 30372 | 30308 | .storage = .{ .elems = element_vals }, |
| 30373 | | } })).toValue()); |
| 30309 | } }))); |
| 30374 | 30310 | } |
| 30375 | 30311 | |
| 30376 | 30312 | /// If the lengths match, coerces element-wise. |
| ... | ... | @@ -30411,7 +30347,7 @@ fn coerceTupleToArray( |
| 30411 | 30347 | if (i_usize == inst_len) { |
| 30412 | 30348 | const sentinel_val = dest_ty.sentinel(mod).?; |
| 30413 | 30349 | val.* = sentinel_val.toIntern(); |
| 30414 | | ref.* = try sema.addConstant(sentinel_val); |
| 30350 | ref.* = Air.internedToRef(sentinel_val.toIntern()); |
| 30415 | 30351 | break; |
| 30416 | 30352 | } |
| 30417 | 30353 | const elem_src = inst_src; // TODO better source location |
| ... | ... | @@ -30432,10 +30368,10 @@ fn coerceTupleToArray( |
| 30432 | 30368 | return block.addAggregateInit(dest_ty, element_refs); |
| 30433 | 30369 | } |
| 30434 | 30370 | |
| 30435 | | return sema.addConstant((try mod.intern(.{ .aggregate = .{ |
| 30371 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 30436 | 30372 | .ty = dest_ty.toIntern(), |
| 30437 | 30373 | .storage = .{ .elems = element_vals }, |
| 30438 | | } })).toValue()); |
| 30374 | } }))); |
| 30439 | 30375 | } |
| 30440 | 30376 | |
| 30441 | 30377 | /// If the lengths match, coerces element-wise. |
| ... | ... | @@ -30575,7 +30511,7 @@ fn coerceTupleToStruct( |
| 30575 | 30511 | if (runtime_src == null) { |
| 30576 | 30512 | field_vals[i] = field.default_val; |
| 30577 | 30513 | } else { |
| 30578 | | field_ref.* = try sema.addConstant(field.default_val.toValue()); |
| 30514 | field_ref.* = Air.internedToRef(field.default_val); |
| 30579 | 30515 | } |
| 30580 | 30516 | } |
| 30581 | 30517 | |
| ... | ... | @@ -30597,7 +30533,7 @@ fn coerceTupleToStruct( |
| 30597 | 30533 | // TODO: figure out InternPool removals for incremental compilation |
| 30598 | 30534 | //errdefer ip.remove(struct_val); |
| 30599 | 30535 | |
| 30600 | | return sema.addConstant(struct_val.toValue()); |
| 30536 | return Air.internedToRef(struct_val); |
| 30601 | 30537 | } |
| 30602 | 30538 | |
| 30603 | 30539 | fn coerceTupleToTuple( |
| ... | ... | @@ -30719,7 +30655,7 @@ fn coerceTupleToTuple( |
| 30719 | 30655 | if (runtime_src == null) { |
| 30720 | 30656 | field_vals[i] = default_val; |
| 30721 | 30657 | } else { |
| 30722 | | field_ref.* = try sema.addConstant(default_val.toValue()); |
| 30658 | field_ref.* = Air.internedToRef(default_val); |
| 30723 | 30659 | } |
| 30724 | 30660 | } |
| 30725 | 30661 | |
| ... | ... | @@ -30734,12 +30670,10 @@ fn coerceTupleToTuple( |
| 30734 | 30670 | return block.addAggregateInit(tuple_ty, field_refs); |
| 30735 | 30671 | } |
| 30736 | 30672 | |
| 30737 | | return sema.addConstant( |
| 30738 | | (try mod.intern(.{ .aggregate = .{ |
| 30739 | | .ty = tuple_ty.toIntern(), |
| 30740 | | .storage = .{ .elems = field_vals }, |
| 30741 | | } })).toValue(), |
| 30742 | | ); |
| 30673 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 30674 | .ty = tuple_ty.toIntern(), |
| 30675 | .storage = .{ .elems = field_vals }, |
| 30676 | } }))); |
| 30743 | 30677 | } |
| 30744 | 30678 | |
| 30745 | 30679 | fn analyzeDeclVal( |
| ... | ... | @@ -30863,10 +30797,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: Decl.Index, analyze_fn_body: boo |
| 30863 | 30797 | if (analyze_fn_body) { |
| 30864 | 30798 | try sema.maybeQueueFuncBodyAnalysis(decl_index); |
| 30865 | 30799 | } |
| 30866 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 30800 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 30867 | 30801 | .ty = ptr_ty.toIntern(), |
| 30868 | 30802 | .addr = .{ .decl = decl_index }, |
| 30869 | | } })).toValue()); |
| 30803 | } }))); |
| 30870 | 30804 | } |
| 30871 | 30805 | |
| 30872 | 30806 | fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: Decl.Index) !void { |
| ... | ... | @@ -30939,12 +30873,12 @@ fn analyzeLoad( |
| 30939 | 30873 | }; |
| 30940 | 30874 | |
| 30941 | 30875 | if (try sema.typeHasOnePossibleValue(elem_ty)) |opv| { |
| 30942 | | return sema.addConstant(opv); |
| 30876 | return Air.internedToRef(opv.toIntern()); |
| 30943 | 30877 | } |
| 30944 | 30878 | |
| 30945 | 30879 | if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { |
| 30946 | 30880 | if (try sema.pointerDeref(block, src, ptr_val, ptr_ty)) |elem_val| { |
| 30947 | | return sema.addConstant(elem_val); |
| 30881 | return Air.internedToRef(elem_val.toIntern()); |
| 30948 | 30882 | } |
| 30949 | 30883 | } |
| 30950 | 30884 | |
| ... | ... | @@ -30974,8 +30908,8 @@ fn analyzeSlicePtr( |
| 30974 | 30908 | const mod = sema.mod; |
| 30975 | 30909 | const result_ty = slice_ty.slicePtrFieldType(mod); |
| 30976 | 30910 | if (try sema.resolveMaybeUndefVal(slice)) |val| { |
| 30977 | | if (val.isUndef(mod)) return sema.addConstUndef(result_ty); |
| 30978 | | return sema.addConstant(val.slicePtr(mod)); |
| 30911 | if (val.isUndef(mod)) return mod.undefRef(result_ty); |
| 30912 | return Air.internedToRef(val.slicePtr(mod).toIntern()); |
| 30979 | 30913 | } |
| 30980 | 30914 | try sema.requireRuntimeBlock(block, slice_src, null); |
| 30981 | 30915 | return block.addTyOp(.slice_ptr, result_ty, slice); |
| ... | ... | @@ -30990,9 +30924,9 @@ fn analyzeSliceLen( |
| 30990 | 30924 | const mod = sema.mod; |
| 30991 | 30925 | if (try sema.resolveMaybeUndefVal(slice_inst)) |slice_val| { |
| 30992 | 30926 | if (slice_val.isUndef(mod)) { |
| 30993 | | return sema.addConstUndef(Type.usize); |
| 30927 | return mod.undefRef(Type.usize); |
| 30994 | 30928 | } |
| 30995 | | return sema.addIntUnsigned(Type.usize, slice_val.sliceLen(sema.mod)); |
| 30929 | return mod.intRef(Type.usize, slice_val.sliceLen(sema.mod)); |
| 30996 | 30930 | } |
| 30997 | 30931 | try sema.requireRuntimeBlock(block, src, null); |
| 30998 | 30932 | return block.addTyOp(.slice_len, Type.usize, slice_inst); |
| ... | ... | @@ -31009,7 +30943,7 @@ fn analyzeIsNull( |
| 31009 | 30943 | const result_ty = Type.bool; |
| 31010 | 30944 | if (try sema.resolveMaybeUndefVal(operand)) |opt_val| { |
| 31011 | 30945 | if (opt_val.isUndef(mod)) { |
| 31012 | | return sema.addConstUndef(result_ty); |
| 30946 | return mod.undefRef(result_ty); |
| 31013 | 30947 | } |
| 31014 | 30948 | const is_null = opt_val.isNull(mod); |
| 31015 | 30949 | const bool_value = if (invert_logic) !is_null else is_null; |
| ... | ... | @@ -31081,7 +31015,7 @@ fn analyzeIsNonErrComptimeOnly( |
| 31081 | 31015 | else => {}, |
| 31082 | 31016 | } |
| 31083 | 31017 | } else if (operand == .undef) { |
| 31084 | | return sema.addConstUndef(Type.bool); |
| 31018 | return mod.undefRef(Type.bool); |
| 31085 | 31019 | } else if (@intFromEnum(operand) < InternPool.static_len) { |
| 31086 | 31020 | // None of the ref tags can be errors. |
| 31087 | 31021 | return .bool_true; |
| ... | ... | @@ -31165,7 +31099,7 @@ fn analyzeIsNonErrComptimeOnly( |
| 31165 | 31099 | |
| 31166 | 31100 | if (maybe_operand_val) |err_union| { |
| 31167 | 31101 | if (err_union.isUndef(mod)) { |
| 31168 | | return sema.addConstUndef(Type.bool); |
| 31102 | return mod.undefRef(Type.bool); |
| 31169 | 31103 | } |
| 31170 | 31104 | if (err_union.getErrorName(mod) == .none) { |
| 31171 | 31105 | return .bool_true; |
| ... | ... | @@ -31341,7 +31275,7 @@ fn analyzeSlice( |
| 31341 | 31275 | break :e end; |
| 31342 | 31276 | } |
| 31343 | 31277 | |
| 31344 | | break :e try sema.addConstant(len_val); |
| 31278 | break :e Air.internedToRef(len_val.toIntern()); |
| 31345 | 31279 | } else if (slice_ty.isSlice(mod)) { |
| 31346 | 31280 | if (!end_is_len) { |
| 31347 | 31281 | const end = if (by_length) end: { |
| ... | ... | @@ -31554,15 +31488,15 @@ fn analyzeSlice( |
| 31554 | 31488 | }; |
| 31555 | 31489 | |
| 31556 | 31490 | if (!new_ptr_val.isUndef(mod)) { |
| 31557 | | return sema.addConstant(try mod.getCoerced( |
| 31491 | return Air.internedToRef((try mod.getCoerced( |
| 31558 | 31492 | (try new_ptr_val.intern(new_ptr_ty, mod)).toValue(), |
| 31559 | 31493 | return_ty, |
| 31560 | | )); |
| 31494 | )).toIntern()); |
| 31561 | 31495 | } |
| 31562 | 31496 | |
| 31563 | 31497 | // Special case: @as([]i32, undefined)[x..x] |
| 31564 | 31498 | if (new_len_int == 0) { |
| 31565 | | return sema.addConstUndef(return_ty); |
| 31499 | return mod.undefRef(return_ty); |
| 31566 | 31500 | } |
| 31567 | 31501 | |
| 31568 | 31502 | return sema.fail(block, src, "non-zero length slice of undefined pointer", .{}); |
| ... | ... | @@ -31591,12 +31525,12 @@ fn analyzeSlice( |
| 31591 | 31525 | |
| 31592 | 31526 | // requirement: end <= len |
| 31593 | 31527 | const opt_len_inst = if (array_ty.zigTypeTag(mod) == .Array) |
| 31594 | | try sema.addIntUnsigned(Type.usize, array_ty.arrayLenIncludingSentinel(mod)) |
| 31528 | try mod.intRef(Type.usize, array_ty.arrayLenIncludingSentinel(mod)) |
| 31595 | 31529 | else if (slice_ty.isSlice(mod)) blk: { |
| 31596 | 31530 | if (try sema.resolveDefinedValue(block, src, ptr_or_slice)) |slice_val| { |
| 31597 | 31531 | // we don't need to add one for sentinels because the |
| 31598 | 31532 | // underlying value data includes the sentinel |
| 31599 | | break :blk try sema.addIntUnsigned(Type.usize, slice_val.sliceLen(mod)); |
| 31533 | break :blk try mod.intRef(Type.usize, slice_val.sliceLen(mod)); |
| 31600 | 31534 | } |
| 31601 | 31535 | |
| 31602 | 31536 | const slice_len_inst = try block.addTyOp(.slice_len, Type.usize, ptr_or_slice); |
| ... | ... | @@ -31619,7 +31553,7 @@ fn analyzeSlice( |
| 31619 | 31553 | const result = try block.addInst(.{ |
| 31620 | 31554 | .tag = .slice, |
| 31621 | 31555 | .data = .{ .ty_pl = .{ |
| 31622 | | .ty = try sema.addType(return_ty), |
| 31556 | .ty = Air.internedToRef(return_ty.toIntern()), |
| 31623 | 31557 | .payload = try sema.addExtra(Air.Bin{ |
| 31624 | 31558 | .lhs = new_ptr, |
| 31625 | 31559 | .rhs = new_len, |
| ... | ... | @@ -31683,7 +31617,7 @@ fn cmpNumeric( |
| 31683 | 31617 | } |
| 31684 | 31618 | |
| 31685 | 31619 | if (lhs_val.isUndef(mod) or rhs_val.isUndef(mod)) { |
| 31686 | | return sema.addConstUndef(Type.bool); |
| 31620 | return mod.undefRef(Type.bool); |
| 31687 | 31621 | } |
| 31688 | 31622 | if (lhs_val.isNan(mod) or rhs_val.isNan(mod)) { |
| 31689 | 31623 | if (op == std.math.CompareOperator.neq) { |
| ... | ... | @@ -31776,7 +31710,7 @@ fn cmpNumeric( |
| 31776 | 31710 | var lhs_bits: usize = undefined; |
| 31777 | 31711 | if (try sema.resolveMaybeUndefLazyVal(lhs)) |lhs_val| { |
| 31778 | 31712 | if (lhs_val.isUndef(mod)) |
| 31779 | | return sema.addConstUndef(Type.bool); |
| 31713 | return mod.undefRef(Type.bool); |
| 31780 | 31714 | if (lhs_val.isNan(mod)) switch (op) { |
| 31781 | 31715 | .neq => return Air.Inst.Ref.bool_true, |
| 31782 | 31716 | else => return Air.Inst.Ref.bool_false, |
| ... | ... | @@ -31834,7 +31768,7 @@ fn cmpNumeric( |
| 31834 | 31768 | var rhs_bits: usize = undefined; |
| 31835 | 31769 | if (try sema.resolveMaybeUndefLazyVal(rhs)) |rhs_val| { |
| 31836 | 31770 | if (rhs_val.isUndef(mod)) |
| 31837 | | return sema.addConstUndef(Type.bool); |
| 31771 | return mod.undefRef(Type.bool); |
| 31838 | 31772 | if (rhs_val.isNan(mod)) switch (op) { |
| 31839 | 31773 | .neq => return Air.Inst.Ref.bool_true, |
| 31840 | 31774 | else => return Air.Inst.Ref.bool_false, |
| ... | ... | @@ -32039,10 +31973,10 @@ fn cmpVector( |
| 32039 | 31973 | if (try sema.resolveMaybeUndefVal(casted_lhs)) |lhs_val| { |
| 32040 | 31974 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { |
| 32041 | 31975 | if (lhs_val.isUndef(mod) or rhs_val.isUndef(mod)) { |
| 32042 | | return sema.addConstUndef(result_ty); |
| 31976 | return mod.undefRef(result_ty); |
| 32043 | 31977 | } |
| 32044 | 31978 | const cmp_val = try sema.compareVector(lhs_val, op, rhs_val, resolved_ty); |
| 32045 | | return sema.addConstant(cmp_val); |
| 31979 | return Air.internedToRef(cmp_val.toIntern()); |
| 32046 | 31980 | } else { |
| 32047 | 31981 | break :src rhs_src; |
| 32048 | 31982 | } |
| ... | ... | @@ -32063,10 +31997,10 @@ fn wrapOptional( |
| 32063 | 31997 | inst_src: LazySrcLoc, |
| 32064 | 31998 | ) !Air.Inst.Ref { |
| 32065 | 31999 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 32066 | | return sema.addConstant((try sema.mod.intern(.{ .opt = .{ |
| 32000 | return Air.internedToRef((try sema.mod.intern(.{ .opt = .{ |
| 32067 | 32001 | .ty = dest_ty.toIntern(), |
| 32068 | 32002 | .val = val.toIntern(), |
| 32069 | | } })).toValue()); |
| 32003 | } }))); |
| 32070 | 32004 | } |
| 32071 | 32005 | |
| 32072 | 32006 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | ... | @@ -32084,10 +32018,10 @@ fn wrapErrorUnionPayload( |
| 32084 | 32018 | const dest_payload_ty = dest_ty.errorUnionPayload(mod); |
| 32085 | 32019 | const coerced = try sema.coerceExtra(block, dest_payload_ty, inst, inst_src, .{ .report_err = false }); |
| 32086 | 32020 | if (try sema.resolveMaybeUndefVal(coerced)) |val| { |
| 32087 | | return sema.addConstant((try mod.intern(.{ .error_union = .{ |
| 32021 | return Air.internedToRef((try mod.intern(.{ .error_union = .{ |
| 32088 | 32022 | .ty = dest_ty.toIntern(), |
| 32089 | 32023 | .val = .{ .payload = try val.intern(dest_payload_ty, mod) }, |
| 32090 | | } })).toValue()); |
| 32024 | } }))); |
| 32091 | 32025 | } |
| 32092 | 32026 | try sema.requireRuntimeBlock(block, inst_src, null); |
| 32093 | 32027 | try sema.queueFullTypeResolution(dest_payload_ty); |
| ... | ... | @@ -32145,10 +32079,10 @@ fn wrapErrorUnionSet( |
| 32145 | 32079 | else => unreachable, |
| 32146 | 32080 | }, |
| 32147 | 32081 | } |
| 32148 | | return sema.addConstant((try mod.intern(.{ .error_union = .{ |
| 32082 | return Air.internedToRef((try mod.intern(.{ .error_union = .{ |
| 32149 | 32083 | .ty = dest_ty.toIntern(), |
| 32150 | 32084 | .val = .{ .err_name = expected_name }, |
| 32151 | | } })).toValue()); |
| 32085 | } }))); |
| 32152 | 32086 | } |
| 32153 | 32087 | |
| 32154 | 32088 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | ... | @@ -32165,10 +32099,10 @@ fn unionToTag( |
| 32165 | 32099 | ) !Air.Inst.Ref { |
| 32166 | 32100 | const mod = sema.mod; |
| 32167 | 32101 | if ((try sema.typeHasOnePossibleValue(enum_ty))) |opv| { |
| 32168 | | return sema.addConstant(opv); |
| 32102 | return Air.internedToRef(opv.toIntern()); |
| 32169 | 32103 | } |
| 32170 | 32104 | if (try sema.resolveMaybeUndefVal(un)) |un_val| { |
| 32171 | | return sema.addConstant(un_val.unionTag(mod)); |
| 32105 | return Air.internedToRef(un_val.unionTag(mod).toIntern()); |
| 32172 | 32106 | } |
| 32173 | 32107 | try sema.requireRuntimeBlock(block, un_src, null); |
| 32174 | 32108 | return block.addTyOp(.get_union_tag, enum_ty, un); |
| ... | ... | @@ -33510,7 +33444,7 @@ fn resolvePeerTypesInner( |
| 33510 | 33444 | comptime_val = null; |
| 33511 | 33445 | break; |
| 33512 | 33446 | }; |
| 33513 | | const uncoerced_field = try sema.addConstant(uncoerced_field_val); |
| 33447 | const uncoerced_field = Air.internedToRef(uncoerced_field_val.toIntern()); |
| 33514 | 33448 | const coerced_inst = sema.coerceExtra(block, field_ty.toType(), uncoerced_field, src, .{ .report_err = false }) catch |err| switch (err) { |
| 33515 | 33449 | // It's possible for PTR to give false positives. Just give up on making this a comptime field, we'll get an error later anyway |
| 33516 | 33450 | error.NotCoercible => { |
| ... | ... | @@ -35977,27 +35911,6 @@ pub fn getTmpAir(sema: Sema) Air { |
| 35977 | 35911 | }; |
| 35978 | 35912 | } |
| 35979 | 35913 | |
| 35980 | | // TODO: make this non-fallible or remove it entirely |
| 35981 | | pub fn addType(sema: *Sema, ty: Type) !Air.Inst.Ref { |
| 35982 | | _ = sema; |
| 35983 | | return Air.internedToRef(ty.toIntern()); |
| 35984 | | } |
| 35985 | | |
| 35986 | | fn addIntUnsigned(sema: *Sema, ty: Type, int: u64) CompileError!Air.Inst.Ref { |
| 35987 | | const mod = sema.mod; |
| 35988 | | return sema.addConstant(try mod.intValue(ty, int)); |
| 35989 | | } |
| 35990 | | |
| 35991 | | fn addConstUndef(sema: *Sema, ty: Type) CompileError!Air.Inst.Ref { |
| 35992 | | return sema.addConstant((try sema.mod.intern(.{ .undef = ty.toIntern() })).toValue()); |
| 35993 | | } |
| 35994 | | |
| 35995 | | // TODO: make this non-fallible or remove it entirely |
| 35996 | | pub fn addConstant(sema: *Sema, val: Value) !Air.Inst.Ref { |
| 35997 | | _ = sema; |
| 35998 | | return Air.internedToRef(val.toIntern()); |
| 35999 | | } |
| 36000 | | |
| 36001 | 35914 | pub fn addExtra(sema: *Sema, extra: anytype) Allocator.Error!u32 { |
| 36002 | 35915 | const fields = std.meta.fields(@TypeOf(extra)); |
| 36003 | 35916 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, fields.len); |
| ... | ... | @@ -36075,13 +35988,13 @@ fn analyzeComptimeAlloc( |
| 36075 | 35988 | |
| 36076 | 35989 | try sema.comptime_mutable_decls.append(decl_index); |
| 36077 | 35990 | try mod.declareDeclDependency(sema.owner_decl_index, decl_index); |
| 36078 | | return sema.addConstant((try mod.intern(.{ .ptr = .{ |
| 35991 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 36079 | 35992 | .ty = ptr_type.toIntern(), |
| 36080 | 35993 | .addr = .{ .mut_decl = .{ |
| 36081 | 35994 | .decl = decl_index, |
| 36082 | 35995 | .runtime_index = block.runtime_index, |
| 36083 | 35996 | } }, |
| 36084 | | } })).toValue()); |
| 35997 | } }))); |
| 36085 | 35998 | } |
| 36086 | 35999 | |
| 36087 | 36000 | /// The places where a user can specify an address space attribute |