| ... | @@ -489,7 +489,7 @@ pub const Block = struct { | ... | @@ -489,7 +489,7 @@ pub const Block = struct { |
| 489 | return block.addInst(.{ | 489 | return block.addInst(.{ |
| 490 | .tag = tag, | 490 | .tag = tag, |
| 491 | .data = .{ .ty_op = .{ | 491 | .data = .{ .ty_op = .{ |
| 492 | .ty = try block.sema.addType(ty), | 492 | .ty = Air.internedToRef(ty.toIntern()), |
| 493 | .operand = operand, | 493 | .operand = operand, |
| 494 | } }, | 494 | } }, |
| 495 | }); | 495 | }); |
| ... | @@ -499,7 +499,7 @@ pub const Block = struct { | ... | @@ -499,7 +499,7 @@ pub const Block = struct { |
| 499 | return block.addInst(.{ | 499 | return block.addInst(.{ |
| 500 | .tag = .bitcast, | 500 | .tag = .bitcast, |
| 501 | .data = .{ .ty_op = .{ | 501 | .data = .{ .ty_op = .{ |
| 502 | .ty = try block.sema.addType(ty), | 502 | .ty = Air.internedToRef(ty.toIntern()), |
| 503 | .operand = operand, | 503 | .operand = operand, |
| 504 | } }, | 504 | } }, |
| 505 | }); | 505 | }); |
| ... | @@ -558,7 +558,7 @@ pub const Block = struct { | ... | @@ -558,7 +558,7 @@ pub const Block = struct { |
| 558 | field_index: u32, | 558 | field_index: u32, |
| 559 | ptr_field_ty: Type, | 559 | ptr_field_ty: Type, |
| 560 | ) !Air.Inst.Ref { | 560 | ) !Air.Inst.Ref { |
| 561 | const ty = try block.sema.addType(ptr_field_ty); | 561 | const ty = Air.internedToRef(ptr_field_ty.toIntern()); |
| 562 | const tag: Air.Inst.Tag = switch (field_index) { | 562 | const tag: Air.Inst.Tag = switch (field_index) { |
| 563 | 0 => .struct_field_ptr_index_0, | 563 | 0 => .struct_field_ptr_index_0, |
| 564 | 1 => .struct_field_ptr_index_1, | 564 | 1 => .struct_field_ptr_index_1, |
| ... | @@ -595,7 +595,7 @@ pub const Block = struct { | ... | @@ -595,7 +595,7 @@ pub const Block = struct { |
| 595 | return block.addInst(.{ | 595 | return block.addInst(.{ |
| 596 | .tag = .struct_field_val, | 596 | .tag = .struct_field_val, |
| 597 | .data = .{ .ty_pl = .{ | 597 | .data = .{ .ty_pl = .{ |
| 598 | .ty = try block.sema.addType(field_ty), | 598 | .ty = Air.internedToRef(field_ty.toIntern()), |
| 599 | .payload = try block.sema.addExtra(Air.StructField{ | 599 | .payload = try block.sema.addExtra(Air.StructField{ |
| 600 | .struct_operand = struct_val, | 600 | .struct_operand = struct_val, |
| 601 | .field_index = field_index, | 601 | .field_index = field_index, |
| ... | @@ -613,7 +613,7 @@ pub const Block = struct { | ... | @@ -613,7 +613,7 @@ pub const Block = struct { |
| 613 | return block.addInst(.{ | 613 | return block.addInst(.{ |
| 614 | .tag = .slice_elem_ptr, | 614 | .tag = .slice_elem_ptr, |
| 615 | .data = .{ .ty_pl = .{ | 615 | .data = .{ .ty_pl = .{ |
| 616 | .ty = try block.sema.addType(elem_ptr_ty), | 616 | .ty = Air.internedToRef(elem_ptr_ty.toIntern()), |
| 617 | .payload = try block.sema.addExtra(Air.Bin{ | 617 | .payload = try block.sema.addExtra(Air.Bin{ |
| 618 | .lhs = slice, | 618 | .lhs = slice, |
| 619 | .rhs = elem_index, | 619 | .rhs = elem_index, |
| ... | @@ -628,7 +628,7 @@ pub const Block = struct { | ... | @@ -628,7 +628,7 @@ pub const Block = struct { |
| 628 | elem_index: Air.Inst.Ref, | 628 | elem_index: Air.Inst.Ref, |
| 629 | elem_ptr_ty: Type, | 629 | elem_ptr_ty: Type, |
| 630 | ) !Air.Inst.Ref { | 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 | return block.addPtrElemPtrTypeRef(array_ptr, elem_index, ty_ref); | 632 | return block.addPtrElemPtrTypeRef(array_ptr, elem_index, ty_ref); |
| 633 | } | 633 | } |
| 634 | | 634 | |
| ... | @@ -656,12 +656,10 @@ pub const Block = struct { | ... | @@ -656,12 +656,10 @@ pub const Block = struct { |
| 656 | return block.addInst(.{ | 656 | return block.addInst(.{ |
| 657 | .tag = if (block.float_mode == .Optimized) .cmp_vector_optimized else .cmp_vector, | 657 | .tag = if (block.float_mode == .Optimized) .cmp_vector_optimized else .cmp_vector, |
| 658 | .data = .{ .ty_pl = .{ | 658 | .data = .{ .ty_pl = .{ |
| 659 | .ty = try sema.addType( | 659 | .ty = Air.internedToRef((try mod.vectorType(.{ |
| 660 | try mod.vectorType(.{ | 660 | .len = sema.typeOf(lhs).vectorLen(mod), |
| 661 | .len = sema.typeOf(lhs).vectorLen(mod), | 661 | .child = .bool_type, |
| 662 | .child = .bool_type, | 662 | })).toIntern()), |
| 663 | }), | | |
| 664 | ), | | |
| 665 | .payload = try sema.addExtra(Air.VectorCmp{ | 663 | .payload = try sema.addExtra(Air.VectorCmp{ |
| 666 | .lhs = lhs, | 664 | .lhs = lhs, |
| 667 | .rhs = rhs, | 665 | .rhs = rhs, |
| ... | @@ -677,7 +675,7 @@ pub const Block = struct { | ... | @@ -677,7 +675,7 @@ pub const Block = struct { |
| 677 | elements: []const Air.Inst.Ref, | 675 | elements: []const Air.Inst.Ref, |
| 678 | ) !Air.Inst.Ref { | 676 | ) !Air.Inst.Ref { |
| 679 | const sema = block.sema; | 677 | const sema = block.sema; |
| 680 | const ty_ref = try sema.addType(aggregate_ty); | 678 | const ty_ref = Air.internedToRef(aggregate_ty.toIntern()); |
| 681 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, elements.len); | 679 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, elements.len); |
| 682 | const extra_index = @as(u32, @intCast(sema.air_extra.items.len)); | 680 | const extra_index = @as(u32, @intCast(sema.air_extra.items.len)); |
| 683 | sema.appendRefsAssumeCapacity(elements); | 681 | sema.appendRefsAssumeCapacity(elements); |
| ... | @@ -700,7 +698,7 @@ pub const Block = struct { | ... | @@ -700,7 +698,7 @@ pub const Block = struct { |
| 700 | return block.addInst(.{ | 698 | return block.addInst(.{ |
| 701 | .tag = .union_init, | 699 | .tag = .union_init, |
| 702 | .data = .{ .ty_pl = .{ | 700 | .data = .{ .ty_pl = .{ |
| 703 | .ty = try block.sema.addType(union_ty), | 701 | .ty = Air.internedToRef(union_ty.toIntern()), |
| 704 | .payload = try block.sema.addExtra(Air.UnionInit{ | 702 | .payload = try block.sema.addExtra(Air.UnionInit{ |
| 705 | .field_index = field_index, | 703 | .field_index = field_index, |
| 706 | .init = init, | 704 | .init = init, |
| ... | @@ -2665,13 +2663,13 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE | ... | @@ -2665,13 +2663,13 @@ fn zirCoerceResultPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 2665 | }); | 2663 | }); |
| 2666 | try sema.maybeQueueFuncBodyAnalysis(decl_index); | 2664 | try sema.maybeQueueFuncBodyAnalysis(decl_index); |
| 2667 | try sema.comptime_mutable_decls.append(decl_index); | 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 | .ty = ptr_ty.toIntern(), | 2667 | .ty = ptr_ty.toIntern(), |
| 2670 | .addr = .{ .mut_decl = .{ | 2668 | .addr = .{ .mut_decl = .{ |
| 2671 | .decl = decl_index, | 2669 | .decl = decl_index, |
| 2672 | .runtime_index = block.runtime_index, | 2670 | .runtime_index = block.runtime_index, |
| 2673 | } }, | 2671 | } }, |
| 2674 | } })).toValue()); | 2672 | } }))); |
| 2675 | }, | 2673 | }, |
| 2676 | else => {}, | 2674 | else => {}, |
| 2677 | } | 2675 | } |
| ... | @@ -2739,10 +2737,10 @@ fn coerceResultPtr( | ... | @@ -2739,10 +2737,10 @@ fn coerceResultPtr( |
| 2739 | | 2737 | |
| 2740 | if (trash_block.instructions.items.len == prev_trash_len) { | 2738 | if (trash_block.instructions.items.len == prev_trash_len) { |
| 2741 | if (try sema.resolveDefinedValue(block, src, new_ptr)) |ptr_val| { | 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 | if (pointee_ty.eql(Type.null, sema.mod)) { | 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 | _ = try block.addBinOp(.store, new_ptr, null_inst); | 2744 | _ = try block.addBinOp(.store, new_ptr, null_inst); |
| 2747 | return Air.Inst.Ref.void_value; | 2745 | return Air.Inst.Ref.void_value; |
| 2748 | } | 2746 | } |
| ... | @@ -2761,7 +2759,7 @@ fn coerceResultPtr( | ... | @@ -2761,7 +2759,7 @@ fn coerceResultPtr( |
| 2761 | }); | 2759 | }); |
| 2762 | | 2760 | |
| 2763 | if (try sema.resolveDefinedValue(block, src, new_ptr)) |ptr_val| { | 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 | } else { | 2763 | } else { |
| 2766 | return sema.bitCast(block, ptr_operand_ty, new_ptr, src, null); | 2764 | return sema.bitCast(block, ptr_operand_ty, new_ptr, src, null); |
| 2767 | } | 2765 | } |
| ... | @@ -2774,7 +2772,7 @@ fn coerceResultPtr( | ... | @@ -2774,7 +2772,7 @@ fn coerceResultPtr( |
| 2774 | .flags = .{ .address_space = addr_space }, | 2772 | .flags = .{ .address_space = addr_space }, |
| 2775 | }); | 2773 | }); |
| 2776 | if (try sema.resolveDefinedValue(block, src, new_ptr)) |ptr_val| { | 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 | } else { | 2776 | } else { |
| 2779 | new_ptr = try sema.bitCast(block, ptr_operand_ty, new_ptr, src, null); | 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,7 +3779,7 @@ fn makePtrConst(sema: *Sema, block: *Block, alloc: Air.Inst.Ref) CompileError!Ai |
| 3781 | | 3779 | |
| 3782 | // Detect if a comptime value simply needs to have its type changed. | 3780 | // Detect if a comptime value simply needs to have its type changed. |
| 3783 | if (try sema.resolveMaybeUndefVal(alloc)) |val| { | 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 | return block.addBitCast(const_ptr_ty, alloc); | 3785 | return block.addBitCast(const_ptr_ty, alloc); |
| ... | @@ -4332,7 +4330,7 @@ fn zirOptEuBaseTy( | ... | @@ -4332,7 +4330,7 @@ fn zirOptEuBaseTy( |
| 4332 | switch (ty.zigTypeTag(mod)) { | 4330 | switch (ty.zigTypeTag(mod)) { |
| 4333 | .Optional => ty = ty.optionalChild(mod), | 4331 | .Optional => ty = ty.optionalChild(mod), |
| 4334 | .ErrorUnion => ty = ty.errorUnionPayload(mod), | 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,14 +4582,14 @@ fn validateUnionInit( |
| 4584 | .ty = union_ty.toIntern(), | 4582 | .ty = union_ty.toIntern(), |
| 4585 | .val = union_val, | 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 | try sema.storePtr2(block, init_src, union_ptr, init_src, union_init, init_src, .store); | 4586 | try sema.storePtr2(block, init_src, union_ptr, init_src, union_init, init_src, .store); |
| 4589 | return; | 4587 | return; |
| 4590 | } else if (try sema.typeRequiresComptime(union_ty)) { | 4588 | } else if (try sema.typeRequiresComptime(union_ty)) { |
| 4591 | return sema.failWithNeededComptime(block, field_ptr_data.src(), "initializer of comptime only union must be comptime-known"); | 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 | _ = try block.addBinOp(.set_union_tag, union_ptr, new_tag); | 4593 | _ = try block.addBinOp(.set_union_tag, union_ptr, new_tag); |
| 4596 | } | 4594 | } |
| 4597 | | 4595 | |
| ... | @@ -4685,7 +4683,7 @@ fn validateStructInit( | ... | @@ -4685,7 +4683,7 @@ fn validateStructInit( |
| 4685 | try sema.tupleFieldPtr(block, init_src, struct_ptr, field_src, @as(u32, @intCast(i)), true) | 4683 | try sema.tupleFieldPtr(block, init_src, struct_ptr, field_src, @as(u32, @intCast(i)), true) |
| 4686 | else | 4684 | else |
| 4687 | try sema.structFieldPtrByIndex(block, init_src, struct_ptr, @as(u32, @intCast(i)), field_src, struct_ty, true); | 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 | try sema.storePtr2(block, init_src, default_field_ptr, init_src, init, field_src, .store); | 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,7 +4874,7 @@ fn validateStructInit( |
| 4876 | .ty = struct_ty.toIntern(), | 4874 | .ty = struct_ty.toIntern(), |
| 4877 | .val = struct_val, | 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 | try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store); | 4878 | try sema.storePtr2(block, init_src, struct_ptr, init_src, struct_init, init_src, .store); |
| 4881 | return; | 4879 | return; |
| 4882 | } | 4880 | } |
| ... | @@ -4891,7 +4889,7 @@ fn validateStructInit( | ... | @@ -4891,7 +4889,7 @@ fn validateStructInit( |
| 4891 | try sema.tupleFieldPtr(block, init_src, struct_ptr, field_src, @as(u32, @intCast(i)), true) | 4889 | try sema.tupleFieldPtr(block, init_src, struct_ptr, field_src, @as(u32, @intCast(i)), true) |
| 4892 | else | 4890 | else |
| 4893 | try sema.structFieldPtrByIndex(block, init_src, struct_ptr, @as(u32, @intCast(i)), field_src, struct_ty, true); | 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 | try sema.storePtr2(block, init_src, default_field_ptr, init_src, init, field_src, .store); | 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,9 +4954,9 @@ fn zirValidateArrayInit( |
| 4956 | // sentinel-terminated array, the sentinel will not have been populated by | 4954 | // sentinel-terminated array, the sentinel will not have been populated by |
| 4957 | // any ZIR instructions at comptime; we need to do that here. | 4955 | // any ZIR instructions at comptime; we need to do that here. |
| 4958 | if (array_ty.sentinel(mod)) |sentinel_val| { | 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 | const sentinel_ptr = try sema.elemPtrArray(block, init_src, init_src, array_ptr, init_src, array_len_ref, true, true); | 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 | try sema.storePtr2(block, init_src, sentinel_ptr, init_src, sentinel, init_src, .store); | 4960 | try sema.storePtr2(block, init_src, sentinel_ptr, init_src, sentinel, init_src, .store); |
| 4963 | } | 4961 | } |
| 4964 | return; | 4962 | return; |
| ... | @@ -4966,7 +4964,7 @@ fn zirValidateArrayInit( | ... | @@ -4966,7 +4964,7 @@ fn zirValidateArrayInit( |
| 4966 | | 4964 | |
| 4967 | // If the array has one possible value, the value is always comptime-known. | 4965 | // If the array has one possible value, the value is always comptime-known. |
| 4968 | if (try sema.typeHasOnePossibleValue(array_ty)) |array_opv| { | 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 | try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store); | 4968 | try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store); |
| 4971 | return; | 4969 | return; |
| 4972 | } | 4970 | } |
| ... | @@ -5101,7 +5099,7 @@ fn zirValidateArrayInit( | ... | @@ -5101,7 +5099,7 @@ fn zirValidateArrayInit( |
| 5101 | .ty = array_ty.toIntern(), | 5099 | .ty = array_ty.toIntern(), |
| 5102 | .val = array_val, | 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 | try sema.storePtr2(block, init_src, array_ptr, init_src, array_init, init_src, .store); | 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,7 +5433,7 @@ fn zirInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 5435 | defer tracy.end(); | 5433 | defer tracy.end(); |
| 5436 | | 5434 | |
| 5437 | const int = sema.code.instructions.items(.data)[inst].int; | 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 | fn zirIntBig(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,20 +5452,19 @@ fn zirIntBig(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 5454 | const limbs = try sema.arena.alloc(std.math.big.Limb, int.len); | 5452 | const limbs = try sema.arena.alloc(std.math.big.Limb, int.len); |
| 5455 | @memcpy(mem.sliceAsBytes(limbs), limb_bytes); | 5453 | @memcpy(mem.sliceAsBytes(limbs), limb_bytes); |
| 5456 | | 5454 | |
| 5457 | return sema.addConstant( | 5455 | return Air.internedToRef((try mod.intValue_big(Type.comptime_int, .{ |
| 5458 | try mod.intValue_big(Type.comptime_int, .{ | 5456 | .limbs = limbs, |
| 5459 | .limbs = limbs, | 5457 | .positive = true, |
| 5460 | .positive = true, | 5458 | })).toIntern()); |
| 5461 | }), | | |
| 5462 | ); | | |
| 5463 | } | 5459 | } |
| 5464 | | 5460 | |
| 5465 | fn zirFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 5461 | fn zirFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 5466 | _ = block; | 5462 | _ = block; |
| 5467 | const number = sema.code.instructions.items(.data)[inst].float; | 5463 | const number = sema.code.instructions.items(.data)[inst].float; |
| 5468 | return sema.addConstant( | 5464 | return Air.internedToRef((try sema.mod.floatValue( |
| 5469 | try sema.mod.floatValue(Type.comptime_float, number), | 5465 | Type.comptime_float, |
| 5470 | ); | 5466 | number, |
| | 5467 | )).toIntern()); |
| 5471 | } | 5468 | } |
| 5472 | | 5469 | |
| 5473 | fn zirFloat128(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,9 +5472,7 @@ fn zirFloat128(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 5475 | const inst_data = sema.code.instructions.items(.data)[inst].pl_node; | 5472 | const inst_data = sema.code.instructions.items(.data)[inst].pl_node; |
| 5476 | const extra = sema.code.extraData(Zir.Inst.Float128, inst_data.payload_index).data; | 5473 | const extra = sema.code.extraData(Zir.Inst.Float128, inst_data.payload_index).data; |
| 5477 | const number = extra.get(); | 5474 | const number = extra.get(); |
| 5478 | return sema.addConstant( | 5475 | return Air.internedToRef((try sema.mod.floatValue(Type.comptime_float, number)).toIntern()); |
| 5479 | try sema.mod.floatValue(Type.comptime_float, number), | | |
| 5480 | ); | | |
| 5481 | } | 5476 | } |
| 5482 | | 5477 | |
| 5483 | fn zirCompileError(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index { | 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,7 +5737,7 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr |
| 5742 | const file_root_decl_index = result.file.root_decl.unwrap().?; | 5737 | const file_root_decl_index = result.file.root_decl.unwrap().?; |
| 5743 | const file_root_decl = mod.declPtr(file_root_decl_index); | 5738 | const file_root_decl = mod.declPtr(file_root_decl_index); |
| 5744 | try mod.declareDeclDependency(sema.owner_decl_index, file_root_decl_index); | 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 | fn zirSuspendBlock(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 5743 | fn zirSuspendBlock(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | @@ -5904,7 +5899,7 @@ fn analyzeBlockBody( | ... | @@ -5904,7 +5899,7 @@ fn analyzeBlockBody( |
| 5904 | }; | 5899 | }; |
| 5905 | return sema.failWithOwnedErrorMsg(msg); | 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 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len + | 5903 | try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len + |
| 5909 | child_block.instructions.items.len); | 5904 | child_block.instructions.items.len); |
| 5910 | sema.air_instructions.items(.data)[merges.block_inst] = .{ .ty_pl = .{ | 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,7 +6493,7 @@ pub fn analyzeSaveErrRetIndex(sema: *Sema, block: *Block) SemaError!Air.Inst.Ref |
| 6498 | return try block.addInst(.{ | 6493 | return try block.addInst(.{ |
| 6499 | .tag = .save_err_return_trace_index, | 6494 | .tag = .save_err_return_trace_index, |
| 6500 | .data = .{ .ty_pl = .{ | 6495 | .data = .{ .ty_pl = .{ |
| 6501 | .ty = try sema.addType(stack_trace_ty), | 6496 | .ty = Air.internedToRef(stack_trace_ty.toIntern()), |
| 6502 | .payload = @as(u32, @intCast(field_index)), | 6497 | .payload = @as(u32, @intCast(field_index)), |
| 6503 | } }, | 6498 | } }, |
| 6504 | }); | 6499 | }); |
| ... | @@ -6685,7 +6680,7 @@ fn zirCall( | ... | @@ -6685,7 +6680,7 @@ fn zirCall( |
| 6685 | const save_inst = try block.insertInst(block_index, .{ | 6680 | const save_inst = try block.insertInst(block_index, .{ |
| 6686 | .tag = .save_err_return_trace_index, | 6681 | .tag = .save_err_return_trace_index, |
| 6687 | .data = .{ .ty_pl = .{ | 6682 | .data = .{ .ty_pl = .{ |
| 6688 | .ty = try sema.addType(stack_trace_ty), | 6683 | .ty = Air.internedToRef(stack_trace_ty.toIntern()), |
| 6689 | .payload = @as(u32, @intCast(field_index)), | 6684 | .payload = @as(u32, @intCast(field_index)), |
| 6690 | } }, | 6685 | } }, |
| 6691 | }); | 6686 | }); |
| ... | @@ -6938,7 +6933,7 @@ const CallArgsInfo = union(enum) { | ... | @@ -6938,7 +6933,7 @@ const CallArgsInfo = union(enum) { |
| 6938 | // TODO set comptime_reason | 6933 | // TODO set comptime_reason |
| 6939 | } | 6934 | } |
| 6940 | // Give the arg its result type | 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 | // Resolve the arg! | 6937 | // Resolve the arg! |
| 6943 | const uncoerced_arg = try sema.resolveBody(block, arg_body, zir_call.call_inst); | 6938 | const uncoerced_arg = try sema.resolveBody(block, arg_body, zir_call.call_inst); |
| 6944 | | 6939 | |
| ... | @@ -7398,9 +7393,7 @@ fn analyzeCall( | ... | @@ -7398,9 +7393,7 @@ fn analyzeCall( |
| 7398 | .result = .none, | 7393 | .result = .none, |
| 7399 | } })) |memoized_call_index| { | 7394 | } })) |memoized_call_index| { |
| 7400 | const memoized_call = mod.intern_pool.indexToKey(memoized_call_index).memoized_call; | 7395 | const memoized_call = mod.intern_pool.indexToKey(memoized_call_index).memoized_call; |
| 7401 | break :res2 try sema.addConstant( | 7396 | break :res2 Air.internedToRef(memoized_call.result); |
| 7402 | memoized_call.result.toValue(), | | |
| 7403 | ); | | |
| 7404 | } | 7397 | } |
| 7405 | } | 7398 | } |
| 7406 | | 7399 | |
| ... | @@ -8057,7 +8050,7 @@ fn emitDbgInline( | ... | @@ -8057,7 +8050,7 @@ fn emitDbgInline( |
| 8057 | _ = try block.addInst(.{ | 8050 | _ = try block.addInst(.{ |
| 8058 | .tag = tag, | 8051 | .tag = tag, |
| 8059 | .data = .{ .ty_fn = .{ | 8052 | .data = .{ .ty_fn = .{ |
| 8060 | .ty = try sema.addType(new_func_ty), | 8053 | .ty = Air.internedToRef(new_func_ty.toIntern()), |
| 8061 | .func = new_func, | 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,7 +8060,7 @@ fn zirIntType(sema: *Sema, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 8067 | const mod = sema.mod; | 8060 | const mod = sema.mod; |
| 8068 | const int_type = sema.code.instructions.items(.data)[inst].int_type; | 8061 | const int_type = sema.code.instructions.items(.data)[inst].int_type; |
| 8069 | const ty = try mod.intType(int_type.signedness, int_type.bit_count); | 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 | fn zirOptionalType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +8078,7 @@ fn zirOptionalType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 8085 | } | 8078 | } |
| 8086 | const opt_type = try mod.optionalType(child_type.toIntern()); | 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 | fn zirElemTypeIndex(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,10 +8096,10 @@ fn zirElemTypeIndex(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 8103 | assert(indexable_ty.isIndexable(mod)); // validated by a previous instruction | 8096 | assert(indexable_ty.isIndexable(mod)); // validated by a previous instruction |
| 8104 | if (indexable_ty.zigTypeTag(mod) == .Struct) { | 8097 | if (indexable_ty.zigTypeTag(mod) == .Struct) { |
| 8105 | const elem_type = indexable_ty.structFieldType(@intFromEnum(bin.rhs), mod); | 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 | } else { | 8100 | } else { |
| 8108 | const elem_type = indexable_ty.elemType2(mod); | 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,7 +8108,7 @@ fn zirElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 8115 | const un_node = sema.code.instructions.items(.data)[inst].un_node; | 8108 | const un_node = sema.code.instructions.items(.data)[inst].un_node; |
| 8116 | const ptr_ty = try sema.resolveType(block, .unneeded, un_node.operand); | 8109 | const ptr_ty = try sema.resolveType(block, .unneeded, un_node.operand); |
| 8117 | assert(ptr_ty.zigTypeTag(mod) == .Pointer); // validated by a previous instruction | 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 | fn zirVectorElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +8125,7 @@ fn zirVectorElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 8132 | if (!vec_ty.isVector(mod)) { | 8125 | if (!vec_ty.isVector(mod)) { |
| 8133 | return sema.fail(block, un_node.src(), "expected vector type, found '{}'", .{vec_ty.fmt(mod)}); | 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 | fn zirVectorType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +8141,7 @@ fn zirVectorType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 8148 | .len = len, | 8141 | .len = len, |
| 8149 | .child = elem_type.toIntern(), | 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 | fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +8160,7 @@ fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 8167 | .child = elem_type.toIntern(), | 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 | fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +8184,7 @@ fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil |
| 8191 | .child = elem_type.toIntern(), | 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 | fn validateArrayElemType(sema: *Sema, block: *Block, elem_type: Type, elem_src: LazySrcLoc) !void { | 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,7 +8209,7 @@ fn zirAnyframeType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 8216 | const return_type = try sema.resolveType(block, operand_src, inst_data.operand); | 8209 | const return_type = try sema.resolveType(block, operand_src, inst_data.operand); |
| 8217 | const anyframe_type = try mod.anyframeType(return_type); | 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 | fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +8231,7 @@ fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 8238 | } | 8231 | } |
| 8239 | try sema.validateErrorUnionPayloadType(block, payload, rhs_src); | 8232 | try sema.validateErrorUnionPayloadType(block, payload, rhs_src); |
| 8240 | const err_union_ty = try mod.errorUnionType(error_set, payload); | 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 | fn validateErrorUnionPayloadType(sema: *Sema, block: *Block, payload_ty: Type, payload_src: LazySrcLoc) !void { | 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,10 +8255,10 @@ fn zirErrorValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 8262 | _ = try mod.getErrorValue(name); | 8255 | _ = try mod.getErrorValue(name); |
| 8263 | // Create an error set type with only this error value, and return the value. | 8256 | // Create an error set type with only this error value, and return the value. |
| 8264 | const error_set_type = try mod.singleErrorSetType(name); | 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 | .ty = error_set_type.toIntern(), | 8259 | .ty = error_set_type.toIntern(), |
| 8267 | .name = name, | 8260 | .name = name, |
| 8268 | } })).toValue()); | 8261 | } }))); |
| 8269 | } | 8262 | } |
| 8270 | | 8263 | |
| 8271 | fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref { | 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,13 +8275,13 @@ fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD |
| 8282 | | 8275 | |
| 8283 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 8276 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 8284 | if (val.isUndef(mod)) { | 8277 | if (val.isUndef(mod)) { |
| 8285 | return sema.addConstUndef(Type.err_int); | 8278 | return mod.undefRef(Type.err_int); |
| 8286 | } | 8279 | } |
| 8287 | const err_name = ip.indexToKey(val.toIntern()).err.name; | 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 | Type.err_int, | 8282 | Type.err_int, |
| 8290 | try mod.getErrorValue(err_name), | 8283 | try mod.getErrorValue(err_name), |
| 8291 | )); | 8284 | )).toIntern()); |
| 8292 | } | 8285 | } |
| 8293 | | 8286 | |
| 8294 | const op_ty = sema.typeOf(uncasted_operand); | 8287 | const op_ty = sema.typeOf(uncasted_operand); |
| ... | @@ -8297,10 +8290,10 @@ fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD | ... | @@ -8297,10 +8290,10 @@ fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD |
| 8297 | else => |err_set_ty_index| { | 8290 | else => |err_set_ty_index| { |
| 8298 | const names = ip.indexToKey(err_set_ty_index).error_set_type.names; | 8291 | const names = ip.indexToKey(err_set_ty_index).error_set_type.names; |
| 8299 | switch (names.len) { | 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 | 1 => { | 8294 | 1 => { |
| 8302 | const int: Module.ErrorInt = @intCast(mod.global_error_set.getIndex(names.get(ip)[0]).?); | 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 | else => {}, | 8298 | else => {}, |
| 8306 | } | 8299 | } |
| ... | @@ -8326,15 +8319,15 @@ fn zirErrorFromInt(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD | ... | @@ -8326,15 +8319,15 @@ fn zirErrorFromInt(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstD |
| 8326 | const int = try sema.usizeCast(block, operand_src, value.toUnsignedInt(mod)); | 8319 | const int = try sema.usizeCast(block, operand_src, value.toUnsignedInt(mod)); |
| 8327 | if (int > mod.global_error_set.count() or int == 0) | 8320 | if (int > mod.global_error_set.count() or int == 0) |
| 8328 | return sema.fail(block, operand_src, "integer value '{d}' represents no error", .{int}); | 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 | .ty = .anyerror_type, | 8323 | .ty = .anyerror_type, |
| 8331 | .name = mod.global_error_set.keys()[int], | 8324 | .name = mod.global_error_set.keys()[int], |
| 8332 | } })).toValue()); | 8325 | } }))); |
| 8333 | } | 8326 | } |
| 8334 | try sema.requireRuntimeBlock(block, src, operand_src); | 8327 | try sema.requireRuntimeBlock(block, src, operand_src); |
| 8335 | if (block.wantSafety()) { | 8328 | if (block.wantSafety()) { |
| 8336 | const is_lt_len = try block.addUnOp(.cmp_lt_errors_len, operand); | 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 | const is_non_zero = try block.addBinOp(.cmp_neq, operand, zero_val); | 8331 | const is_non_zero = try block.addBinOp(.cmp_neq, operand, zero_val); |
| 8339 | const ok = try block.addBinOp(.bit_and, is_lt_len, is_non_zero); | 8332 | const ok = try block.addBinOp(.bit_and, is_lt_len, is_non_zero); |
| 8340 | try sema.addSafetyCheck(block, src, ok, .invalid_error_code); | 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,9 +8404,9 @@ fn zirEnumLiteral(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8411 | const mod = sema.mod; | 8404 | const mod = sema.mod; |
| 8412 | const inst_data = sema.code.instructions.items(.data)[inst].str_tok; | 8405 | const inst_data = sema.code.instructions.items(.data)[inst].str_tok; |
| 8413 | const name = inst_data.get(sema.code); | 8406 | const name = inst_data.get(sema.code); |
| 8414 | return sema.addConstant((try mod.intern(.{ | 8407 | return Air.internedToRef((try mod.intern(.{ |
| 8415 | .enum_literal = try mod.intern_pool.getOrPutString(sema.gpa, name), | 8408 | .enum_literal = try mod.intern_pool.getOrPutString(sema.gpa, name), |
| 8416 | })).toValue()); | 8409 | }))); |
| 8417 | } | 8410 | } |
| 8418 | | 8411 | |
| 8419 | fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,12 +8442,12 @@ fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8449 | const int_tag_ty = enum_tag_ty.intTagType(mod); | 8442 | const int_tag_ty = enum_tag_ty.intTagType(mod); |
| 8450 | | 8443 | |
| 8451 | if (try sema.typeHasOnePossibleValue(enum_tag_ty)) |opv| { | 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 | if (try sema.resolveMaybeUndefVal(enum_tag)) |enum_tag_val| { | 8448 | if (try sema.resolveMaybeUndefVal(enum_tag)) |enum_tag_val| { |
| 8456 | const val = try enum_tag_val.intFromEnum(enum_tag_ty, mod); | 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 | try sema.requireRuntimeBlock(block, src, operand_src); | 8453 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | @@ -8479,7 +8472,7 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError | ... | @@ -8479,7 +8472,7 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8479 | if (dest_ty.isNonexhaustiveEnum(mod)) { | 8472 | if (dest_ty.isNonexhaustiveEnum(mod)) { |
| 8480 | const int_tag_ty = dest_ty.intTagType(mod); | 8473 | const int_tag_ty = dest_ty.intTagType(mod); |
| 8481 | if (try sema.intFitsInType(int_val, int_tag_ty, null)) { | 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 | const msg = msg: { | 8477 | const msg = msg: { |
| 8485 | const msg = try sema.errMsg( | 8478 | const msg = try sema.errMsg( |
| ... | @@ -8511,11 +8504,11 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError | ... | @@ -8511,11 +8504,11 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8511 | }; | 8504 | }; |
| 8512 | return sema.failWithOwnedErrorMsg(msg); | 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 | if (try sema.typeHasOnePossibleValue(dest_ty)) |opv| { | 8510 | if (try sema.typeHasOnePossibleValue(dest_ty)) |opv| { |
| 8518 | const result = try sema.addConstant(opv); | 8511 | const result = Air.internedToRef(opv.toIntern()); |
| 8519 | // The operand is runtime-known but the result is comptime-known. In | 8512 | // The operand is runtime-known but the result is comptime-known. In |
| 8520 | // this case we still need a safety check. | 8513 | // this case we still need a safety check. |
| 8521 | // TODO add a safety check here. we can't use is_named_enum_value - | 8514 | // TODO add a safety check here. we can't use is_named_enum_value - |
| ... | @@ -8585,20 +8578,20 @@ fn analyzeOptionalPayloadPtr( | ... | @@ -8585,20 +8578,20 @@ fn analyzeOptionalPayloadPtr( |
| 8585 | // we need to emit a runtime instruction to do it. | 8578 | // we need to emit a runtime instruction to do it. |
| 8586 | _ = try block.addTyOp(.optional_payload_ptr_set, child_pointer, optional_ptr); | 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 | .ty = child_pointer.toIntern(), | 8582 | .ty = child_pointer.toIntern(), |
| 8590 | .addr = .{ .opt_payload = ptr_val.toIntern() }, | 8583 | .addr = .{ .opt_payload = ptr_val.toIntern() }, |
| 8591 | } })).toValue()); | 8584 | } }))); |
| 8592 | } | 8585 | } |
| 8593 | if (try sema.pointerDeref(block, src, ptr_val, optional_ptr_ty)) |val| { | 8586 | if (try sema.pointerDeref(block, src, ptr_val, optional_ptr_ty)) |val| { |
| 8594 | if (val.isNull(mod)) { | 8587 | if (val.isNull(mod)) { |
| 8595 | return sema.fail(block, src, "unable to unwrap null", .{}); | 8588 | return sema.fail(block, src, "unable to unwrap null", .{}); |
| 8596 | } | 8589 | } |
| 8597 | // The same Value represents the pointer to the optional and the payload. | 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 | .ty = child_pointer.toIntern(), | 8592 | .ty = child_pointer.toIntern(), |
| 8600 | .addr = .{ .opt_payload = ptr_val.toIntern() }, | 8593 | .addr = .{ .opt_payload = ptr_val.toIntern() }, |
| 8601 | } })).toValue()); | 8594 | } }))); |
| 8602 | } | 8595 | } |
| 8603 | } | 8596 | } |
| 8604 | | 8597 | |
| ... | @@ -8654,7 +8647,7 @@ fn zirOptionalPayload( | ... | @@ -8654,7 +8647,7 @@ fn zirOptionalPayload( |
| 8654 | | 8647 | |
| 8655 | if (try sema.resolveDefinedValue(block, src, operand)) |val| { | 8648 | if (try sema.resolveDefinedValue(block, src, operand)) |val| { |
| 8656 | return if (val.optionalValue(mod)) |payload| | 8649 | return if (val.optionalValue(mod)) |payload| |
| 8657 | sema.addConstant(payload) | 8650 | Air.internedToRef(payload.toIntern()) |
| 8658 | else | 8651 | else |
| 8659 | sema.fail(block, src, "unable to unwrap null", .{}); | 8652 | sema.fail(block, src, "unable to unwrap null", .{}); |
| 8660 | } | 8653 | } |
| ... | @@ -8705,9 +8698,7 @@ fn analyzeErrUnionPayload( | ... | @@ -8705,9 +8698,7 @@ fn analyzeErrUnionPayload( |
| 8705 | if (val.getErrorName(mod).unwrap()) |name| { | 8698 | if (val.getErrorName(mod).unwrap()) |name| { |
| 8706 | return sema.fail(block, src, "caught unexpected error '{}'", .{name.fmt(&mod.intern_pool)}); | 8699 | return sema.fail(block, src, "caught unexpected error '{}'", .{name.fmt(&mod.intern_pool)}); |
| 8707 | } | 8700 | } |
| 8708 | return sema.addConstant( | 8701 | return Air.internedToRef(mod.intern_pool.indexToKey(val.toIntern()).error_union.val.payload); |
| 8709 | mod.intern_pool.indexToKey(val.toIntern()).error_union.val.payload.toValue(), | | |
| 8710 | ); | | |
| 8711 | } | 8702 | } |
| 8712 | | 8703 | |
| 8713 | try sema.requireRuntimeBlock(block, src, null); | 8704 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -8775,19 +8766,19 @@ fn analyzeErrUnionPayloadPtr( | ... | @@ -8775,19 +8766,19 @@ fn analyzeErrUnionPayloadPtr( |
| 8775 | try sema.requireRuntimeBlock(block, src, null); | 8766 | try sema.requireRuntimeBlock(block, src, null); |
| 8776 | _ = try block.addTyOp(.errunion_payload_ptr_set, operand_pointer_ty, operand); | 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 | .ty = operand_pointer_ty.toIntern(), | 8770 | .ty = operand_pointer_ty.toIntern(), |
| 8780 | .addr = .{ .eu_payload = ptr_val.toIntern() }, | 8771 | .addr = .{ .eu_payload = ptr_val.toIntern() }, |
| 8781 | } })).toValue()); | 8772 | } }))); |
| 8782 | } | 8773 | } |
| 8783 | if (try sema.pointerDeref(block, src, ptr_val, operand_ty)) |val| { | 8774 | if (try sema.pointerDeref(block, src, ptr_val, operand_ty)) |val| { |
| 8784 | if (val.getErrorName(mod).unwrap()) |name| { | 8775 | if (val.getErrorName(mod).unwrap()) |name| { |
| 8785 | return sema.fail(block, src, "caught unexpected error '{}'", .{name.fmt(&mod.intern_pool)}); | 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 | .ty = operand_pointer_ty.toIntern(), | 8779 | .ty = operand_pointer_ty.toIntern(), |
| 8789 | .addr = .{ .eu_payload = ptr_val.toIntern() }, | 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,10 +8821,10 @@ fn analyzeErrUnionCode(sema: *Sema, block: *Block, src: LazySrcLoc, operand: Air |
| 8830 | const result_ty = operand_ty.errorUnionSet(mod); | 8821 | const result_ty = operand_ty.errorUnionSet(mod); |
| 8831 | | 8822 | |
| 8832 | if (try sema.resolveDefinedValue(block, src, operand)) |val| { | 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 | .ty = result_ty.toIntern(), | 8825 | .ty = result_ty.toIntern(), |
| 8835 | .name = mod.intern_pool.indexToKey(val.toIntern()).error_union.val.err_name, | 8826 | .name = mod.intern_pool.indexToKey(val.toIntern()).error_union.val.err_name, |
| 8836 | } })).toValue()); | 8827 | } }))); |
| 8837 | } | 8828 | } |
| 8838 | | 8829 | |
| 8839 | try sema.requireRuntimeBlock(block, src, null); | 8830 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -8863,7 +8854,7 @@ fn zirErrUnionCodePtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE | ... | @@ -8863,7 +8854,7 @@ fn zirErrUnionCodePtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 8863 | if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { | 8854 | if (try sema.resolveDefinedValue(block, src, operand)) |pointer_val| { |
| 8864 | if (try sema.pointerDeref(block, src, pointer_val, operand_ty)) |val| { | 8855 | if (try sema.pointerDeref(block, src, pointer_val, operand_ty)) |val| { |
| 8865 | assert(val.getErrorName(mod) != .none); | 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,9 +9761,10 @@ fn zirIntFromPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 9770 | return sema.fail(block, ptr_src, "expected pointer, found '{}'", .{ptr_ty.fmt(mod)}); | 9761 | return sema.fail(block, ptr_src, "expected pointer, found '{}'", .{ptr_ty.fmt(mod)}); |
| 9771 | } | 9762 | } |
| 9772 | if (try sema.resolveMaybeUndefValIntable(ptr)) |ptr_val| { | 9763 | if (try sema.resolveMaybeUndefValIntable(ptr)) |ptr_val| { |
| 9773 | return sema.addConstant( | 9764 | return Air.internedToRef((try mod.intValue( |
| 9774 | try mod.intValue(Type.usize, (try ptr_val.getUnsignedIntAdvanced(mod, sema)).?), | 9765 | Type.usize, |
| 9775 | ); | 9766 | (try ptr_val.getUnsignedIntAdvanced(mod, sema)).?, |
| | 9767 | )).toIntern()); |
| 9776 | } | 9768 | } |
| 9777 | try sema.requireRuntimeBlock(block, inst_data.src(), ptr_src); | 9769 | try sema.requireRuntimeBlock(block, inst_data.src(), ptr_src); |
| 9778 | return block.addUnOp(.int_from_ptr, ptr); | 9770 | return block.addUnOp(.int_from_ptr, ptr); |
| ... | @@ -9881,7 +9873,7 @@ fn intCast( | ... | @@ -9881,7 +9873,7 @@ fn intCast( |
| 9881 | if (wanted_bits == 0) { | 9873 | if (wanted_bits == 0) { |
| 9882 | const ok = if (is_vector) ok: { | 9874 | const ok = if (is_vector) ok: { |
| 9883 | const zeros = try sema.splat(operand_ty, try mod.intValue(operand_scalar_ty, 0)); | 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 | const is_in_range = try block.addCmpVector(operand, zero_inst, .eq); | 9877 | const is_in_range = try block.addCmpVector(operand, zero_inst, .eq); |
| 9886 | const all_in_range = try block.addInst(.{ | 9878 | const all_in_range = try block.addInst(.{ |
| 9887 | .tag = .reduce, | 9879 | .tag = .reduce, |
| ... | @@ -9889,7 +9881,7 @@ fn intCast( | ... | @@ -9889,7 +9881,7 @@ fn intCast( |
| 9889 | }); | 9881 | }); |
| 9890 | break :ok all_in_range; | 9882 | break :ok all_in_range; |
| 9891 | } else ok: { | 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 | const is_in_range = try block.addBinOp(.cmp_lte, operand, zero_inst); | 9885 | const is_in_range = try block.addBinOp(.cmp_lte, operand, zero_inst); |
| 9894 | break :ok is_in_range; | 9886 | break :ok is_in_range; |
| 9895 | }; | 9887 | }; |
| ... | @@ -9897,7 +9889,7 @@ fn intCast( | ... | @@ -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 | try sema.requireRuntimeBlock(block, src, operand_src); | 9895 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | @@ -9914,7 +9906,7 @@ fn intCast( | ... | @@ -9914,7 +9906,7 @@ fn intCast( |
| 9914 | if (wanted_value_bits < actual_value_bits) { | 9906 | if (wanted_value_bits < actual_value_bits) { |
| 9915 | const dest_max_val_scalar = try dest_scalar_ty.maxIntScalar(mod, operand_scalar_ty); | 9907 | const dest_max_val_scalar = try dest_scalar_ty.maxIntScalar(mod, operand_scalar_ty); |
| 9916 | const dest_max_val = try sema.splat(operand_ty, dest_max_val_scalar); | 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 | const diff = try block.addBinOp(.sub_wrap, dest_max, operand); | 9910 | const diff = try block.addBinOp(.sub_wrap, dest_max, operand); |
| 9919 | | 9911 | |
| 9920 | if (actual_info.signedness == .signed) { | 9912 | if (actual_info.signedness == .signed) { |
| ... | @@ -9930,7 +9922,7 @@ fn intCast( | ... | @@ -9930,7 +9922,7 @@ fn intCast( |
| 9930 | const range_minus_one = try dest_max_val.shl(one, unsigned_operand_ty, sema.arena, mod); | 9922 | const range_minus_one = try dest_max_val.shl(one, unsigned_operand_ty, sema.arena, mod); |
| 9931 | break :range_val try sema.intAdd(range_minus_one, one, unsigned_operand_ty, undefined); | 9923 | break :range_val try sema.intAdd(range_minus_one, one, unsigned_operand_ty, undefined); |
| 9932 | } else try mod.getCoerced(dest_max_val, unsigned_operand_ty); | 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 | const ok = if (is_vector) ok: { | 9927 | const ok = if (is_vector) ok: { |
| 9936 | const is_in_range = try block.addCmpVector(diff_unsigned, dest_range, .lte); | 9928 | const is_in_range = try block.addCmpVector(diff_unsigned, dest_range, .lte); |
| ... | @@ -9971,7 +9963,7 @@ fn intCast( | ... | @@ -9971,7 +9963,7 @@ fn intCast( |
| 9971 | const ok = if (is_vector) ok: { | 9963 | const ok = if (is_vector) ok: { |
| 9972 | const scalar_zero = try mod.intValue(operand_scalar_ty, 0); | 9964 | const scalar_zero = try mod.intValue(operand_scalar_ty, 0); |
| 9973 | const zero_val = try sema.splat(operand_ty, scalar_zero); | 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 | const is_in_range = try block.addCmpVector(operand, zero_inst, .gte); | 9967 | const is_in_range = try block.addCmpVector(operand, zero_inst, .gte); |
| 9976 | const all_in_range = try block.addInst(.{ | 9968 | const all_in_range = try block.addInst(.{ |
| 9977 | .tag = if (block.float_mode == .Optimized) .reduce_optimized else .reduce, | 9969 | .tag = if (block.float_mode == .Optimized) .reduce_optimized else .reduce, |
| ... | @@ -9982,7 +9974,7 @@ fn intCast( | ... | @@ -9982,7 +9974,7 @@ fn intCast( |
| 9982 | }); | 9974 | }); |
| 9983 | break :ok all_in_range; | 9975 | break :ok all_in_range; |
| 9984 | } else ok: { | 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 | const is_in_range = try block.addBinOp(.cmp_gte, operand, zero_inst); | 9978 | const is_in_range = try block.addBinOp(.cmp_gte, operand, zero_inst); |
| 9987 | break :ok is_in_range; | 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,7 +10164,7 @@ fn zirFloatCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 10172 | } | 10164 | } |
| 10173 | | 10165 | |
| 10174 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { | 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 | if (dest_is_comptime_float) { | 10169 | if (dest_is_comptime_float) { |
| 10178 | return sema.fail(block, operand_src, "unable to cast runtime value to 'comptime_float'", .{}); | 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,7 +10252,7 @@ fn zirElemPtrImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 10260 | const src = inst_data.src(); | 10252 | const src = inst_data.src(); |
| 10261 | const extra = sema.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data; | 10253 | const extra = sema.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data; |
| 10262 | const array_ptr = try sema.resolveInst(extra.ptr); | 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 | return sema.elemPtr(block, src, array_ptr, elem_index, src, true, true); | 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,21 +10533,19 @@ const SwitchProngAnalysis = struct { |
| 10541 | }, | 10533 | }, |
| 10542 | }); | 10534 | }); |
| 10543 | if (try sema.resolveDefinedValue(block, sema.src, spa.operand_ptr)) |union_ptr| { | 10535 | if (try sema.resolveDefinedValue(block, sema.src, spa.operand_ptr)) |union_ptr| { |
| 10544 | return sema.addConstant( | 10536 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 10545 | (try mod.intern(.{ .ptr = .{ | 10537 | .ty = ptr_field_ty.toIntern(), |
| 10546 | .ty = ptr_field_ty.toIntern(), | 10538 | .addr = .{ .field = .{ |
| 10547 | .addr = .{ .field = .{ | 10539 | .base = union_ptr.toIntern(), |
| 10548 | .base = union_ptr.toIntern(), | 10540 | .index = field_index, |
| 10549 | .index = field_index, | 10541 | } }, |
| 10550 | } }, | 10542 | } }))); |
| 10551 | } })).toValue(), | | |
| 10552 | ); | | |
| 10553 | } | 10543 | } |
| 10554 | return block.addStructFieldPtr(spa.operand_ptr, field_index, ptr_field_ty); | 10544 | return block.addStructFieldPtr(spa.operand_ptr, field_index, ptr_field_ty); |
| 10555 | } else { | 10545 | } else { |
| 10556 | if (try sema.resolveDefinedValue(block, sema.src, spa.operand)) |union_val| { | 10546 | if (try sema.resolveDefinedValue(block, sema.src, spa.operand)) |union_val| { |
| 10557 | const tag_and_val = mod.intern_pool.indexToKey(union_val.toIntern()).un; | 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 | return block.addStructFieldVal(spa.operand, field_index, field_ty); | 10550 | return block.addStructFieldVal(spa.operand, field_index, field_ty); |
| 10561 | } | 10551 | } |
| ... | @@ -10607,7 +10597,7 @@ const SwitchProngAnalysis = struct { | ... | @@ -10607,7 +10597,7 @@ const SwitchProngAnalysis = struct { |
| 10607 | // We need values to run PTR on, so make a bunch of undef constants. | 10597 | // We need values to run PTR on, so make a bunch of undef constants. |
| 10608 | const dummy_captures = try sema.arena.alloc(Air.Inst.Ref, case_vals.len); | 10598 | const dummy_captures = try sema.arena.alloc(Air.Inst.Ref, case_vals.len); |
| 10609 | for (dummy_captures, field_tys) |*dummy, field_ty| { | 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 | const case_srcs = try sema.arena.alloc(?LazySrcLoc, case_vals.len); | 10603 | const case_srcs = try sema.arena.alloc(?LazySrcLoc, case_vals.len); |
| ... | @@ -10685,16 +10675,14 @@ const SwitchProngAnalysis = struct { | ... | @@ -10685,16 +10675,14 @@ const SwitchProngAnalysis = struct { |
| 10685 | } | 10675 | } |
| 10686 | | 10676 | |
| 10687 | if (try sema.resolveDefinedValue(block, operand_src, spa.operand_ptr)) |op_ptr_val| { | 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); | 10678 | if (op_ptr_val.isUndef(mod)) return mod.undefRef(capture_ptr_ty); |
| 10689 | return sema.addConstant( | 10679 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 10690 | (try mod.intern(.{ .ptr = .{ | 10680 | .ty = capture_ptr_ty.toIntern(), |
| 10691 | .ty = capture_ptr_ty.toIntern(), | 10681 | .addr = .{ .field = .{ |
| 10692 | .addr = .{ .field = .{ | 10682 | .base = op_ptr_val.toIntern(), |
| 10693 | .base = op_ptr_val.toIntern(), | 10683 | .index = first_field_index, |
| 10694 | .index = first_field_index, | 10684 | } }, |
| 10695 | } }, | 10685 | } }))); |
| 10696 | } })).toValue(), | | |
| 10697 | ); | | |
| 10698 | } | 10686 | } |
| 10699 | | 10687 | |
| 10700 | try sema.requireRuntimeBlock(block, operand_src, null); | 10688 | try sema.requireRuntimeBlock(block, operand_src, null); |
| ... | @@ -10702,10 +10690,10 @@ const SwitchProngAnalysis = struct { | ... | @@ -10702,10 +10690,10 @@ const SwitchProngAnalysis = struct { |
| 10702 | } | 10690 | } |
| 10703 | | 10691 | |
| 10704 | if (try sema.resolveDefinedValue(block, operand_src, spa.operand)) |operand_val| { | 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 | const union_val = mod.intern_pool.indexToKey(operand_val.toIntern()).un; | 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); | 10695 | if (union_val.tag.toValue().isUndef(mod)) return mod.undefRef(capture_ty); |
| 10708 | const uncoerced = try sema.addConstant(union_val.val.toValue()); | 10696 | const uncoerced = Air.internedToRef(union_val.val); |
| 10709 | return sema.coerce(block, capture_ty, uncoerced, operand_src); | 10697 | return sema.coerce(block, capture_ty, uncoerced, operand_src); |
| 10710 | } | 10698 | } |
| 10711 | | 10699 | |
| ... | @@ -10751,7 +10739,7 @@ const SwitchProngAnalysis = struct { | ... | @@ -10751,7 +10739,7 @@ const SwitchProngAnalysis = struct { |
| 10751 | .tag = .block, | 10739 | .tag = .block, |
| 10752 | .data = .{ | 10740 | .data = .{ |
| 10753 | .ty_pl = .{ | 10741 | .ty_pl = .{ |
| 10754 | .ty = try sema.addType(capture_ty), | 10742 | .ty = Air.internedToRef(capture_ty.toIntern()), |
| 10755 | .payload = undefined, // updated below | 10743 | .payload = undefined, // updated below |
| 10756 | }, | 10744 | }, |
| 10757 | }, | 10745 | }, |
| ... | @@ -10896,7 +10884,7 @@ fn switchCond( | ... | @@ -10896,7 +10884,7 @@ fn switchCond( |
| 10896 | return sema.fail(block, src, "switch on type '{}'", .{operand_ty.fmt(mod)}); | 10884 | return sema.fail(block, src, "switch on type '{}'", .{operand_ty.fmt(mod)}); |
| 10897 | } | 10885 | } |
| 10898 | if ((try sema.typeHasOnePossibleValue(operand_ty))) |opv| { | 10886 | if ((try sema.typeHasOnePossibleValue(operand_ty))) |opv| { |
| 10899 | return sema.addConstant(opv); | 10887 | return Air.internedToRef(opv.toIntern()); |
| 10900 | } | 10888 | } |
| 10901 | return operand; | 10889 | return operand; |
| 10902 | }, | 10890 | }, |
| ... | @@ -11876,7 +11864,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r | ... | @@ -11876,7 +11864,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 11876 | }) { | 11864 | }) { |
| 11877 | cases_len += 1; | 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 | case_block.instructions.shrinkRetainingCapacity(0); | 11869 | case_block.instructions.shrinkRetainingCapacity(0); |
| 11882 | case_block.wip_capture_scope = child_block.wip_capture_scope; | 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,7 +12112,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 12124 | cases_len += 1; | 12112 | cases_len += 1; |
| 12125 | | 12113 | |
| 12126 | const item_val = try mod.enumValueFieldIndex(operand_ty, @as(u32, @intCast(i))); | 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 | case_block.instructions.shrinkRetainingCapacity(0); | 12117 | case_block.instructions.shrinkRetainingCapacity(0); |
| 12130 | case_block.wip_capture_scope = child_block.wip_capture_scope; | 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,7 +12162,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 12174 | .ty = operand_ty.toIntern(), | 12162 | .ty = operand_ty.toIntern(), |
| 12175 | .name = error_name, | 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 | case_block.instructions.shrinkRetainingCapacity(0); | 12167 | case_block.instructions.shrinkRetainingCapacity(0); |
| 12180 | case_block.wip_capture_scope = child_block.wip_capture_scope; | 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,7 +12193,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index, operand_is_r |
| 12205 | while (try it.next()) |cur| { | 12193 | while (try it.next()) |cur| { |
| 12206 | cases_len += 1; | 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 | case_block.instructions.shrinkRetainingCapacity(0); | 12198 | case_block.instructions.shrinkRetainingCapacity(0); |
| 12211 | case_block.wip_capture_scope = child_block.wip_capture_scope; | 12199 | case_block.wip_capture_scope = child_block.wip_capture_scope; |
| ... | @@ -12483,7 +12471,7 @@ fn resolveSwitchItemVal( | ... | @@ -12483,7 +12471,7 @@ fn resolveSwitchItemVal( |
| 12483 | | 12471 | |
| 12484 | const val = try sema.resolveLazyValue(maybe_lazy); | 12472 | const val = try sema.resolveLazyValue(maybe_lazy); |
| 12485 | const new_item = if (val.toIntern() != maybe_lazy.toIntern()) blk: { | 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 | } else item; | 12475 | } else item; |
| 12488 | | 12476 | |
| 12489 | return .{ .ref = new_item, .val = val.toIntern() }; | 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,7 +12881,7 @@ fn zirImport(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 12893 | const file_root_decl_index = result.file.root_decl.unwrap().?; | 12881 | const file_root_decl_index = result.file.root_decl.unwrap().?; |
| 12894 | const file_root_decl = mod.declPtr(file_root_decl_index); | 12882 | const file_root_decl = mod.declPtr(file_root_decl_index); |
| 12895 | try mod.declareDeclDependency(sema.owner_decl_index, file_root_decl_index); | 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 | fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,10 +12940,10 @@ fn zirRetErrValueCode(sema: *Sema, inst: Zir.Inst.Index) CompileError!Air.Inst.R |
| 12952 | const name = try mod.intern_pool.getOrPutString(sema.gpa, inst_data.get(sema.code)); | 12940 | const name = try mod.intern_pool.getOrPutString(sema.gpa, inst_data.get(sema.code)); |
| 12953 | _ = try mod.getErrorValue(name); | 12941 | _ = try mod.getErrorValue(name); |
| 12954 | const error_set_type = try mod.singleErrorSetType(name); | 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 | .ty = error_set_type.toIntern(), | 12944 | .ty = error_set_type.toIntern(), |
| 12957 | .name = name, | 12945 | .name = name, |
| 12958 | } })).toValue()); | 12946 | } }))); |
| 12959 | } | 12947 | } |
| 12960 | | 12948 | |
| 12961 | fn zirShl( | 12949 | fn zirShl( |
| ... | @@ -12991,7 +12979,7 @@ fn zirShl( | ... | @@ -12991,7 +12979,7 @@ fn zirShl( |
| 12991 | | 12979 | |
| 12992 | if (maybe_rhs_val) |rhs_val| { | 12980 | if (maybe_rhs_val) |rhs_val| { |
| 12993 | if (rhs_val.isUndef(mod)) { | 12981 | if (rhs_val.isUndef(mod)) { |
| 12994 | return sema.addConstUndef(sema.typeOf(lhs)); | 12982 | return mod.undefRef(sema.typeOf(lhs)); |
| 12995 | } | 12983 | } |
| 12996 | // If rhs is 0, return lhs without doing any calculations. | 12984 | // If rhs is 0, return lhs without doing any calculations. |
| 12997 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 12985 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | @@ -13037,7 +13025,7 @@ fn zirShl( | ... | @@ -13037,7 +13025,7 @@ fn zirShl( |
| 13037 | } | 13025 | } |
| 13038 | | 13026 | |
| 13039 | const runtime_src = if (maybe_lhs_val) |lhs_val| rs: { | 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 | const rhs_val = maybe_rhs_val orelse { | 13029 | const rhs_val = maybe_rhs_val orelse { |
| 13042 | if (scalar_ty.zigTypeTag(mod) == .ComptimeInt) { | 13030 | if (scalar_ty.zigTypeTag(mod) == .ComptimeInt) { |
| 13043 | return sema.fail(block, src, "LHS of shift must be a fixed-width integer type, or RHS must be comptime-known", .{}); | 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,7 +13058,7 @@ fn zirShl( |
| 13070 | else => unreachable, | 13058 | else => unreachable, |
| 13071 | }; | 13059 | }; |
| 13072 | | 13060 | |
| 13073 | return sema.addConstant(val); | 13061 | return Air.internedToRef(val.toIntern()); |
| 13074 | } else lhs_src; | 13062 | } else lhs_src; |
| 13075 | | 13063 | |
| 13076 | const new_rhs = if (air_tag == .shl_sat) rhs: { | 13064 | const new_rhs = if (air_tag == .shl_sat) rhs: { |
| ... | @@ -13078,9 +13066,7 @@ fn zirShl( | ... | @@ -13078,9 +13066,7 @@ fn zirShl( |
| 13078 | if (rhs_is_comptime_int or | 13066 | if (rhs_is_comptime_int or |
| 13079 | scalar_rhs_ty.intInfo(mod).bits > scalar_ty.intInfo(mod).bits) | 13067 | scalar_rhs_ty.intInfo(mod).bits > scalar_ty.intInfo(mod).bits) |
| 13080 | { | 13068 | { |
| 13081 | const max_int = try sema.addConstant( | 13069 | const max_int = Air.internedToRef((try lhs_ty.maxInt(mod, lhs_ty)).toIntern()); |
| 13082 | try lhs_ty.maxInt(mod, lhs_ty), | | |
| 13083 | ); | | |
| 13084 | const rhs_limited = try sema.analyzeMinMax(block, rhs_src, .min, &.{ rhs, max_int }, &.{ rhs_src, rhs_src }); | 13070 | const rhs_limited = try sema.analyzeMinMax(block, rhs_src, .min, &.{ rhs, max_int }, &.{ rhs_src, rhs_src }); |
| 13085 | break :rhs try sema.intCast(block, src, lhs_ty, rhs_src, rhs_limited, rhs_src, false); | 13071 | break :rhs try sema.intCast(block, src, lhs_ty, rhs_src, rhs_limited, rhs_src, false); |
| 13086 | } else { | 13072 | } else { |
| ... | @@ -13094,7 +13080,7 @@ fn zirShl( | ... | @@ -13094,7 +13080,7 @@ fn zirShl( |
| 13094 | if (!std.math.isPowerOfTwo(bit_count)) { | 13080 | if (!std.math.isPowerOfTwo(bit_count)) { |
| 13095 | const bit_count_val = try mod.intValue(scalar_rhs_ty, bit_count); | 13081 | const bit_count_val = try mod.intValue(scalar_rhs_ty, bit_count); |
| 13096 | const ok = if (rhs_ty.zigTypeTag(mod) == .Vector) ok: { | 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 | const lt = try block.addCmpVector(rhs, bit_count_inst, .lt); | 13084 | const lt = try block.addCmpVector(rhs, bit_count_inst, .lt); |
| 13099 | break :ok try block.addInst(.{ | 13085 | break :ok try block.addInst(.{ |
| 13100 | .tag = .reduce, | 13086 | .tag = .reduce, |
| ... | @@ -13104,7 +13090,7 @@ fn zirShl( | ... | @@ -13104,7 +13090,7 @@ fn zirShl( |
| 13104 | } }, | 13090 | } }, |
| 13105 | }); | 13091 | }); |
| 13106 | } else ok: { | 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 | break :ok try block.addBinOp(.cmp_lt, rhs, bit_count_inst); | 13094 | break :ok try block.addBinOp(.cmp_lt, rhs, bit_count_inst); |
| 13109 | }; | 13095 | }; |
| 13110 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); | 13096 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); |
| ... | @@ -13115,7 +13101,7 @@ fn zirShl( | ... | @@ -13115,7 +13101,7 @@ fn zirShl( |
| 13115 | const op_ov = try block.addInst(.{ | 13101 | const op_ov = try block.addInst(.{ |
| 13116 | .tag = .shl_with_overflow, | 13102 | .tag = .shl_with_overflow, |
| 13117 | .data = .{ .ty_pl = .{ | 13103 | .data = .{ .ty_pl = .{ |
| 13118 | .ty = try sema.addType(op_ov_tuple_ty), | 13104 | .ty = Air.internedToRef(op_ov_tuple_ty.toIntern()), |
| 13119 | .payload = try sema.addExtra(Air.Bin{ | 13105 | .payload = try sema.addExtra(Air.Bin{ |
| 13120 | .lhs = lhs, | 13106 | .lhs = lhs, |
| 13121 | .rhs = rhs, | 13107 | .rhs = rhs, |
| ... | @@ -13133,7 +13119,7 @@ fn zirShl( | ... | @@ -13133,7 +13119,7 @@ fn zirShl( |
| 13133 | }) | 13119 | }) |
| 13134 | else | 13120 | else |
| 13135 | ov_bit; | 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 | const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov); | 13123 | const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov); |
| 13138 | | 13124 | |
| 13139 | try sema.addSafetyCheck(block, src, no_ov, .shl_overflow); | 13125 | try sema.addSafetyCheck(block, src, no_ov, .shl_overflow); |
| ... | @@ -13171,7 +13157,7 @@ fn zirShr( | ... | @@ -13171,7 +13157,7 @@ fn zirShr( |
| 13171 | | 13157 | |
| 13172 | const runtime_src = if (maybe_rhs_val) |rhs_val| rs: { | 13158 | const runtime_src = if (maybe_rhs_val) |rhs_val| rs: { |
| 13173 | if (rhs_val.isUndef(mod)) { | 13159 | if (rhs_val.isUndef(mod)) { |
| 13174 | return sema.addConstUndef(lhs_ty); | 13160 | return mod.undefRef(lhs_ty); |
| 13175 | } | 13161 | } |
| 13176 | // If rhs is 0, return lhs without doing any calculations. | 13162 | // If rhs is 0, return lhs without doing any calculations. |
| 13177 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 13163 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | @@ -13216,7 +13202,7 @@ fn zirShr( | ... | @@ -13216,7 +13202,7 @@ fn zirShr( |
| 13216 | } | 13202 | } |
| 13217 | if (maybe_lhs_val) |lhs_val| { | 13203 | if (maybe_lhs_val) |lhs_val| { |
| 13218 | if (lhs_val.isUndef(mod)) { | 13204 | if (lhs_val.isUndef(mod)) { |
| 13219 | return sema.addConstUndef(lhs_ty); | 13205 | return mod.undefRef(lhs_ty); |
| 13220 | } | 13206 | } |
| 13221 | if (air_tag == .shr_exact) { | 13207 | if (air_tag == .shr_exact) { |
| 13222 | // Detect if any ones would be shifted out. | 13208 | // Detect if any ones would be shifted out. |
| ... | @@ -13226,7 +13212,7 @@ fn zirShr( | ... | @@ -13226,7 +13212,7 @@ fn zirShr( |
| 13226 | } | 13212 | } |
| 13227 | } | 13213 | } |
| 13228 | const val = try lhs_val.shr(rhs_val, lhs_ty, sema.arena, mod); | 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 | } else { | 13216 | } else { |
| 13231 | break :rs lhs_src; | 13217 | break :rs lhs_src; |
| 13232 | } | 13218 | } |
| ... | @@ -13244,7 +13230,7 @@ fn zirShr( | ... | @@ -13244,7 +13230,7 @@ fn zirShr( |
| 13244 | const bit_count_val = try mod.intValue(rhs_ty.scalarType(mod), bit_count); | 13230 | const bit_count_val = try mod.intValue(rhs_ty.scalarType(mod), bit_count); |
| 13245 | | 13231 | |
| 13246 | const ok = if (rhs_ty.zigTypeTag(mod) == .Vector) ok: { | 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 | const lt = try block.addCmpVector(rhs, bit_count_inst, .lt); | 13234 | const lt = try block.addCmpVector(rhs, bit_count_inst, .lt); |
| 13249 | break :ok try block.addInst(.{ | 13235 | break :ok try block.addInst(.{ |
| 13250 | .tag = .reduce, | 13236 | .tag = .reduce, |
| ... | @@ -13254,7 +13240,7 @@ fn zirShr( | ... | @@ -13254,7 +13240,7 @@ fn zirShr( |
| 13254 | } }, | 13240 | } }, |
| 13255 | }); | 13241 | }); |
| 13256 | } else ok: { | 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 | break :ok try block.addBinOp(.cmp_lt, rhs, bit_count_inst); | 13244 | break :ok try block.addBinOp(.cmp_lt, rhs, bit_count_inst); |
| 13259 | }; | 13245 | }; |
| 13260 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); | 13246 | try sema.addSafetyCheck(block, src, ok, .shift_rhs_too_big); |
| ... | @@ -13326,7 +13312,7 @@ fn zirBitwise( | ... | @@ -13326,7 +13312,7 @@ fn zirBitwise( |
| 13326 | .xor => try lhs_val.bitwiseXor(rhs_val, resolved_type, sema.arena, mod), | 13312 | .xor => try lhs_val.bitwiseXor(rhs_val, resolved_type, sema.arena, mod), |
| 13327 | else => unreachable, | 13313 | else => unreachable, |
| 13328 | }; | 13314 | }; |
| 13329 | return sema.addConstant(result_val); | 13315 | return Air.internedToRef(result_val.toIntern()); |
| 13330 | } else { | 13316 | } else { |
| 13331 | break :runtime rhs_src; | 13317 | break :runtime rhs_src; |
| 13332 | } | 13318 | } |
| ... | @@ -13360,7 +13346,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -13360,7 +13346,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 13360 | | 13346 | |
| 13361 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 13347 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 13362 | if (val.isUndef(mod)) { | 13348 | if (val.isUndef(mod)) { |
| 13363 | return sema.addConstUndef(operand_type); | 13349 | return mod.undefRef(operand_type); |
| 13364 | } else if (operand_type.zigTypeTag(mod) == .Vector) { | 13350 | } else if (operand_type.zigTypeTag(mod) == .Vector) { |
| 13365 | const vec_len = try sema.usizeCast(block, operand_src, operand_type.vectorLen(mod)); | 13351 | const vec_len = try sema.usizeCast(block, operand_src, operand_type.vectorLen(mod)); |
| 13366 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); | 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,13 +13354,13 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 13368 | const elem_val = try val.elemValue(mod, i); | 13354 | const elem_val = try val.elemValue(mod, i); |
| 13369 | elem.* = try (try elem_val.bitwiseNot(scalar_type, sema.arena, mod)).intern(scalar_type, mod); | 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 | .ty = operand_type.toIntern(), | 13358 | .ty = operand_type.toIntern(), |
| 13373 | .storage = .{ .elems = elems }, | 13359 | .storage = .{ .elems = elems }, |
| 13374 | } })).toValue()); | 13360 | } }))); |
| 13375 | } else { | 13361 | } else { |
| 13376 | const result_val = try val.bitwiseNot(operand_type, sema.arena, mod); | 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,7 +13387,7 @@ fn analyzeTupleCat( |
| 13401 | const dest_fields = lhs_len + rhs_len; | 13387 | const dest_fields = lhs_len + rhs_len; |
| 13402 | | 13388 | |
| 13403 | if (dest_fields == 0) { | 13389 | if (dest_fields == 0) { |
| 13404 | return sema.addConstant(Value.empty_struct); | 13390 | return Air.internedToRef(Value.empty_struct.toIntern()); |
| 13405 | } | 13391 | } |
| 13406 | if (lhs_len == 0) { | 13392 | if (lhs_len == 0) { |
| 13407 | return rhs; | 13393 | return rhs; |
| ... | @@ -13452,7 +13438,7 @@ fn analyzeTupleCat( | ... | @@ -13452,7 +13438,7 @@ fn analyzeTupleCat( |
| 13452 | .ty = tuple_ty, | 13438 | .ty = tuple_ty, |
| 13453 | .storage = .{ .elems = values }, | 13439 | .storage = .{ .elems = values }, |
| 13454 | } }); | 13440 | } }); |
| 13455 | return sema.addConstant(tuple_val.toValue()); | 13441 | return Air.internedToRef(tuple_val); |
| 13456 | }; | 13442 | }; |
| 13457 | | 13443 | |
| 13458 | try sema.requireRuntimeBlock(block, src, runtime_src); | 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,9 +13509,9 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13523 | // coercing it to the peer-resolved element type. | 13509 | // coercing it to the peer-resolved element type. |
| 13524 | const res_sent_val: ?Value = s: { | 13510 | const res_sent_val: ?Value = s: { |
| 13525 | if (lhs_info.sentinel) |lhs_sent_val| { | 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 | if (rhs_info.sentinel) |rhs_sent_val| { | 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 | const lhs_sent_casted = try sema.coerce(block, resolved_elem_ty, lhs_sent, lhs_src); | 13515 | const lhs_sent_casted = try sema.coerce(block, resolved_elem_ty, lhs_sent, lhs_src); |
| 13530 | const rhs_sent_casted = try sema.coerce(block, resolved_elem_ty, rhs_sent, rhs_src); | 13516 | const rhs_sent_casted = try sema.coerce(block, resolved_elem_ty, rhs_sent, rhs_src); |
| 13531 | const lhs_sent_casted_val = try sema.resolveConstValue(block, lhs_src, lhs_sent_casted, "array sentinel value must be comptime-known"); | 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,7 +13528,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13542 | } | 13528 | } |
| 13543 | } else { | 13529 | } else { |
| 13544 | if (rhs_info.sentinel) |rhs_sent_val| { | 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 | const rhs_sent_casted = try sema.coerce(block, resolved_elem_ty, rhs_sent, rhs_src); | 13532 | const rhs_sent_casted = try sema.coerce(block, resolved_elem_ty, rhs_sent, rhs_src); |
| 13547 | const rhs_sent_casted_val = try sema.resolveConstValue(block, rhs_src, rhs_sent_casted, "array sentinel value must be comptime-known"); | 13533 | const rhs_sent_casted_val = try sema.resolveConstValue(block, rhs_src, rhs_sent_casted, "array sentinel value must be comptime-known"); |
| 13548 | break :s rhs_sent_casted_val; | 13534 | break :s rhs_sent_casted_val; |
| ... | @@ -13600,7 +13586,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -13600,7 +13586,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13600 | const lhs_elem_i = elem_i; | 13586 | const lhs_elem_i = elem_i; |
| 13601 | const elem_default_val = if (lhs_is_tuple) lhs_ty.structFieldDefaultValue(lhs_elem_i, mod) else Value.@"unreachable"; | 13587 | const elem_default_val = if (lhs_is_tuple) lhs_ty.structFieldDefaultValue(lhs_elem_i, mod) else Value.@"unreachable"; |
| 13602 | const elem_val = if (elem_default_val.toIntern() == .unreachable_value) try lhs_sub_val.elemValue(mod, lhs_elem_i) else elem_default_val; | 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 | const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); | 13590 | const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); |
| 13605 | const coerced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); | 13591 | const coerced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); |
| 13606 | element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod); | 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,7 +13595,7 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13609 | const rhs_elem_i = elem_i - lhs_len; | 13595 | const rhs_elem_i = elem_i - lhs_len; |
| 13610 | const elem_default_val = if (rhs_is_tuple) rhs_ty.structFieldDefaultValue(rhs_elem_i, mod) else Value.@"unreachable"; | 13596 | const elem_default_val = if (rhs_is_tuple) rhs_ty.structFieldDefaultValue(rhs_elem_i, mod) else Value.@"unreachable"; |
| 13611 | const elem_val = if (elem_default_val.toIntern() == .unreachable_value) try rhs_sub_val.elemValue(mod, rhs_elem_i) else elem_default_val; | 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 | const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); | 13599 | const coerced_elem_val_inst = try sema.coerce(block, resolved_elem_ty, elem_val_inst, .unneeded); |
| 13614 | const coerced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); | 13600 | const coerced_elem_val = try sema.resolveConstMaybeUndefVal(block, .unneeded, coerced_elem_val_inst, ""); |
| 13615 | element_vals[elem_i] = try coerced_elem_val.intern(resolved_elem_ty, mod); | 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,22 +13622,22 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13636 | | 13622 | |
| 13637 | var elem_i: usize = 0; | 13623 | var elem_i: usize = 0; |
| 13638 | while (elem_i < lhs_len) : (elem_i += 1) { | 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 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); | 13626 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13641 | const init = try sema.elemVal(block, lhs_src, lhs, elem_index, src, true); | 13627 | const init = try sema.elemVal(block, lhs_src, lhs, elem_index, src, true); |
| 13642 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); | 13628 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); |
| 13643 | } | 13629 | } |
| 13644 | while (elem_i < result_len) : (elem_i += 1) { | 13630 | while (elem_i < result_len) : (elem_i += 1) { |
| 13645 | const elem_index = try sema.addIntUnsigned(Type.usize, elem_i); | 13631 | const elem_index = try mod.intRef(Type.usize, elem_i); |
| 13646 | const rhs_index = try sema.addIntUnsigned(Type.usize, elem_i - lhs_len); | 13632 | const rhs_index = try mod.intRef(Type.usize, elem_i - lhs_len); |
| 13647 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); | 13633 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13648 | const init = try sema.elemVal(block, rhs_src, rhs, rhs_index, src, true); | 13634 | const init = try sema.elemVal(block, rhs_src, rhs, rhs_index, src, true); |
| 13649 | try sema.storePtr2(block, src, elem_ptr, src, init, rhs_src, .store); | 13635 | try sema.storePtr2(block, src, elem_ptr, src, init, rhs_src, .store); |
| 13650 | } | 13636 | } |
| 13651 | if (res_sent_val) |sent_val| { | 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 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); | 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 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); | 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,12 +13648,12 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13662 | { | 13648 | { |
| 13663 | var elem_i: usize = 0; | 13649 | var elem_i: usize = 0; |
| 13664 | while (elem_i < lhs_len) : (elem_i += 1) { | 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 | const init = try sema.elemVal(block, lhs_src, lhs, index, src, true); | 13652 | const init = try sema.elemVal(block, lhs_src, lhs, index, src, true); |
| 13667 | element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, lhs_src); | 13653 | element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, lhs_src); |
| 13668 | } | 13654 | } |
| 13669 | while (elem_i < result_len) : (elem_i += 1) { | 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 | const init = try sema.elemVal(block, rhs_src, rhs, index, src, true); | 13657 | const init = try sema.elemVal(block, rhs_src, rhs, index, src, true); |
| 13672 | element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, rhs_src); | 13658 | element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, rhs_src); |
| 13673 | } | 13659 | } |
| ... | @@ -13739,7 +13725,7 @@ fn analyzeTupleMul( | ... | @@ -13739,7 +13725,7 @@ fn analyzeTupleMul( |
| 13739 | return sema.fail(block, rhs_src, "operation results in overflow", .{}); | 13725 | return sema.fail(block, rhs_src, "operation results in overflow", .{}); |
| 13740 | | 13726 | |
| 13741 | if (final_len == 0) { | 13727 | if (final_len == 0) { |
| 13742 | return sema.addConstant(Value.empty_struct); | 13728 | return Air.internedToRef(Value.empty_struct.toIntern()); |
| 13743 | } | 13729 | } |
| 13744 | const types = try sema.arena.alloc(InternPool.Index, final_len); | 13730 | const types = try sema.arena.alloc(InternPool.Index, final_len); |
| 13745 | const values = try sema.arena.alloc(InternPool.Index, final_len); | 13731 | const values = try sema.arena.alloc(InternPool.Index, final_len); |
| ... | @@ -13773,7 +13759,7 @@ fn analyzeTupleMul( | ... | @@ -13773,7 +13759,7 @@ fn analyzeTupleMul( |
| 13773 | .ty = tuple_ty, | 13759 | .ty = tuple_ty, |
| 13774 | .storage = .{ .elems = values }, | 13760 | .storage = .{ .elems = values }, |
| 13775 | } }); | 13761 | } }); |
| 13776 | return sema.addConstant(tuple_val.toValue()); | 13762 | return Air.internedToRef(tuple_val); |
| 13777 | }; | 13763 | }; |
| 13778 | | 13764 | |
| 13779 | try sema.requireRuntimeBlock(block, src, runtime_src); | 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,18 +13883,18 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13897 | while (elem_i < result_len) { | 13883 | while (elem_i < result_len) { |
| 13898 | var lhs_i: usize = 0; | 13884 | var lhs_i: usize = 0; |
| 13899 | while (lhs_i < lhs_len) : (lhs_i += 1) { | 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 | elem_i += 1; | 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 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); | 13889 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); |
| 13904 | const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true); | 13890 | const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true); |
| 13905 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); | 13891 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); |
| 13906 | } | 13892 | } |
| 13907 | } | 13893 | } |
| 13908 | if (lhs_info.sentinel) |sent_val| { | 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 | const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty); | 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 | try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store); | 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,7 +13906,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 13920 | while (elem_i < result_len) { | 13906 | while (elem_i < result_len) { |
| 13921 | var lhs_i: usize = 0; | 13907 | var lhs_i: usize = 0; |
| 13922 | while (lhs_i < lhs_len) : (lhs_i += 1) { | 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 | const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true); | 13910 | const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true); |
| 13925 | element_refs[elem_i] = init; | 13911 | element_refs[elem_i] = init; |
| 13926 | elem_i += 1; | 13912 | elem_i += 1; |
| ... | @@ -13951,14 +13937,14 @@ fn zirNegate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -13951,14 +13937,14 @@ fn zirNegate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 13951 | if (rhs_scalar_ty.isAnyFloat()) { | 13937 | if (rhs_scalar_ty.isAnyFloat()) { |
| 13952 | // We handle float negation here to ensure negative zero is represented in the bits. | 13938 | // We handle float negation here to ensure negative zero is represented in the bits. |
| 13953 | if (try sema.resolveMaybeUndefVal(rhs)) |rhs_val| { | 13939 | if (try sema.resolveMaybeUndefVal(rhs)) |rhs_val| { |
| 13954 | if (rhs_val.isUndef(mod)) return sema.addConstUndef(rhs_ty); | 13940 | if (rhs_val.isUndef(mod)) return mod.undefRef(rhs_ty); |
| 13955 | return sema.addConstant(try rhs_val.floatNeg(rhs_ty, sema.arena, mod)); | 13941 | return Air.internedToRef((try rhs_val.floatNeg(rhs_ty, sema.arena, mod)).toIntern()); |
| 13956 | } | 13942 | } |
| 13957 | try sema.requireRuntimeBlock(block, src, null); | 13943 | try sema.requireRuntimeBlock(block, src, null); |
| 13958 | return block.addUnOp(if (block.float_mode == .Optimized) .neg_optimized else .neg, rhs); | 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 | return sema.analyzeArithmetic(block, .sub, lhs, rhs, src, lhs_src, rhs_src, true); | 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,7 +13964,7 @@ fn zirNegateWrap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 13978 | else => return sema.fail(block, src, "negation of type '{}'", .{rhs_ty.fmt(mod)}), | 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 | return sema.analyzeArithmetic(block, .subwrap, lhs, rhs, src, lhs_src, rhs_src, true); | 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,7 +14081,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14095 | else => unreachable, | 14081 | else => unreachable, |
| 14096 | }; | 14082 | }; |
| 14097 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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,12 +14104,12 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14118 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { | 14104 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { |
| 14119 | if (maybe_rhs_val) |rhs_val| { | 14105 | if (maybe_rhs_val) |rhs_val| { |
| 14120 | if (try sema.compareAll(rhs_val, .neq, try mod.intValue(resolved_type, -1), resolved_type)) { | 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 | return sema.failWithUseOfUndef(block, rhs_src); | 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 | if (maybe_rhs_val) |rhs_val| { | 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,11 +14119,9 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14133 | if (overflow_idx) |vec_idx| { | 14119 | if (overflow_idx) |vec_idx| { |
| 14134 | return sema.failWithIntegerOverflow(block, src, resolved_type, res, vec_idx); | 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 | } else { | 14123 | } else { |
| 14138 | return sema.addConstant( | 14124 | return Air.internedToRef((try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14139 | try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod), | | |
| 14140 | ); | | |
| 14141 | } | 14125 | } |
| 14142 | } else { | 14126 | } else { |
| 14143 | break :rs rhs_src; | 14127 | break :rs rhs_src; |
| ... | @@ -14234,7 +14218,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -14234,7 +14218,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14234 | else => unreachable, | 14218 | else => unreachable, |
| 14235 | }; | 14219 | }; |
| 14236 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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,15 +14243,13 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14259 | if (overflow_idx) |vec_idx| { | 14243 | if (overflow_idx) |vec_idx| { |
| 14260 | return sema.failWithIntegerOverflow(block, src, resolved_type, res, vec_idx); | 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 | } else { | 14247 | } else { |
| 14264 | const modulus_val = try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod); | 14248 | const modulus_val = try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod); |
| 14265 | if (!(modulus_val.compareAllWithZero(.eq, mod))) { | 14249 | if (!(modulus_val.compareAllWithZero(.eq, mod))) { |
| 14266 | return sema.fail(block, src, "exact division produced remainder", .{}); | 14250 | return sema.fail(block, src, "exact division produced remainder", .{}); |
| 14267 | } | 14251 | } |
| 14268 | return sema.addConstant( | 14252 | return Air.internedToRef((try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14269 | try lhs_val.floatDiv(rhs_val, resolved_type, sema.arena, mod), | | |
| 14270 | ); | | |
| 14271 | } | 14253 | } |
| 14272 | } else break :rs rhs_src; | 14254 | } else break :rs rhs_src; |
| 14273 | } else break :rs lhs_src; | 14255 | } else break :rs lhs_src; |
| ... | @@ -14317,7 +14299,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -14317,7 +14299,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14317 | }; | 14299 | }; |
| 14318 | if (resolved_type.zigTypeTag(mod) == .Vector) { | 14300 | if (resolved_type.zigTypeTag(mod) == .Vector) { |
| 14319 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | const eql = try block.addCmpVector(remainder, zero, .eq); | 14303 | const eql = try block.addCmpVector(remainder, zero, .eq); |
| 14322 | break :ok try block.addInst(.{ | 14304 | break :ok try block.addInst(.{ |
| 14323 | .tag = .reduce, | 14305 | .tag = .reduce, |
| ... | @@ -14327,7 +14309,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -14327,7 +14309,7 @@ fn zirDivExact(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14327 | } }, | 14309 | } }, |
| 14328 | }); | 14310 | }); |
| 14329 | } else { | 14311 | } else { |
| 14330 | const zero = try sema.addConstant(scalar_zero); | 14312 | const zero = Air.internedToRef(scalar_zero.toIntern()); |
| 14331 | const is_in_range = try block.addBinOp(.cmp_eq, remainder, zero); | 14313 | const is_in_range = try block.addBinOp(.cmp_eq, remainder, zero); |
| 14332 | break :ok is_in_range; | 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,7 +14386,7 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14404 | else => unreachable, | 14386 | else => unreachable, |
| 14405 | }; | 14387 | }; |
| 14406 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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,23 +14404,19 @@ fn zirDivFloor(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14422 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { | 14404 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { |
| 14423 | if (maybe_rhs_val) |rhs_val| { | 14405 | if (maybe_rhs_val) |rhs_val| { |
| 14424 | if (try sema.compareAll(rhs_val, .neq, try mod.intValue(resolved_type, -1), resolved_type)) { | 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 | return sema.failWithUseOfUndef(block, rhs_src); | 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 | if (maybe_rhs_val) |rhs_val| { | 14415 | if (maybe_rhs_val) |rhs_val| { |
| 14434 | if (is_int) { | 14416 | if (is_int) { |
| 14435 | return sema.addConstant( | 14417 | return Air.internedToRef((try lhs_val.intDivFloor(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14436 | try lhs_val.intDivFloor(rhs_val, resolved_type, sema.arena, mod), | | |
| 14437 | ); | | |
| 14438 | } else { | 14418 | } else { |
| 14439 | return sema.addConstant( | 14419 | return Air.internedToRef((try lhs_val.floatDivFloor(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14440 | try lhs_val.floatDivFloor(rhs_val, resolved_type, sema.arena, mod), | | |
| 14441 | ); | | |
| 14442 | } | 14420 | } |
| 14443 | } else break :rs rhs_src; | 14421 | } else break :rs rhs_src; |
| 14444 | } else break :rs lhs_src; | 14422 | } else break :rs lhs_src; |
| ... | @@ -14519,7 +14497,7 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -14519,7 +14497,7 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14519 | else => unreachable, | 14497 | else => unreachable, |
| 14520 | }; | 14498 | }; |
| 14521 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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,12 +14514,12 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14536 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { | 14514 | if (lhs_scalar_ty.isSignedInt(mod) and rhs_scalar_ty.isSignedInt(mod)) { |
| 14537 | if (maybe_rhs_val) |rhs_val| { | 14515 | if (maybe_rhs_val) |rhs_val| { |
| 14538 | if (try sema.compareAll(rhs_val, .neq, try mod.intValue(resolved_type, -1), resolved_type)) { | 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 | return sema.failWithUseOfUndef(block, rhs_src); | 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 | if (maybe_rhs_val) |rhs_val| { | 14525 | if (maybe_rhs_val) |rhs_val| { |
| ... | @@ -14551,11 +14529,9 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -14551,11 +14529,9 @@ fn zirDivTrunc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 14551 | if (overflow_idx) |vec_idx| { | 14529 | if (overflow_idx) |vec_idx| { |
| 14552 | return sema.failWithIntegerOverflow(block, src, resolved_type, res, vec_idx); | 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 | } else { | 14533 | } else { |
| 14556 | return sema.addConstant( | 14534 | return Air.internedToRef((try lhs_val.floatDivTrunc(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14557 | try lhs_val.floatDivTrunc(rhs_val, resolved_type, sema.arena, mod), | | |
| 14558 | ); | | |
| 14559 | } | 14535 | } |
| 14560 | } else break :rs rhs_src; | 14536 | } else break :rs rhs_src; |
| 14561 | } else break :rs lhs_src; | 14537 | } else break :rs lhs_src; |
| ... | @@ -14612,11 +14588,11 @@ fn addDivIntOverflowSafety( | ... | @@ -14612,11 +14588,11 @@ fn addDivIntOverflowSafety( |
| 14612 | var ok: Air.Inst.Ref = .none; | 14588 | var ok: Air.Inst.Ref = .none; |
| 14613 | if (resolved_type.zigTypeTag(mod) == .Vector) { | 14589 | if (resolved_type.zigTypeTag(mod) == .Vector) { |
| 14614 | if (maybe_lhs_val == null) { | 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 | ok = try block.addCmpVector(casted_lhs, min_int_ref, .neq); | 14592 | ok = try block.addCmpVector(casted_lhs, min_int_ref, .neq); |
| 14617 | } | 14593 | } |
| 14618 | if (maybe_rhs_val == null) { | 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 | const rhs_ok = try block.addCmpVector(casted_rhs, neg_one_ref, .neq); | 14596 | const rhs_ok = try block.addCmpVector(casted_rhs, neg_one_ref, .neq); |
| 14621 | if (ok == .none) { | 14597 | if (ok == .none) { |
| 14622 | ok = rhs_ok; | 14598 | ok = rhs_ok; |
| ... | @@ -14634,11 +14610,11 @@ fn addDivIntOverflowSafety( | ... | @@ -14634,11 +14610,11 @@ fn addDivIntOverflowSafety( |
| 14634 | }); | 14610 | }); |
| 14635 | } else { | 14611 | } else { |
| 14636 | if (maybe_lhs_val == null) { | 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 | ok = try block.addBinOp(.cmp_neq, casted_lhs, min_int_ref); | 14614 | ok = try block.addBinOp(.cmp_neq, casted_lhs, min_int_ref); |
| 14639 | } | 14615 | } |
| 14640 | if (maybe_rhs_val == null) { | 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 | const rhs_ok = try block.addBinOp(.cmp_neq, casted_rhs, neg_one_ref); | 14618 | const rhs_ok = try block.addBinOp(.cmp_neq, casted_rhs, neg_one_ref); |
| 14643 | if (ok == .none) { | 14619 | if (ok == .none) { |
| 14644 | ok = rhs_ok; | 14620 | ok = rhs_ok; |
| ... | @@ -14674,7 +14650,7 @@ fn addDivByZeroSafety( | ... | @@ -14674,7 +14650,7 @@ fn addDivByZeroSafety( |
| 14674 | try mod.floatValue(resolved_type.scalarType(mod), 0.0); | 14650 | try mod.floatValue(resolved_type.scalarType(mod), 0.0); |
| 14675 | const ok = if (resolved_type.zigTypeTag(mod) == .Vector) ok: { | 14651 | const ok = if (resolved_type.zigTypeTag(mod) == .Vector) ok: { |
| 14676 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | const ok = try block.addCmpVector(casted_rhs, zero, .neq); | 14654 | const ok = try block.addCmpVector(casted_rhs, zero, .neq); |
| 14679 | break :ok try block.addInst(.{ | 14655 | break :ok try block.addInst(.{ |
| 14680 | .tag = if (is_int) .reduce else .reduce_optimized, | 14656 | .tag = if (is_int) .reduce else .reduce_optimized, |
| ... | @@ -14684,7 +14660,7 @@ fn addDivByZeroSafety( | ... | @@ -14684,7 +14660,7 @@ fn addDivByZeroSafety( |
| 14684 | } }, | 14660 | } }, |
| 14685 | }); | 14661 | }); |
| 14686 | } else ok: { | 14662 | } else ok: { |
| 14687 | const zero = try sema.addConstant(scalar_zero); | 14663 | const zero = Air.internedToRef(scalar_zero.toIntern()); |
| 14688 | break :ok try block.addBinOp(if (is_int) .cmp_neq else .cmp_neq_optimized, casted_rhs, zero); | 14664 | break :ok try block.addBinOp(if (is_int) .cmp_neq else .cmp_neq_optimized, casted_rhs, zero); |
| 14689 | }; | 14665 | }; |
| 14690 | try sema.addSafetyCheck(block, src, ok, .divide_by_zero); | 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,7 +14741,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14765 | .ty = resolved_type.toIntern(), | 14741 | .ty = resolved_type.toIntern(), |
| 14766 | .storage = .{ .repeated_elem = scalar_zero.toIntern() }, | 14742 | .storage = .{ .repeated_elem = scalar_zero.toIntern() }, |
| 14767 | } })).toValue() else scalar_zero; | 14743 | } })).toValue() else scalar_zero; |
| 14768 | return sema.addConstant(zero_val); | 14744 | return Air.internedToRef(zero_val.toIntern()); |
| 14769 | } | 14745 | } |
| 14770 | } else if (lhs_scalar_ty.isSignedInt(mod)) { | 14746 | } else if (lhs_scalar_ty.isSignedInt(mod)) { |
| 14771 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); | 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,7 +14765,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14789 | { | 14765 | { |
| 14790 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); | 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 | break :rs lhs_src; | 14770 | break :rs lhs_src; |
| 14795 | } else if (rhs_scalar_ty.isSignedInt(mod)) { | 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,9 +14789,7 @@ fn zirModRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 14813 | if (lhs_val.isUndef(mod) or !(try lhs_val.compareAllWithZeroAdvanced(.gte, sema))) { | 14789 | if (lhs_val.isUndef(mod) or !(try lhs_val.compareAllWithZeroAdvanced(.gte, sema))) { |
| 14814 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); | 14790 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); |
| 14815 | } | 14791 | } |
| 14816 | return sema.addConstant( | 14792 | return Air.internedToRef((try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14817 | try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod), | | |
| 14818 | ); | | |
| 14819 | } else { | 14793 | } else { |
| 14820 | return sema.failWithModRemNegative(block, lhs_src, lhs_ty, rhs_ty); | 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,9 +14919,7 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14945 | return sema.failWithDivideByZero(block, rhs_src); | 14919 | return sema.failWithDivideByZero(block, rhs_src); |
| 14946 | } | 14920 | } |
| 14947 | if (maybe_lhs_val) |lhs_val| { | 14921 | if (maybe_lhs_val) |lhs_val| { |
| 14948 | return sema.addConstant( | 14922 | return Air.internedToRef((try lhs_val.intMod(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14949 | try lhs_val.intMod(rhs_val, resolved_type, sema.arena, mod), | | |
| 14950 | ); | | |
| 14951 | } | 14923 | } |
| 14952 | break :rs lhs_src; | 14924 | break :rs lhs_src; |
| 14953 | } else { | 14925 | } else { |
| ... | @@ -14965,12 +14937,10 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins | ... | @@ -14965,12 +14937,10 @@ fn zirMod(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 14965 | } | 14937 | } |
| 14966 | if (maybe_lhs_val) |lhs_val| { | 14938 | if (maybe_lhs_val) |lhs_val| { |
| 14967 | if (lhs_val.isUndef(mod)) { | 14939 | if (lhs_val.isUndef(mod)) { |
| 14968 | return sema.addConstUndef(resolved_type); | 14940 | return mod.undefRef(resolved_type); |
| 14969 | } | 14941 | } |
| 14970 | if (maybe_rhs_val) |rhs_val| { | 14942 | if (maybe_rhs_val) |rhs_val| { |
| 14971 | return sema.addConstant( | 14943 | return Air.internedToRef((try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 14972 | try lhs_val.floatMod(rhs_val, resolved_type, sema.arena, mod), | | |
| 14973 | ); | | |
| 14974 | } else break :rs rhs_src; | 14944 | } else break :rs rhs_src; |
| 14975 | } else break :rs lhs_src; | 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,9 +15015,7 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 15045 | return sema.failWithDivideByZero(block, rhs_src); | 15015 | return sema.failWithDivideByZero(block, rhs_src); |
| 15046 | } | 15016 | } |
| 15047 | if (maybe_lhs_val) |lhs_val| { | 15017 | if (maybe_lhs_val) |lhs_val| { |
| 15048 | return sema.addConstant( | 15018 | return Air.internedToRef((try sema.intRem(resolved_type, lhs_val, rhs_val)).toIntern()); |
| 15049 | try sema.intRem(resolved_type, lhs_val, rhs_val), | | |
| 15050 | ); | | |
| 15051 | } | 15019 | } |
| 15052 | break :rs lhs_src; | 15020 | break :rs lhs_src; |
| 15053 | } else { | 15021 | } else { |
| ... | @@ -15065,12 +15033,10 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins | ... | @@ -15065,12 +15033,10 @@ fn zirRem(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins |
| 15065 | } | 15033 | } |
| 15066 | if (maybe_lhs_val) |lhs_val| { | 15034 | if (maybe_lhs_val) |lhs_val| { |
| 15067 | if (lhs_val.isUndef(mod)) { | 15035 | if (lhs_val.isUndef(mod)) { |
| 15068 | return sema.addConstUndef(resolved_type); | 15036 | return mod.undefRef(resolved_type); |
| 15069 | } | 15037 | } |
| 15070 | if (maybe_rhs_val) |rhs_val| { | 15038 | if (maybe_rhs_val) |rhs_val| { |
| 15071 | return sema.addConstant( | 15039 | return Air.internedToRef((try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15072 | try lhs_val.floatRem(rhs_val, resolved_type, sema.arena, mod), | | |
| 15073 | ); | | |
| 15074 | } else break :rs rhs_src; | 15040 | } else break :rs rhs_src; |
| 15075 | } else break :rs lhs_src; | 15041 | } else break :rs lhs_src; |
| 15076 | }; | 15042 | }; |
| ... | @@ -15263,7 +15229,7 @@ fn zirOverflowArithmetic( | ... | @@ -15263,7 +15229,7 @@ fn zirOverflowArithmetic( |
| 15263 | return block.addInst(.{ | 15229 | return block.addInst(.{ |
| 15264 | .tag = air_tag, | 15230 | .tag = air_tag, |
| 15265 | .data = .{ .ty_pl = .{ | 15231 | .data = .{ .ty_pl = .{ |
| 15266 | .ty = try block.sema.addType(tuple_ty), | 15232 | .ty = Air.internedToRef(tuple_ty.toIntern()), |
| 15267 | .payload = try block.sema.addExtra(Air.Bin{ | 15233 | .payload = try block.sema.addExtra(Air.Bin{ |
| 15268 | .lhs = lhs, | 15234 | .lhs = lhs, |
| 15269 | .rhs = rhs, | 15235 | .rhs = rhs, |
| ... | @@ -15280,18 +15246,18 @@ fn zirOverflowArithmetic( | ... | @@ -15280,18 +15246,18 @@ fn zirOverflowArithmetic( |
| 15280 | } | 15246 | } |
| 15281 | | 15247 | |
| 15282 | if (result.inst == .none) { | 15248 | if (result.inst == .none) { |
| 15283 | return sema.addConstant((try mod.intern(.{ .aggregate = .{ | 15249 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 15284 | .ty = tuple_ty.toIntern(), | 15250 | .ty = tuple_ty.toIntern(), |
| 15285 | .storage = .{ .elems = &.{ | 15251 | .storage = .{ .elems = &.{ |
| 15286 | result.wrapped.toIntern(), | 15252 | result.wrapped.toIntern(), |
| 15287 | result.overflow_bit.toIntern(), | 15253 | result.overflow_bit.toIntern(), |
| 15288 | } }, | 15254 | } }, |
| 15289 | } })).toValue()); | 15255 | } }))); |
| 15290 | } | 15256 | } |
| 15291 | | 15257 | |
| 15292 | const element_refs = try sema.arena.alloc(Air.Inst.Ref, 2); | 15258 | const element_refs = try sema.arena.alloc(Air.Inst.Ref, 2); |
| 15293 | element_refs[0] = result.inst; | 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 | return block.addAggregateInit(tuple_ty, element_refs); | 15261 | return block.addAggregateInit(tuple_ty, element_refs); |
| 15296 | } | 15262 | } |
| 15297 | | 15263 | |
| ... | @@ -15394,7 +15360,7 @@ fn analyzeArithmetic( | ... | @@ -15394,7 +15360,7 @@ fn analyzeArithmetic( |
| 15394 | if (is_int) { | 15360 | if (is_int) { |
| 15395 | return sema.failWithUseOfUndef(block, rhs_src); | 15361 | return sema.failWithUseOfUndef(block, rhs_src); |
| 15396 | } else { | 15362 | } else { |
| 15397 | return sema.addConstUndef(resolved_type); | 15363 | return mod.undefRef(resolved_type); |
| 15398 | } | 15364 | } |
| 15399 | } | 15365 | } |
| 15400 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15366 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | @@ -15407,7 +15373,7 @@ fn analyzeArithmetic( | ... | @@ -15407,7 +15373,7 @@ fn analyzeArithmetic( |
| 15407 | if (is_int) { | 15373 | if (is_int) { |
| 15408 | return sema.failWithUseOfUndef(block, lhs_src); | 15374 | return sema.failWithUseOfUndef(block, lhs_src); |
| 15409 | } else { | 15375 | } else { |
| 15410 | return sema.addConstUndef(resolved_type); | 15376 | return mod.undefRef(resolved_type); |
| 15411 | } | 15377 | } |
| 15412 | } | 15378 | } |
| 15413 | if (maybe_rhs_val) |rhs_val| { | 15379 | if (maybe_rhs_val) |rhs_val| { |
| ... | @@ -15417,11 +15383,9 @@ fn analyzeArithmetic( | ... | @@ -15417,11 +15383,9 @@ fn analyzeArithmetic( |
| 15417 | if (overflow_idx) |vec_idx| { | 15383 | if (overflow_idx) |vec_idx| { |
| 15418 | return sema.failWithIntegerOverflow(block, src, resolved_type, sum, vec_idx); | 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 | } else { | 15387 | } else { |
| 15422 | return sema.addConstant( | 15388 | return Air.internedToRef((try Value.floatAdd(lhs_val, rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15423 | try Value.floatAdd(lhs_val, rhs_val, resolved_type, sema.arena, mod), | | |
| 15424 | ); | | |
| 15425 | } | 15389 | } |
| 15426 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .add_safe }; | 15390 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .add_safe }; |
| 15427 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .add_safe }; | 15391 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .add_safe }; |
| ... | @@ -15437,15 +15401,13 @@ fn analyzeArithmetic( | ... | @@ -15437,15 +15401,13 @@ fn analyzeArithmetic( |
| 15437 | } | 15401 | } |
| 15438 | if (maybe_rhs_val) |rhs_val| { | 15402 | if (maybe_rhs_val) |rhs_val| { |
| 15439 | if (rhs_val.isUndef(mod)) { | 15403 | if (rhs_val.isUndef(mod)) { |
| 15440 | return sema.addConstUndef(resolved_type); | 15404 | return mod.undefRef(resolved_type); |
| 15441 | } | 15405 | } |
| 15442 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15406 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15443 | return casted_lhs; | 15407 | return casted_lhs; |
| 15444 | } | 15408 | } |
| 15445 | if (maybe_lhs_val) |lhs_val| { | 15409 | if (maybe_lhs_val) |lhs_val| { |
| 15446 | return sema.addConstant( | 15410 | return Air.internedToRef((try sema.numberAddWrapScalar(lhs_val, rhs_val, resolved_type)).toIntern()); |
| 15447 | try sema.numberAddWrapScalar(lhs_val, rhs_val, resolved_type), | | |
| 15448 | ); | | |
| 15449 | } else break :rs .{ .src = lhs_src, .air_tag = .add_wrap, .air_tag_safe = .add_wrap }; | 15411 | } else break :rs .{ .src = lhs_src, .air_tag = .add_wrap, .air_tag_safe = .add_wrap }; |
| 15450 | } else break :rs .{ .src = rhs_src, .air_tag = .add_wrap, .air_tag_safe = .add_wrap }; | 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,7 +15422,7 @@ fn analyzeArithmetic( |
| 15460 | } | 15422 | } |
| 15461 | if (maybe_rhs_val) |rhs_val| { | 15423 | if (maybe_rhs_val) |rhs_val| { |
| 15462 | if (rhs_val.isUndef(mod)) { | 15424 | if (rhs_val.isUndef(mod)) { |
| 15463 | return sema.addConstUndef(resolved_type); | 15425 | return mod.undefRef(resolved_type); |
| 15464 | } | 15426 | } |
| 15465 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15427 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15466 | return casted_lhs; | 15428 | return casted_lhs; |
| ... | @@ -15471,7 +15433,7 @@ fn analyzeArithmetic( | ... | @@ -15471,7 +15433,7 @@ fn analyzeArithmetic( |
| 15471 | else | 15433 | else |
| 15472 | try lhs_val.intAddSat(rhs_val, resolved_type, sema.arena, mod); | 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 | } else break :rs .{ | 15437 | } else break :rs .{ |
| 15476 | .src = lhs_src, | 15438 | .src = lhs_src, |
| 15477 | .air_tag = .add_sat, | 15439 | .air_tag = .add_sat, |
| ... | @@ -15496,7 +15458,7 @@ fn analyzeArithmetic( | ... | @@ -15496,7 +15458,7 @@ fn analyzeArithmetic( |
| 15496 | if (is_int) { | 15458 | if (is_int) { |
| 15497 | return sema.failWithUseOfUndef(block, rhs_src); | 15459 | return sema.failWithUseOfUndef(block, rhs_src); |
| 15498 | } else { | 15460 | } else { |
| 15499 | return sema.addConstUndef(resolved_type); | 15461 | return mod.undefRef(resolved_type); |
| 15500 | } | 15462 | } |
| 15501 | } | 15463 | } |
| 15502 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15464 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| ... | @@ -15509,7 +15471,7 @@ fn analyzeArithmetic( | ... | @@ -15509,7 +15471,7 @@ fn analyzeArithmetic( |
| 15509 | if (is_int) { | 15471 | if (is_int) { |
| 15510 | return sema.failWithUseOfUndef(block, lhs_src); | 15472 | return sema.failWithUseOfUndef(block, lhs_src); |
| 15511 | } else { | 15473 | } else { |
| 15512 | return sema.addConstUndef(resolved_type); | 15474 | return mod.undefRef(resolved_type); |
| 15513 | } | 15475 | } |
| 15514 | } | 15476 | } |
| 15515 | if (maybe_rhs_val) |rhs_val| { | 15477 | if (maybe_rhs_val) |rhs_val| { |
| ... | @@ -15519,11 +15481,9 @@ fn analyzeArithmetic( | ... | @@ -15519,11 +15481,9 @@ fn analyzeArithmetic( |
| 15519 | if (overflow_idx) |vec_idx| { | 15481 | if (overflow_idx) |vec_idx| { |
| 15520 | return sema.failWithIntegerOverflow(block, src, resolved_type, diff, vec_idx); | 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 | } else { | 15485 | } else { |
| 15524 | return sema.addConstant( | 15486 | return Air.internedToRef((try Value.floatSub(lhs_val, rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15525 | try Value.floatSub(lhs_val, rhs_val, resolved_type, sema.arena, mod), | | |
| 15526 | ); | | |
| 15527 | } | 15487 | } |
| 15528 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .sub_safe }; | 15488 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .sub_safe }; |
| 15529 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .sub_safe }; | 15489 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .sub_safe }; |
| ... | @@ -15534,7 +15494,7 @@ fn analyzeArithmetic( | ... | @@ -15534,7 +15494,7 @@ fn analyzeArithmetic( |
| 15534 | // If either of the operands are undefined, the result is undefined. | 15494 | // If either of the operands are undefined, the result is undefined. |
| 15535 | if (maybe_rhs_val) |rhs_val| { | 15495 | if (maybe_rhs_val) |rhs_val| { |
| 15536 | if (rhs_val.isUndef(mod)) { | 15496 | if (rhs_val.isUndef(mod)) { |
| 15537 | return sema.addConstUndef(resolved_type); | 15497 | return mod.undefRef(resolved_type); |
| 15538 | } | 15498 | } |
| 15539 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15499 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15540 | return casted_lhs; | 15500 | return casted_lhs; |
| ... | @@ -15542,12 +15502,10 @@ fn analyzeArithmetic( | ... | @@ -15542,12 +15502,10 @@ fn analyzeArithmetic( |
| 15542 | } | 15502 | } |
| 15543 | if (maybe_lhs_val) |lhs_val| { | 15503 | if (maybe_lhs_val) |lhs_val| { |
| 15544 | if (lhs_val.isUndef(mod)) { | 15504 | if (lhs_val.isUndef(mod)) { |
| 15545 | return sema.addConstUndef(resolved_type); | 15505 | return mod.undefRef(resolved_type); |
| 15546 | } | 15506 | } |
| 15547 | if (maybe_rhs_val) |rhs_val| { | 15507 | if (maybe_rhs_val) |rhs_val| { |
| 15548 | return sema.addConstant( | 15508 | return Air.internedToRef((try sema.numberSubWrapScalar(lhs_val, rhs_val, resolved_type)).toIntern()); |
| 15549 | try sema.numberSubWrapScalar(lhs_val, rhs_val, resolved_type), | | |
| 15550 | ); | | |
| 15551 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_wrap, .air_tag_safe = .sub_wrap }; | 15509 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_wrap, .air_tag_safe = .sub_wrap }; |
| 15552 | } else break :rs .{ .src = lhs_src, .air_tag = .sub_wrap, .air_tag_safe = .sub_wrap }; | 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,7 +15515,7 @@ fn analyzeArithmetic( |
| 15557 | // If either of the operands are undefined, result is undefined. | 15515 | // If either of the operands are undefined, result is undefined. |
| 15558 | if (maybe_rhs_val) |rhs_val| { | 15516 | if (maybe_rhs_val) |rhs_val| { |
| 15559 | if (rhs_val.isUndef(mod)) { | 15517 | if (rhs_val.isUndef(mod)) { |
| 15560 | return sema.addConstUndef(resolved_type); | 15518 | return mod.undefRef(resolved_type); |
| 15561 | } | 15519 | } |
| 15562 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15520 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15563 | return casted_lhs; | 15521 | return casted_lhs; |
| ... | @@ -15565,7 +15523,7 @@ fn analyzeArithmetic( | ... | @@ -15565,7 +15523,7 @@ fn analyzeArithmetic( |
| 15565 | } | 15523 | } |
| 15566 | if (maybe_lhs_val) |lhs_val| { | 15524 | if (maybe_lhs_val) |lhs_val| { |
| 15567 | if (lhs_val.isUndef(mod)) { | 15525 | if (lhs_val.isUndef(mod)) { |
| 15568 | return sema.addConstUndef(resolved_type); | 15526 | return mod.undefRef(resolved_type); |
| 15569 | } | 15527 | } |
| 15570 | if (maybe_rhs_val) |rhs_val| { | 15528 | if (maybe_rhs_val) |rhs_val| { |
| 15571 | const val = if (scalar_tag == .ComptimeInt) | 15529 | const val = if (scalar_tag == .ComptimeInt) |
| ... | @@ -15573,7 +15531,7 @@ fn analyzeArithmetic( | ... | @@ -15573,7 +15531,7 @@ fn analyzeArithmetic( |
| 15573 | else | 15531 | else |
| 15574 | try lhs_val.intSubSat(rhs_val, resolved_type, sema.arena, mod); | 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 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat, .air_tag_safe = .sub_sat }; | 15535 | } else break :rs .{ .src = rhs_src, .air_tag = .sub_sat, .air_tag_safe = .sub_sat }; |
| 15578 | } else break :rs .{ .src = lhs_src, .air_tag = .sub_sat, .air_tag_safe = .sub_sat }; | 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,23 +15560,21 @@ fn analyzeArithmetic( |
| 15602 | if (maybe_lhs_val) |lhs_val| { | 15560 | if (maybe_lhs_val) |lhs_val| { |
| 15603 | if (!lhs_val.isUndef(mod)) { | 15561 | if (!lhs_val.isUndef(mod)) { |
| 15604 | if (lhs_val.isNan(mod)) { | 15562 | if (lhs_val.isNan(mod)) { |
| 15605 | return sema.addConstant(lhs_val); | 15563 | return Air.internedToRef(lhs_val.toIntern()); |
| 15606 | } | 15564 | } |
| 15607 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) lz: { | 15565 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) lz: { |
| 15608 | if (maybe_rhs_val) |rhs_val| { | 15566 | if (maybe_rhs_val) |rhs_val| { |
| 15609 | if (rhs_val.isNan(mod)) { | 15567 | if (rhs_val.isNan(mod)) { |
| 15610 | return sema.addConstant(rhs_val); | 15568 | return Air.internedToRef(rhs_val.toIntern()); |
| 15611 | } | 15569 | } |
| 15612 | if (rhs_val.isInf(mod)) { | 15570 | if (rhs_val.isInf(mod)) { |
| 15613 | return sema.addConstant( | 15571 | return Air.internedToRef((try mod.floatValue(resolved_type, std.math.nan_f128)).toIntern()); |
| 15614 | try mod.floatValue(resolved_type, std.math.nan_f128), | | |
| 15615 | ); | | |
| 15616 | } | 15572 | } |
| 15617 | } else if (resolved_type.isAnyFloat()) { | 15573 | } else if (resolved_type.isAnyFloat()) { |
| 15618 | break :lz; | 15574 | break :lz; |
| 15619 | } | 15575 | } |
| 15620 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { | 15579 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15624 | return casted_rhs; | 15580 | return casted_rhs; |
| ... | @@ -15631,24 +15587,22 @@ fn analyzeArithmetic( | ... | @@ -15631,24 +15587,22 @@ fn analyzeArithmetic( |
| 15631 | if (is_int) { | 15587 | if (is_int) { |
| 15632 | return sema.failWithUseOfUndef(block, rhs_src); | 15588 | return sema.failWithUseOfUndef(block, rhs_src); |
| 15633 | } else { | 15589 | } else { |
| 15634 | return sema.addConstUndef(resolved_type); | 15590 | return mod.undefRef(resolved_type); |
| 15635 | } | 15591 | } |
| 15636 | } | 15592 | } |
| 15637 | if (rhs_val.isNan(mod)) { | 15593 | if (rhs_val.isNan(mod)) { |
| 15638 | return sema.addConstant(rhs_val); | 15594 | return Air.internedToRef(rhs_val.toIntern()); |
| 15639 | } | 15595 | } |
| 15640 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) rz: { | 15596 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) rz: { |
| 15641 | if (maybe_lhs_val) |lhs_val| { | 15597 | if (maybe_lhs_val) |lhs_val| { |
| 15642 | if (lhs_val.isInf(mod)) { | 15598 | if (lhs_val.isInf(mod)) { |
| 15643 | return sema.addConstant( | 15599 | return Air.internedToRef((try mod.floatValue(resolved_type, std.math.nan_f128)).toIntern()); |
| 15644 | try mod.floatValue(resolved_type, std.math.nan_f128), | | |
| 15645 | ); | | |
| 15646 | } | 15600 | } |
| 15647 | } else if (resolved_type.isAnyFloat()) { | 15601 | } else if (resolved_type.isAnyFloat()) { |
| 15648 | break :rz; | 15602 | break :rz; |
| 15649 | } | 15603 | } |
| 15650 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { | 15607 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15654 | return casted_lhs; | 15608 | return casted_lhs; |
| ... | @@ -15658,7 +15612,7 @@ fn analyzeArithmetic( | ... | @@ -15658,7 +15612,7 @@ fn analyzeArithmetic( |
| 15658 | if (is_int) { | 15612 | if (is_int) { |
| 15659 | return sema.failWithUseOfUndef(block, lhs_src); | 15613 | return sema.failWithUseOfUndef(block, lhs_src); |
| 15660 | } else { | 15614 | } else { |
| 15661 | return sema.addConstUndef(resolved_type); | 15615 | return mod.undefRef(resolved_type); |
| 15662 | } | 15616 | } |
| 15663 | } | 15617 | } |
| 15664 | if (is_int) { | 15618 | if (is_int) { |
| ... | @@ -15667,11 +15621,9 @@ fn analyzeArithmetic( | ... | @@ -15667,11 +15621,9 @@ fn analyzeArithmetic( |
| 15667 | if (overflow_idx) |vec_idx| { | 15621 | if (overflow_idx) |vec_idx| { |
| 15668 | return sema.failWithIntegerOverflow(block, src, resolved_type, product, vec_idx); | 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 | } else { | 15625 | } else { |
| 15672 | return sema.addConstant( | 15626 | return Air.internedToRef((try lhs_val.floatMul(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15673 | try lhs_val.floatMul(rhs_val, resolved_type, sema.arena, mod), | | |
| 15674 | ); | | |
| 15675 | } | 15627 | } |
| 15676 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .mul_safe }; | 15628 | } else break :rs .{ .src = lhs_src, .air_tag = air_tag, .air_tag_safe = .mul_safe }; |
| 15677 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .mul_safe }; | 15629 | } else break :rs .{ .src = rhs_src, .air_tag = air_tag, .air_tag_safe = .mul_safe }; |
| ... | @@ -15695,7 +15647,7 @@ fn analyzeArithmetic( | ... | @@ -15695,7 +15647,7 @@ fn analyzeArithmetic( |
| 15695 | if (!lhs_val.isUndef(mod)) { | 15647 | if (!lhs_val.isUndef(mod)) { |
| 15696 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15648 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15697 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { | 15652 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15701 | return casted_rhs; | 15653 | return casted_rhs; |
| ... | @@ -15704,22 +15656,20 @@ fn analyzeArithmetic( | ... | @@ -15704,22 +15656,20 @@ fn analyzeArithmetic( |
| 15704 | } | 15656 | } |
| 15705 | if (maybe_rhs_val) |rhs_val| { | 15657 | if (maybe_rhs_val) |rhs_val| { |
| 15706 | if (rhs_val.isUndef(mod)) { | 15658 | if (rhs_val.isUndef(mod)) { |
| 15707 | return sema.addConstUndef(resolved_type); | 15659 | return mod.undefRef(resolved_type); |
| 15708 | } | 15660 | } |
| 15709 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15661 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15710 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { | 15665 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15714 | return casted_lhs; | 15666 | return casted_lhs; |
| 15715 | } | 15667 | } |
| 15716 | if (maybe_lhs_val) |lhs_val| { | 15668 | if (maybe_lhs_val) |lhs_val| { |
| 15717 | if (lhs_val.isUndef(mod)) { | 15669 | if (lhs_val.isUndef(mod)) { |
| 15718 | return sema.addConstUndef(resolved_type); | 15670 | return mod.undefRef(resolved_type); |
| 15719 | } | 15671 | } |
| 15720 | return sema.addConstant( | 15672 | return Air.internedToRef((try lhs_val.numberMulWrap(rhs_val, resolved_type, sema.arena, mod)).toIntern()); |
| 15721 | try lhs_val.numberMulWrap(rhs_val, resolved_type, sema.arena, mod), | | |
| 15722 | ); | | |
| 15723 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_wrap, .air_tag_safe = .mul_wrap }; | 15673 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_wrap, .air_tag_safe = .mul_wrap }; |
| 15724 | } else break :rs .{ .src = rhs_src, .air_tag = .mul_wrap, .air_tag_safe = .mul_wrap }; | 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,7 +15692,7 @@ fn analyzeArithmetic( |
| 15742 | if (!lhs_val.isUndef(mod)) { | 15692 | if (!lhs_val.isUndef(mod)) { |
| 15743 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15693 | if (try lhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15744 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { | 15697 | if (try sema.compareAll(lhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15748 | return casted_rhs; | 15698 | return casted_rhs; |
| ... | @@ -15751,18 +15701,18 @@ fn analyzeArithmetic( | ... | @@ -15751,18 +15701,18 @@ fn analyzeArithmetic( |
| 15751 | } | 15701 | } |
| 15752 | if (maybe_rhs_val) |rhs_val| { | 15702 | if (maybe_rhs_val) |rhs_val| { |
| 15753 | if (rhs_val.isUndef(mod)) { | 15703 | if (rhs_val.isUndef(mod)) { |
| 15754 | return sema.addConstUndef(resolved_type); | 15704 | return mod.undefRef(resolved_type); |
| 15755 | } | 15705 | } |
| 15756 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { | 15706 | if (try rhs_val.compareAllWithZeroAdvanced(.eq, sema)) { |
| 15757 | const zero_val = try sema.splat(resolved_type, scalar_zero); | 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 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { | 15710 | if (try sema.compareAll(rhs_val, .eq, try sema.splat(resolved_type, scalar_one), resolved_type)) { |
| 15761 | return casted_lhs; | 15711 | return casted_lhs; |
| 15762 | } | 15712 | } |
| 15763 | if (maybe_lhs_val) |lhs_val| { | 15713 | if (maybe_lhs_val) |lhs_val| { |
| 15764 | if (lhs_val.isUndef(mod)) { | 15714 | if (lhs_val.isUndef(mod)) { |
| 15765 | return sema.addConstUndef(resolved_type); | 15715 | return mod.undefRef(resolved_type); |
| 15766 | } | 15716 | } |
| 15767 | | 15717 | |
| 15768 | const val = if (scalar_tag == .ComptimeInt) | 15718 | const val = if (scalar_tag == .ComptimeInt) |
| ... | @@ -15770,7 +15720,7 @@ fn analyzeArithmetic( | ... | @@ -15770,7 +15720,7 @@ fn analyzeArithmetic( |
| 15770 | else | 15720 | else |
| 15771 | try lhs_val.intMulSat(rhs_val, resolved_type, sema.arena, mod); | 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 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat, .air_tag_safe = .mul_sat }; | 15724 | } else break :rs .{ .src = lhs_src, .air_tag = .mul_sat, .air_tag_safe = .mul_sat }; |
| 15775 | } else break :rs .{ .src = rhs_src, .air_tag = .mul_sat, .air_tag_safe = .mul_sat }; | 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,7 +15745,7 @@ fn analyzeArithmetic( |
| 15795 | const op_ov = try block.addInst(.{ | 15745 | const op_ov = try block.addInst(.{ |
| 15796 | .tag = op_ov_tag, | 15746 | .tag = op_ov_tag, |
| 15797 | .data = .{ .ty_pl = .{ | 15747 | .data = .{ .ty_pl = .{ |
| 15798 | .ty = try sema.addType(op_ov_tuple_ty), | 15748 | .ty = Air.internedToRef(op_ov_tuple_ty.toIntern()), |
| 15799 | .payload = try sema.addExtra(Air.Bin{ | 15749 | .payload = try sema.addExtra(Air.Bin{ |
| 15800 | .lhs = casted_lhs, | 15750 | .lhs = casted_lhs, |
| 15801 | .rhs = casted_rhs, | 15751 | .rhs = casted_rhs, |
| ... | @@ -15813,7 +15763,7 @@ fn analyzeArithmetic( | ... | @@ -15813,7 +15763,7 @@ fn analyzeArithmetic( |
| 15813 | }) | 15763 | }) |
| 15814 | else | 15764 | else |
| 15815 | ov_bit; | 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 | const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov); | 15767 | const no_ov = try block.addBinOp(.cmp_eq, any_ov_bit, zero_ov); |
| 15818 | | 15768 | |
| 15819 | try sema.addSafetyCheck(block, src, no_ov, .integer_overflow); | 15769 | try sema.addSafetyCheck(block, src, no_ov, .integer_overflow); |
| ... | @@ -15885,7 +15835,7 @@ fn analyzePtrArithmetic( | ... | @@ -15885,7 +15835,7 @@ fn analyzePtrArithmetic( |
| 15885 | const runtime_src = rs: { | 15835 | const runtime_src = rs: { |
| 15886 | if (opt_ptr_val) |ptr_val| { | 15836 | if (opt_ptr_val) |ptr_val| { |
| 15887 | if (opt_off_val) |offset_val| { | 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 | const offset_int = try sema.usizeCast(block, offset_src, offset_val.toUnsignedInt(mod)); | 15840 | const offset_int = try sema.usizeCast(block, offset_src, offset_val.toUnsignedInt(mod)); |
| 15891 | if (offset_int == 0) return ptr; | 15841 | if (offset_int == 0) return ptr; |
| ... | @@ -15897,13 +15847,13 @@ fn analyzePtrArithmetic( | ... | @@ -15897,13 +15847,13 @@ fn analyzePtrArithmetic( |
| 15897 | else => unreachable, | 15847 | else => unreachable, |
| 15898 | }; | 15848 | }; |
| 15899 | const new_ptr_val = try mod.ptrIntValue(new_ptr_ty, new_addr); | 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 | if (air_tag == .ptr_sub) { | 15852 | if (air_tag == .ptr_sub) { |
| 15903 | return sema.fail(block, op_src, "TODO implement Sema comptime pointer subtraction", .{}); | 15853 | return sema.fail(block, op_src, "TODO implement Sema comptime pointer subtraction", .{}); |
| 15904 | } | 15854 | } |
| 15905 | const new_ptr_val = try ptr_val.elemPtr(new_ptr_ty, offset_int, mod); | 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 | } else break :rs offset_src; | 15857 | } else break :rs offset_src; |
| 15908 | } else break :rs ptr_src; | 15858 | } else break :rs ptr_src; |
| 15909 | }; | 15859 | }; |
| ... | @@ -15912,7 +15862,7 @@ fn analyzePtrArithmetic( | ... | @@ -15912,7 +15862,7 @@ fn analyzePtrArithmetic( |
| 15912 | return block.addInst(.{ | 15862 | return block.addInst(.{ |
| 15913 | .tag = air_tag, | 15863 | .tag = air_tag, |
| 15914 | .data = .{ .ty_pl = .{ | 15864 | .data = .{ .ty_pl = .{ |
| 15915 | .ty = try sema.addType(new_ptr_ty), | 15865 | .ty = Air.internedToRef(new_ptr_ty.toIntern()), |
| 15916 | .payload = try sema.addExtra(Air.Bin{ | 15866 | .payload = try sema.addExtra(Air.Bin{ |
| 15917 | .lhs = ptr, | 15867 | .lhs = ptr, |
| 15918 | .rhs = offset, | 15868 | .rhs = offset, |
| ... | @@ -15998,7 +15948,7 @@ fn zirAsm( | ... | @@ -15998,7 +15948,7 @@ fn zirAsm( |
| 15998 | arg.* = .none; | 15948 | arg.* = .none; |
| 15999 | const out_ty = try sema.resolveType(block, ret_ty_src, output.data.operand); | 15949 | const out_ty = try sema.resolveType(block, ret_ty_src, output.data.operand); |
| 16000 | try sema.queueFullTypeResolution(out_ty); | 15950 | try sema.queueFullTypeResolution(out_ty); |
| 16001 | expr_ty = try sema.addType(out_ty); | 15951 | expr_ty = Air.internedToRef(out_ty.toIntern()); |
| 16002 | } else { | 15952 | } else { |
| 16003 | arg.* = try sema.resolveInst(output.data.operand); | 15953 | arg.* = try sema.resolveInst(output.data.operand); |
| 16004 | } | 15954 | } |
| ... | @@ -16149,7 +16099,7 @@ fn zirCmpEq( | ... | @@ -16149,7 +16099,7 @@ fn zirCmpEq( |
| 16149 | if (try sema.resolveMaybeUndefVal(lhs)) |lval| { | 16099 | if (try sema.resolveMaybeUndefVal(lhs)) |lval| { |
| 16150 | if (try sema.resolveMaybeUndefVal(rhs)) |rval| { | 16100 | if (try sema.resolveMaybeUndefVal(rhs)) |rval| { |
| 16151 | if (lval.isUndef(mod) or rval.isUndef(mod)) { | 16101 | if (lval.isUndef(mod) or rval.isUndef(mod)) { |
| 16152 | return sema.addConstUndef(Type.bool); | 16102 | return mod.undefRef(Type.bool); |
| 16153 | } | 16103 | } |
| 16154 | const lkey = mod.intern_pool.indexToKey(lval.toIntern()); | 16104 | const lkey = mod.intern_pool.indexToKey(lval.toIntern()); |
| 16155 | const rkey = mod.intern_pool.indexToKey(rval.toIntern()); | 16105 | const rkey = mod.intern_pool.indexToKey(rval.toIntern()); |
| ... | @@ -16207,7 +16157,7 @@ fn analyzeCmpUnionTag( | ... | @@ -16207,7 +16157,7 @@ fn analyzeCmpUnionTag( |
| 16207 | const coerced_union = try sema.coerce(block, union_tag_ty, un, un_src); | 16157 | const coerced_union = try sema.coerce(block, union_tag_ty, un, un_src); |
| 16208 | | 16158 | |
| 16209 | if (try sema.resolveMaybeUndefVal(coerced_tag)) |enum_val| { | 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 | const field_ty = union_ty.unionFieldType(enum_val, mod); | 16161 | const field_ty = union_ty.unionFieldType(enum_val, mod); |
| 16212 | if (field_ty.zigTypeTag(mod) == .NoReturn) { | 16162 | if (field_ty.zigTypeTag(mod) == .NoReturn) { |
| 16213 | return Air.Inst.Ref.bool_false; | 16163 | return Air.Inst.Ref.bool_false; |
| ... | @@ -16309,13 +16259,13 @@ fn cmpSelf( | ... | @@ -16309,13 +16259,13 @@ fn cmpSelf( |
| 16309 | const resolved_type = sema.typeOf(casted_lhs); | 16259 | const resolved_type = sema.typeOf(casted_lhs); |
| 16310 | const runtime_src: LazySrcLoc = src: { | 16260 | const runtime_src: LazySrcLoc = src: { |
| 16311 | if (try sema.resolveMaybeUndefVal(casted_lhs)) |lhs_val| { | 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 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { | 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 | if (resolved_type.zigTypeTag(mod) == .Vector) { | 16266 | if (resolved_type.zigTypeTag(mod) == .Vector) { |
| 16317 | const cmp_val = try sema.compareVector(lhs_val, op, rhs_val, resolved_type); | 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 | if (try sema.compareAll(lhs_val, op, rhs_val, resolved_type)) { | 16271 | if (try sema.compareAll(lhs_val, op, rhs_val, resolved_type)) { |
| ... | @@ -16335,7 +16285,7 @@ fn cmpSelf( | ... | @@ -16335,7 +16285,7 @@ fn cmpSelf( |
| 16335 | // bool eq/neq more efficiently. | 16285 | // bool eq/neq more efficiently. |
| 16336 | if (resolved_type.zigTypeTag(mod) == .Bool) { | 16286 | if (resolved_type.zigTypeTag(mod) == .Bool) { |
| 16337 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { | 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 | return sema.runtimeBoolCmp(block, src, op, casted_lhs, rhs_val.toBool(), lhs_src); | 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,7 +16339,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 16389 | .ComptimeFloat, | 16339 | .ComptimeFloat, |
| 16390 | .ComptimeInt, | 16340 | .ComptimeInt, |
| 16391 | .Void, | 16341 | .Void, |
| 16392 | => return sema.addIntUnsigned(Type.comptime_int, 0), | 16342 | => return mod.intRef(Type.comptime_int, 0), |
| 16393 | | 16343 | |
| 16394 | .Bool, | 16344 | .Bool, |
| 16395 | .Int, | 16345 | .Int, |
| ... | @@ -16411,7 +16361,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -16411,7 +16361,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 16411 | if (val.isLazySize(mod)) { | 16361 | if (val.isLazySize(mod)) { |
| 16412 | try sema.queueFullTypeResolution(ty); | 16362 | try sema.queueFullTypeResolution(ty); |
| 16413 | } | 16363 | } |
| 16414 | return sema.addConstant(val); | 16364 | return Air.internedToRef(val.toIntern()); |
| 16415 | } | 16365 | } |
| 16416 | | 16366 | |
| 16417 | fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +16382,7 @@ fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 16432 | .ComptimeFloat, | 16382 | .ComptimeFloat, |
| 16433 | .ComptimeInt, | 16383 | .ComptimeInt, |
| 16434 | .Void, | 16384 | .Void, |
| 16435 | => return sema.addIntUnsigned(Type.comptime_int, 0), | 16385 | => return mod.intRef(Type.comptime_int, 0), |
| 16436 | | 16386 | |
| 16437 | .Bool, | 16387 | .Bool, |
| 16438 | .Int, | 16388 | .Int, |
| ... | @@ -16451,7 +16401,7 @@ fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A | ... | @@ -16451,7 +16401,7 @@ fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 16451 | => {}, | 16401 | => {}, |
| 16452 | } | 16402 | } |
| 16453 | const bit_size = try operand_ty.bitSizeAdvanced(mod, sema); | 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 | fn zirThis( | 16407 | fn zirThis( |
| ... | @@ -16575,7 +16525,7 @@ fn zirClosureGet(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! | ... | @@ -16575,7 +16525,7 @@ fn zirClosureGet(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 16575 | return block.addTy(.alloc, ty_ip_index.toType()); | 16525 | return block.addTy(.alloc, ty_ip_index.toType()); |
| 16576 | }, | 16526 | }, |
| 16577 | .comptime_val => |val_ip_index| { | 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,7 +16538,7 @@ fn zirRetAddr( |
| 16588 | _ = extended; | 16538 | _ = extended; |
| 16589 | if (block.is_comptime) { | 16539 | if (block.is_comptime) { |
| 16590 | // TODO: we could give a meaningful lazy value here. #14938 | 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 | } else { | 16542 | } else { |
| 16593 | return block.addNoOp(.ret_addr); | 16543 | return block.addNoOp(.ret_addr); |
| 16594 | } | 16544 | } |
| ... | @@ -16682,10 +16632,10 @@ fn zirBuiltinSrc( | ... | @@ -16682,10 +16632,10 @@ fn zirBuiltinSrc( |
| 16682 | // column: u32, | 16632 | // column: u32, |
| 16683 | (try mod.intValue(Type.u32, extra.column + 1)).toIntern(), | 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 | .ty = src_loc_ty.toIntern(), | 16636 | .ty = src_loc_ty.toIntern(), |
| 16687 | .storage = .{ .elems = &fields }, | 16637 | .storage = .{ .elems = &fields }, |
| 16688 | } })).toValue()); | 16638 | } }))); |
| 16689 | } | 16639 | } |
| 16690 | | 16640 | |
| 16691 | fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,11 +16658,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16708 | .Undefined, | 16658 | .Undefined, |
| 16709 | .Null, | 16659 | .Null, |
| 16710 | .EnumLiteral, | 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 | .ty = type_info_ty.toIntern(), | 16662 | .ty = type_info_ty.toIntern(), |
| 16713 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(type_info_tag))).toIntern(), | 16663 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(type_info_tag))).toIntern(), |
| 16714 | .val = .void_value, | 16664 | .val = .void_value, |
| 16715 | } })).toValue()), | 16665 | } }))), |
| 16716 | .Fn => { | 16666 | .Fn => { |
| 16717 | // TODO: look into memoizing this result. | 16667 | // TODO: look into memoizing this result. |
| 16718 | var params_anon_decl = try block.startAnonDecl(); | 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,14 +16769,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16819 | // args: []const Fn.Param, | 16769 | // args: []const Fn.Param, |
| 16820 | args_val, | 16770 | args_val, |
| 16821 | }; | 16771 | }; |
| 16822 | return sema.addConstant((try mod.intern(.{ .un = .{ | 16772 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16823 | .ty = type_info_ty.toIntern(), | 16773 | .ty = type_info_ty.toIntern(), |
| 16824 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Fn))).toIntern(), | 16774 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Fn))).toIntern(), |
| 16825 | .val = try mod.intern(.{ .aggregate = .{ | 16775 | .val = try mod.intern(.{ .aggregate = .{ |
| 16826 | .ty = fn_info_ty.toIntern(), | 16776 | .ty = fn_info_ty.toIntern(), |
| 16827 | .storage = .{ .elems = &field_values }, | 16777 | .storage = .{ .elems = &field_values }, |
| 16828 | } }), | 16778 | } }), |
| 16829 | } })).toValue()); | 16779 | } }))); |
| 16830 | }, | 16780 | }, |
| 16831 | .Int => { | 16781 | .Int => { |
| 16832 | const int_info_decl_index = (try sema.namespaceLookup( | 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,14 +16798,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16848 | // bits: u16, | 16798 | // bits: u16, |
| 16849 | (try mod.intValue(Type.u16, info.bits)).toIntern(), | 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 | .ty = type_info_ty.toIntern(), | 16802 | .ty = type_info_ty.toIntern(), |
| 16853 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Int))).toIntern(), | 16803 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Int))).toIntern(), |
| 16854 | .val = try mod.intern(.{ .aggregate = .{ | 16804 | .val = try mod.intern(.{ .aggregate = .{ |
| 16855 | .ty = int_info_ty.toIntern(), | 16805 | .ty = int_info_ty.toIntern(), |
| 16856 | .storage = .{ .elems = &field_values }, | 16806 | .storage = .{ .elems = &field_values }, |
| 16857 | } }), | 16807 | } }), |
| 16858 | } })).toValue()); | 16808 | } }))); |
| 16859 | }, | 16809 | }, |
| 16860 | .Float => { | 16810 | .Float => { |
| 16861 | const float_info_decl_index = (try sema.namespaceLookup( | 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,14 +16823,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16873 | // bits: u16, | 16823 | // bits: u16, |
| 16874 | (try mod.intValue(Type.u16, ty.bitSize(mod))).toIntern(), | 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 | .ty = type_info_ty.toIntern(), | 16827 | .ty = type_info_ty.toIntern(), |
| 16878 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Float))).toIntern(), | 16828 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Float))).toIntern(), |
| 16879 | .val = try mod.intern(.{ .aggregate = .{ | 16829 | .val = try mod.intern(.{ .aggregate = .{ |
| 16880 | .ty = float_info_ty.toIntern(), | 16830 | .ty = float_info_ty.toIntern(), |
| 16881 | .storage = .{ .elems = &field_vals }, | 16831 | .storage = .{ .elems = &field_vals }, |
| 16882 | } }), | 16832 | } }), |
| 16883 | } })).toValue()); | 16833 | } }))); |
| 16884 | }, | 16834 | }, |
| 16885 | .Pointer => { | 16835 | .Pointer => { |
| 16886 | const info = ty.ptrInfo(mod); | 16836 | const info = ty.ptrInfo(mod); |
| ... | @@ -16936,14 +16886,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -16936,14 +16886,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16936 | else => info.sentinel.toValue(), | 16886 | else => info.sentinel.toValue(), |
| 16937 | })).toIntern(), | 16887 | })).toIntern(), |
| 16938 | }; | 16888 | }; |
| 16939 | return sema.addConstant((try mod.intern(.{ .un = .{ | 16889 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 16940 | .ty = type_info_ty.toIntern(), | 16890 | .ty = type_info_ty.toIntern(), |
| 16941 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Pointer))).toIntern(), | 16891 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Pointer))).toIntern(), |
| 16942 | .val = try mod.intern(.{ .aggregate = .{ | 16892 | .val = try mod.intern(.{ .aggregate = .{ |
| 16943 | .ty = pointer_ty.toIntern(), | 16893 | .ty = pointer_ty.toIntern(), |
| 16944 | .storage = .{ .elems = &field_values }, | 16894 | .storage = .{ .elems = &field_values }, |
| 16945 | } }), | 16895 | } }), |
| 16946 | } })).toValue()); | 16896 | } }))); |
| 16947 | }, | 16897 | }, |
| 16948 | .Array => { | 16898 | .Array => { |
| 16949 | const array_field_ty = t: { | 16899 | const array_field_ty = t: { |
| ... | @@ -16968,14 +16918,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -16968,14 +16918,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16968 | // sentinel: ?*const anyopaque, | 16918 | // sentinel: ?*const anyopaque, |
| 16969 | (try sema.optRefValue(block, info.elem_type, info.sentinel)).toIntern(), | 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 | .ty = type_info_ty.toIntern(), | 16922 | .ty = type_info_ty.toIntern(), |
| 16973 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Array))).toIntern(), | 16923 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Array))).toIntern(), |
| 16974 | .val = try mod.intern(.{ .aggregate = .{ | 16924 | .val = try mod.intern(.{ .aggregate = .{ |
| 16975 | .ty = array_field_ty.toIntern(), | 16925 | .ty = array_field_ty.toIntern(), |
| 16976 | .storage = .{ .elems = &field_values }, | 16926 | .storage = .{ .elems = &field_values }, |
| 16977 | } }), | 16927 | } }), |
| 16978 | } })).toValue()); | 16928 | } }))); |
| 16979 | }, | 16929 | }, |
| 16980 | .Vector => { | 16930 | .Vector => { |
| 16981 | const vector_field_ty = t: { | 16931 | const vector_field_ty = t: { |
| ... | @@ -16998,14 +16948,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -16998,14 +16948,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 16998 | // child: type, | 16948 | // child: type, |
| 16999 | info.elem_type.toIntern(), | 16949 | info.elem_type.toIntern(), |
| 17000 | }; | 16950 | }; |
| 17001 | return sema.addConstant((try mod.intern(.{ .un = .{ | 16951 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17002 | .ty = type_info_ty.toIntern(), | 16952 | .ty = type_info_ty.toIntern(), |
| 17003 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Vector))).toIntern(), | 16953 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Vector))).toIntern(), |
| 17004 | .val = try mod.intern(.{ .aggregate = .{ | 16954 | .val = try mod.intern(.{ .aggregate = .{ |
| 17005 | .ty = vector_field_ty.toIntern(), | 16955 | .ty = vector_field_ty.toIntern(), |
| 17006 | .storage = .{ .elems = &field_values }, | 16956 | .storage = .{ .elems = &field_values }, |
| 17007 | } }), | 16957 | } }), |
| 17008 | } })).toValue()); | 16958 | } }))); |
| 17009 | }, | 16959 | }, |
| 17010 | .Optional => { | 16960 | .Optional => { |
| 17011 | const optional_field_ty = t: { | 16961 | const optional_field_ty = t: { |
| ... | @@ -17025,14 +16975,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -17025,14 +16975,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17025 | // child: type, | 16975 | // child: type, |
| 17026 | ty.optionalChild(mod).toIntern(), | 16976 | ty.optionalChild(mod).toIntern(), |
| 17027 | }; | 16977 | }; |
| 17028 | return sema.addConstant((try mod.intern(.{ .un = .{ | 16978 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17029 | .ty = type_info_ty.toIntern(), | 16979 | .ty = type_info_ty.toIntern(), |
| 17030 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Optional))).toIntern(), | 16980 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Optional))).toIntern(), |
| 17031 | .val = try mod.intern(.{ .aggregate = .{ | 16981 | .val = try mod.intern(.{ .aggregate = .{ |
| 17032 | .ty = optional_field_ty.toIntern(), | 16982 | .ty = optional_field_ty.toIntern(), |
| 17033 | .storage = .{ .elems = &field_values }, | 16983 | .storage = .{ .elems = &field_values }, |
| 17034 | } }), | 16984 | } }), |
| 17035 | } })).toValue()); | 16985 | } }))); |
| 17036 | }, | 16986 | }, |
| 17037 | .ErrorSet => { | 16987 | .ErrorSet => { |
| 17038 | var fields_anon_decl = try block.startAnonDecl(); | 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,11 +17085,11 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17135 | } }); | 17085 | } }); |
| 17136 | | 17086 | |
| 17137 | // Construct Type{ .ErrorSet = errors_val } | 17087 | // Construct Type{ .ErrorSet = errors_val } |
| 17138 | return sema.addConstant((try mod.intern(.{ .un = .{ | 17088 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17139 | .ty = type_info_ty.toIntern(), | 17089 | .ty = type_info_ty.toIntern(), |
| 17140 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.ErrorSet))).toIntern(), | 17090 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.ErrorSet))).toIntern(), |
| 17141 | .val = errors_val, | 17091 | .val = errors_val, |
| 17142 | } })).toValue()); | 17092 | } }))); |
| 17143 | }, | 17093 | }, |
| 17144 | .ErrorUnion => { | 17094 | .ErrorUnion => { |
| 17145 | const error_union_field_ty = t: { | 17095 | const error_union_field_ty = t: { |
| ... | @@ -17161,14 +17111,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -17161,14 +17111,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17161 | // payload: type, | 17111 | // payload: type, |
| 17162 | ty.errorUnionPayload(mod).toIntern(), | 17112 | ty.errorUnionPayload(mod).toIntern(), |
| 17163 | }; | 17113 | }; |
| 17164 | return sema.addConstant((try mod.intern(.{ .un = .{ | 17114 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17165 | .ty = type_info_ty.toIntern(), | 17115 | .ty = type_info_ty.toIntern(), |
| 17166 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.ErrorUnion))).toIntern(), | 17116 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.ErrorUnion))).toIntern(), |
| 17167 | .val = try mod.intern(.{ .aggregate = .{ | 17117 | .val = try mod.intern(.{ .aggregate = .{ |
| 17168 | .ty = error_union_field_ty.toIntern(), | 17118 | .ty = error_union_field_ty.toIntern(), |
| 17169 | .storage = .{ .elems = &field_values }, | 17119 | .storage = .{ .elems = &field_values }, |
| 17170 | } }), | 17120 | } }), |
| 17171 | } })).toValue()); | 17121 | } }))); |
| 17172 | }, | 17122 | }, |
| 17173 | .Enum => { | 17123 | .Enum => { |
| 17174 | // TODO: look into memoizing this result. | 17124 | // TODO: look into memoizing this result. |
| ... | @@ -17287,14 +17237,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -17287,14 +17237,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17287 | // is_exhaustive: bool, | 17237 | // is_exhaustive: bool, |
| 17288 | is_exhaustive.toIntern(), | 17238 | is_exhaustive.toIntern(), |
| 17289 | }; | 17239 | }; |
| 17290 | return sema.addConstant((try mod.intern(.{ .un = .{ | 17240 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17291 | .ty = type_info_ty.toIntern(), | 17241 | .ty = type_info_ty.toIntern(), |
| 17292 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Enum))).toIntern(), | 17242 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Enum))).toIntern(), |
| 17293 | .val = try mod.intern(.{ .aggregate = .{ | 17243 | .val = try mod.intern(.{ .aggregate = .{ |
| 17294 | .ty = type_enum_ty.toIntern(), | 17244 | .ty = type_enum_ty.toIntern(), |
| 17295 | .storage = .{ .elems = &field_values }, | 17245 | .storage = .{ .elems = &field_values }, |
| 17296 | } }), | 17246 | } }), |
| 17297 | } })).toValue()); | 17247 | } }))); |
| 17298 | }, | 17248 | }, |
| 17299 | .Union => { | 17249 | .Union => { |
| 17300 | // TODO: look into memoizing this result. | 17250 | // TODO: look into memoizing this result. |
| ... | @@ -17438,14 +17388,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -17438,14 +17388,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17438 | // decls: []const Declaration, | 17388 | // decls: []const Declaration, |
| 17439 | decls_val, | 17389 | decls_val, |
| 17440 | }; | 17390 | }; |
| 17441 | return sema.addConstant((try mod.intern(.{ .un = .{ | 17391 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17442 | .ty = type_info_ty.toIntern(), | 17392 | .ty = type_info_ty.toIntern(), |
| 17443 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Union))).toIntern(), | 17393 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Union))).toIntern(), |
| 17444 | .val = try mod.intern(.{ .aggregate = .{ | 17394 | .val = try mod.intern(.{ .aggregate = .{ |
| 17445 | .ty = type_union_ty.toIntern(), | 17395 | .ty = type_union_ty.toIntern(), |
| 17446 | .storage = .{ .elems = &field_values }, | 17396 | .storage = .{ .elems = &field_values }, |
| 17447 | } }), | 17397 | } }), |
| 17448 | } })).toValue()); | 17398 | } }))); |
| 17449 | }, | 17399 | }, |
| 17450 | .Struct => { | 17400 | .Struct => { |
| 17451 | // TODO: look into memoizing this result. | 17401 | // TODO: look into memoizing this result. |
| ... | @@ -17669,14 +17619,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -17669,14 +17619,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17669 | // is_tuple: bool, | 17619 | // is_tuple: bool, |
| 17670 | Value.makeBool(struct_ty.isTuple(mod)).toIntern(), | 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 | .ty = type_info_ty.toIntern(), | 17623 | .ty = type_info_ty.toIntern(), |
| 17674 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Struct))).toIntern(), | 17624 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Struct))).toIntern(), |
| 17675 | .val = try mod.intern(.{ .aggregate = .{ | 17625 | .val = try mod.intern(.{ .aggregate = .{ |
| 17676 | .ty = type_struct_ty.toIntern(), | 17626 | .ty = type_struct_ty.toIntern(), |
| 17677 | .storage = .{ .elems = &field_values }, | 17627 | .storage = .{ .elems = &field_values }, |
| 17678 | } }), | 17628 | } }), |
| 17679 | } })).toValue()); | 17629 | } }))); |
| 17680 | }, | 17630 | }, |
| 17681 | .Opaque => { | 17631 | .Opaque => { |
| 17682 | // TODO: look into memoizing this result. | 17632 | // TODO: look into memoizing this result. |
| ... | @@ -17701,14 +17651,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -17701,14 +17651,14 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 17701 | // decls: []const Declaration, | 17651 | // decls: []const Declaration, |
| 17702 | decls_val, | 17652 | decls_val, |
| 17703 | }; | 17653 | }; |
| 17704 | return sema.addConstant((try mod.intern(.{ .un = .{ | 17654 | return Air.internedToRef((try mod.intern(.{ .un = .{ |
| 17705 | .ty = type_info_ty.toIntern(), | 17655 | .ty = type_info_ty.toIntern(), |
| 17706 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Opaque))).toIntern(), | 17656 | .tag = (try mod.enumValueFieldIndex(type_info_tag_ty, @intFromEnum(std.builtin.TypeId.Opaque))).toIntern(), |
| 17707 | .val = try mod.intern(.{ .aggregate = .{ | 17657 | .val = try mod.intern(.{ .aggregate = .{ |
| 17708 | .ty = type_opaque_ty.toIntern(), | 17658 | .ty = type_opaque_ty.toIntern(), |
| 17709 | .storage = .{ .elems = &field_values }, | 17659 | .storage = .{ .elems = &field_values }, |
| 17710 | } }), | 17660 | } }), |
| 17711 | } })).toValue()); | 17661 | } }))); |
| 17712 | }, | 17662 | }, |
| 17713 | .Frame => return sema.failWithUseOfAsync(block, src), | 17663 | .Frame => return sema.failWithUseOfAsync(block, src), |
| 17714 | .AnyFrame => return sema.failWithUseOfAsync(block, src), | 17664 | .AnyFrame => return sema.failWithUseOfAsync(block, src), |
| ... | @@ -17842,7 +17792,7 @@ fn zirTypeof(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -17842,7 +17792,7 @@ fn zirTypeof(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 17842 | const inst_data = zir_datas[inst].un_node; | 17792 | const inst_data = zir_datas[inst].un_node; |
| 17843 | const operand = try sema.resolveInst(inst_data.operand); | 17793 | const operand = try sema.resolveInst(inst_data.operand); |
| 17844 | const operand_ty = sema.typeOf(operand); | 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 | fn zirTypeofBuiltin(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +17818,7 @@ fn zirTypeofBuiltin(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 17868 | const operand = try sema.resolveBody(&child_block, body, inst); | 17818 | const operand = try sema.resolveBody(&child_block, body, inst); |
| 17869 | const operand_ty = sema.typeOf(operand); | 17819 | const operand_ty = sema.typeOf(operand); |
| 17870 | if (operand_ty.isGenericPoison()) return error.GenericPoison; | 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 | fn zirTypeofLog2IntType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +17827,7 @@ fn zirTypeofLog2IntType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Compil |
| 17877 | const operand = try sema.resolveInst(inst_data.operand); | 17827 | const operand = try sema.resolveInst(inst_data.operand); |
| 17878 | const operand_ty = sema.typeOf(operand); | 17828 | const operand_ty = sema.typeOf(operand); |
| 17879 | const res_ty = try sema.log2IntType(block, operand_ty, src); | 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 | fn log2IntType(sema: *Sema, block: *Block, operand: Type, src: LazySrcLoc) CompileError!Type { | 17833 | fn log2IntType(sema: *Sema, block: *Block, operand: Type, src: LazySrcLoc) CompileError!Type { |
| ... | @@ -17956,7 +17906,7 @@ fn zirTypeofPeer( | ... | @@ -17956,7 +17906,7 @@ fn zirTypeofPeer( |
| 17956 | } | 17906 | } |
| 17957 | | 17907 | |
| 17958 | const result_type = try sema.resolvePeerTypes(block, src, inst_list, .{ .typeof_builtin_call_node_offset = extra.data.src_node }); | 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 | fn zirBoolNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +17922,7 @@ fn zirBoolNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 17972 | const operand = try sema.coerce(block, Type.bool, uncasted_operand, operand_src); | 17922 | const operand = try sema.coerce(block, Type.bool, uncasted_operand, operand_src); |
| 17973 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 17923 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 17974 | return if (val.isUndef(mod)) | 17924 | return if (val.isUndef(mod)) |
| 17975 | sema.addConstUndef(Type.bool) | 17925 | mod.undefRef(Type.bool) |
| 17976 | else if (val.toBool()) | 17926 | else if (val.toBool()) |
| 17977 | Air.Inst.Ref.bool_false | 17927 | Air.Inst.Ref.bool_false |
| 17978 | else | 17928 | else |
| ... | @@ -18348,7 +18298,7 @@ fn zirTryPtr(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileErr | ... | @@ -18348,7 +18298,7 @@ fn zirTryPtr(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileErr |
| 18348 | .address_space = ptr_info.flags.address_space, | 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 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, @typeInfo(Air.TryPtr).Struct.fields.len + | 18302 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, @typeInfo(Air.TryPtr).Struct.fields.len + |
| 18353 | sub_block.instructions.items.len); | 18303 | sub_block.instructions.items.len); |
| 18354 | const try_inst = try parent_block.addInst(.{ | 18304 | const try_inst = try parent_block.addInst(.{ |
| ... | @@ -18453,10 +18403,10 @@ fn zirRetErrValue( | ... | @@ -18453,10 +18403,10 @@ fn zirRetErrValue( |
| 18453 | const src = inst_data.src(); | 18403 | const src = inst_data.src(); |
| 18454 | // Return the error code from the function. | 18404 | // Return the error code from the function. |
| 18455 | const error_set_type = try mod.singleErrorSetType(err_name); | 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 | .ty = error_set_type.toIntern(), | 18407 | .ty = error_set_type.toIntern(), |
| 18458 | .name = err_name, | 18408 | .name = err_name, |
| 18459 | } })).toValue()); | 18409 | } }))); |
| 18460 | return sema.analyzeRet(block, result_inst, src); | 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,7 +18850,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 18900 | .host_size = host_size, | 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 | fn zirStructInitEmpty(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,7 +18865,7 @@ fn zirStructInitEmpty(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE |
| 18915 | switch (obj_ty.zigTypeTag(mod)) { | 18865 | switch (obj_ty.zigTypeTag(mod)) { |
| 18916 | .Struct => return sema.structInitEmpty(block, obj_ty, src, src), | 18866 | .Struct => return sema.structInitEmpty(block, obj_ty, src, src), |
| 18917 | .Array, .Vector => return sema.arrayInitEmpty(block, src, obj_ty), | 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 | .Union => return sema.fail(block, src, "union initializer must initialize one field", .{}), | 18869 | .Union => return sema.fail(block, src, "union initializer must initialize one field", .{}), |
| 18920 | else => return sema.failWithArrayInitNotSupported(block, src, obj_ty), | 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,10 +18901,10 @@ fn arrayInitEmpty(sema: *Sema, block: *Block, src: LazySrcLoc, obj_ty: Type) Com |
| 18951 | return sema.fail(block, src, "expected {d} vector elements; found 0", .{arr_len}); | 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 | .ty = obj_ty.toIntern(), | 18905 | .ty = obj_ty.toIntern(), |
| 18956 | .storage = .{ .elems = &.{} }, | 18906 | .storage = .{ .elems = &.{} }, |
| 18957 | } })).toValue()); | 18907 | } }))); |
| 18958 | } | 18908 | } |
| 18959 | | 18909 | |
| 18960 | fn zirUnionInit(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 18910 | fn zirUnionInit(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | @@ -18997,11 +18947,11 @@ fn unionInit( | ... | @@ -18997,11 +18947,11 @@ fn unionInit( |
| 18997 | const tag_ty = union_ty.unionTagTypeHypothetical(mod); | 18947 | const tag_ty = union_ty.unionTagTypeHypothetical(mod); |
| 18998 | const enum_field_index = @as(u32, @intCast(tag_ty.enumFieldIndex(field_name, mod).?)); | 18948 | const enum_field_index = @as(u32, @intCast(tag_ty.enumFieldIndex(field_name, mod).?)); |
| 18999 | const tag_val = try mod.enumValueFieldIndex(tag_ty, enum_field_index); | 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 | .ty = union_ty.toIntern(), | 18951 | .ty = union_ty.toIntern(), |
| 19002 | .tag = try tag_val.intern(tag_ty, mod), | 18952 | .tag = try tag_val.intern(tag_ty, mod), |
| 19003 | .val = try init_val.intern(field.ty, mod), | 18953 | .val = try init_val.intern(field.ty, mod), |
| 19004 | } })).toValue()); | 18954 | } }))); |
| 19005 | } | 18955 | } |
| 19006 | | 18956 | |
| 19007 | try sema.requireRuntimeBlock(block, init_src, null); | 18957 | try sema.requireRuntimeBlock(block, init_src, null); |
| ... | @@ -19125,7 +19075,7 @@ fn zirStructInit( | ... | @@ -19125,7 +19075,7 @@ fn zirStructInit( |
| 19125 | const alloc = try block.addTy(.alloc, alloc_ty); | 19075 | const alloc = try block.addTy(.alloc, alloc_ty); |
| 19126 | const field_ptr = try sema.unionFieldPtr(block, field_src, alloc, field_name, field_src, resolved_ty, true); | 19076 | const field_ptr = try sema.unionFieldPtr(block, field_src, alloc, field_name, field_src, resolved_ty, true); |
| 19127 | try sema.storePtr(block, src, field_ptr, init_inst); | 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 | _ = try block.addBinOp(.set_union_tag, alloc, new_tag); | 19079 | _ = try block.addBinOp(.set_union_tag, alloc, new_tag); |
| 19130 | return sema.makePtrConst(block, alloc); | 19080 | return sema.makePtrConst(block, alloc); |
| 19131 | } | 19081 | } |
| ... | @@ -19178,7 +19128,7 @@ fn finishStructInit( | ... | @@ -19178,7 +19128,7 @@ fn finishStructInit( |
| 19178 | } | 19128 | } |
| 19179 | } | 19129 | } |
| 19180 | } else { | 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,7 +19147,7 @@ fn finishStructInit( |
| 19197 | root_msg = try sema.errMsg(block, init_src, template, args); | 19147 | root_msg = try sema.errMsg(block, init_src, template, args); |
| 19198 | } | 19148 | } |
| 19199 | } else { | 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,7 +19442,7 @@ fn zirArrayInit( |
| 19492 | } | 19442 | } |
| 19493 | | 19443 | |
| 19494 | if (sentinel_val) |some| { | 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 | const opt_runtime_index: ?u32 = for (resolved_args, 0..) |arg, i| { | 19448 | const opt_runtime_index: ?u32 = for (resolved_args, 0..) |arg, i| { |
| ... | @@ -19541,9 +19491,9 @@ fn zirArrayInit( | ... | @@ -19541,9 +19491,9 @@ fn zirArrayInit( |
| 19541 | .child = array_ty.structFieldType(i, mod).toIntern(), | 19491 | .child = array_ty.structFieldType(i, mod).toIntern(), |
| 19542 | .flags = .{ .address_space = target_util.defaultAddressSpace(target, .local) }, | 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 | const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); | 19497 | const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); |
| 19548 | _ = try block.addBinOp(.store, elem_ptr, arg); | 19498 | _ = try block.addBinOp(.store, elem_ptr, arg); |
| 19549 | } | 19499 | } |
| ... | @@ -19554,10 +19504,10 @@ fn zirArrayInit( | ... | @@ -19554,10 +19504,10 @@ fn zirArrayInit( |
| 19554 | .child = array_ty.elemType2(mod).toIntern(), | 19504 | .child = array_ty.elemType2(mod).toIntern(), |
| 19555 | .flags = .{ .address_space = target_util.defaultAddressSpace(target, .local) }, | 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 | for (resolved_args, 0..) |arg, i| { | 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 | const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); | 19511 | const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref); |
| 19562 | _ = try block.addBinOp(.store, elem_ptr, arg); | 19512 | _ = try block.addBinOp(.store, elem_ptr, arg); |
| 19563 | } | 19513 | } |
| ... | @@ -19671,7 +19621,7 @@ fn addConstantMaybeRef( | ... | @@ -19671,7 +19621,7 @@ fn addConstantMaybeRef( |
| 19671 | val: Value, | 19621 | val: Value, |
| 19672 | is_ref: bool, | 19622 | is_ref: bool, |
| 19673 | ) !Air.Inst.Ref { | 19623 | ) !Air.Inst.Ref { |
| 19674 | if (!is_ref) return sema.addConstant(val); | 19624 | if (!is_ref) return Air.internedToRef(val.toIntern()); |
| 19675 | | 19625 | |
| 19676 | var anon_decl = try block.startAnonDecl(); | 19626 | var anon_decl = try block.startAnonDecl(); |
| 19677 | defer anon_decl.deinit(); | 19627 | defer anon_decl.deinit(); |
| ... | @@ -19730,13 +19680,13 @@ fn fieldType( | ... | @@ -19730,13 +19680,13 @@ fn fieldType( |
| 19730 | .Struct => switch (mod.intern_pool.indexToKey(cur_ty.toIntern())) { | 19680 | .Struct => switch (mod.intern_pool.indexToKey(cur_ty.toIntern())) { |
| 19731 | .anon_struct_type => |anon_struct| { | 19681 | .anon_struct_type => |anon_struct| { |
| 19732 | const field_index = try sema.anonStructFieldIndex(block, cur_ty, field_name, field_src); | 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 | .struct_type => |struct_type| { | 19685 | .struct_type => |struct_type| { |
| 19736 | const struct_obj = mod.structPtrUnwrap(struct_type.index).?; | 19686 | const struct_obj = mod.structPtrUnwrap(struct_type.index).?; |
| 19737 | const field = struct_obj.fields.get(field_name) orelse | 19687 | const field = struct_obj.fields.get(field_name) orelse |
| 19738 | return sema.failWithBadStructFieldAccess(block, struct_obj, field_src, field_name); | 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 | else => unreachable, | 19691 | else => unreachable, |
| 19742 | }, | 19692 | }, |
| ... | @@ -19744,7 +19694,7 @@ fn fieldType( | ... | @@ -19744,7 +19694,7 @@ fn fieldType( |
| 19744 | const union_obj = mod.typeToUnion(cur_ty).?; | 19694 | const union_obj = mod.typeToUnion(cur_ty).?; |
| 19745 | const field = union_obj.fields.get(field_name) orelse | 19695 | const field = union_obj.fields.get(field_name) orelse |
| 19746 | return sema.failWithBadUnionFieldAccess(block, union_obj, field_src, field_name); | 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 | .Optional => { | 19699 | .Optional => { |
| 19750 | // Struct/array init through optional requires the child type to not be a pointer. | 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,10 +19733,10 @@ fn getErrorReturnTrace(sema: *Sema, block: *Block) CompileError!Air.Inst.Ref { |
| 19783 | { | 19733 | { |
| 19784 | return block.addTy(.err_return_trace, opt_ptr_stack_trace_ty); | 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 | .ty = opt_ptr_stack_trace_ty.toIntern(), | 19737 | .ty = opt_ptr_stack_trace_ty.toIntern(), |
| 19788 | .val = .none, | 19738 | .val = .none, |
| 19789 | } })).toValue()); | 19739 | } }))); |
| 19790 | } | 19740 | } |
| 19791 | | 19741 | |
| 19792 | fn zirFrame( | 19742 | fn zirFrame( |
| ... | @@ -19810,7 +19760,7 @@ fn zirAlignOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -19810,7 +19760,7 @@ fn zirAlignOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 19810 | if (val.isLazyAlign(mod)) { | 19760 | if (val.isLazyAlign(mod)) { |
| 19811 | try sema.queueFullTypeResolution(ty); | 19761 | try sema.queueFullTypeResolution(ty); |
| 19812 | } | 19762 | } |
| 19813 | return sema.addConstant(val); | 19763 | return Air.internedToRef(val.toIntern()); |
| 19814 | } | 19764 | } |
| 19815 | | 19765 | |
| 19816 | fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 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,9 +19768,9 @@ fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 19818 | const inst_data = sema.code.instructions.items(.data)[inst].un_node; | 19768 | const inst_data = sema.code.instructions.items(.data)[inst].un_node; |
| 19819 | const operand = try sema.resolveInst(inst_data.operand); | 19769 | const operand = try sema.resolveInst(inst_data.operand); |
| 19820 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 19770 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 19821 | if (val.isUndef(mod)) return sema.addConstUndef(Type.u1); | 19771 | if (val.isUndef(mod)) return mod.undefRef(Type.u1); |
| 19822 | if (val.toBool()) return sema.addConstant(try mod.intValue(Type.u1, 1)); | 19772 | if (val.toBool()) return Air.internedToRef((try mod.intValue(Type.u1, 1)).toIntern()); |
| 19823 | return sema.addConstant(try mod.intValue(Type.u1, 0)); | 19773 | return Air.internedToRef((try mod.intValue(Type.u1, 0)).toIntern()); |
| 19824 | } | 19774 | } |
| 19825 | return block.addUnOp(.int_from_bool, operand); | 19775 | return block.addUnOp(.int_from_bool, operand); |
| 19826 | } | 19776 | } |
| ... | @@ -19878,17 +19828,17 @@ fn zirUnaryMath( | ... | @@ -19878,17 +19828,17 @@ fn zirUnaryMath( |
| 19878 | }); | 19828 | }); |
| 19879 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 19829 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 19880 | if (val.isUndef(mod)) | 19830 | if (val.isUndef(mod)) |
| 19881 | return sema.addConstUndef(result_ty); | 19831 | return mod.undefRef(result_ty); |
| 19882 | | 19832 | |
| 19883 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); | 19833 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| 19884 | for (elems, 0..) |*elem, i| { | 19834 | for (elems, 0..) |*elem, i| { |
| 19885 | const elem_val = try val.elemValue(sema.mod, i); | 19835 | const elem_val = try val.elemValue(sema.mod, i); |
| 19886 | elem.* = try (try eval(elem_val, scalar_ty, sema.arena, sema.mod)).intern(scalar_ty, mod); | 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 | .ty = result_ty.toIntern(), | 19839 | .ty = result_ty.toIntern(), |
| 19890 | .storage = .{ .elems = elems }, | 19840 | .storage = .{ .elems = elems }, |
| 19891 | } })).toValue()); | 19841 | } }))); |
| 19892 | } | 19842 | } |
| 19893 | | 19843 | |
| 19894 | try sema.requireRuntimeBlock(block, operand_src, null); | 19844 | try sema.requireRuntimeBlock(block, operand_src, null); |
| ... | @@ -19897,9 +19847,9 @@ fn zirUnaryMath( | ... | @@ -19897,9 +19847,9 @@ fn zirUnaryMath( |
| 19897 | .ComptimeFloat, .Float => { | 19847 | .ComptimeFloat, .Float => { |
| 19898 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { | 19848 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { |
| 19899 | if (operand_val.isUndef(mod)) | 19849 | if (operand_val.isUndef(mod)) |
| 19900 | return sema.addConstUndef(operand_ty); | 19850 | return mod.undefRef(operand_ty); |
| 19901 | const result_val = try eval(operand_val, operand_ty, sema.arena, sema.mod); | 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 | try sema.requireRuntimeBlock(block, operand_src, null); | 19855 | try sema.requireRuntimeBlock(block, operand_src, null); |
| ... | @@ -20024,7 +19974,7 @@ fn zirReify( | ... | @@ -20024,7 +19974,7 @@ fn zirReify( |
| 20024 | const signedness = mod.toEnum(std.builtin.Signedness, signedness_val); | 19974 | const signedness = mod.toEnum(std.builtin.Signedness, signedness_val); |
| 20025 | const bits = @as(u16, @intCast(bits_val.toUnsignedInt(mod))); | 19975 | const bits = @as(u16, @intCast(bits_val.toUnsignedInt(mod))); |
| 20026 | const ty = try mod.intType(signedness, bits); | 19976 | const ty = try mod.intType(signedness, bits); |
| 20027 | return sema.addType(ty); | 19977 | return Air.internedToRef(ty.toIntern()); |
| 20028 | }, | 19978 | }, |
| 20029 | .Vector => { | 19979 | .Vector => { |
| 20030 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 19980 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20044,7 +19994,7 @@ fn zirReify( | ... | @@ -20044,7 +19994,7 @@ fn zirReify( |
| 20044 | .len = len, | 19994 | .len = len, |
| 20045 | .child = child_ty.toIntern(), | 19995 | .child = child_ty.toIntern(), |
| 20046 | }); | 19996 | }); |
| 20047 | return sema.addType(ty); | 19997 | return Air.internedToRef(ty.toIntern()); |
| 20048 | }, | 19998 | }, |
| 20049 | .Float => { | 19999 | .Float => { |
| 20050 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 20000 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20061,7 +20011,7 @@ fn zirReify( | ... | @@ -20061,7 +20011,7 @@ fn zirReify( |
| 20061 | 128 => Type.f128, | 20011 | 128 => Type.f128, |
| 20062 | else => return sema.fail(block, src, "{}-bit float unsupported", .{bits}), | 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 | .Pointer => { | 20016 | .Pointer => { |
| 20067 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 20017 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20167,7 +20117,7 @@ fn zirReify( | ... | @@ -20167,7 +20117,7 @@ fn zirReify( |
| 20167 | .is_allowzero = is_allowzero_val.toBool(), | 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 | .Array => { | 20122 | .Array => { |
| 20173 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 20123 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20193,7 +20143,7 @@ fn zirReify( | ... | @@ -20193,7 +20143,7 @@ fn zirReify( |
| 20193 | .sentinel = if (sentinel) |s| s.toIntern() else .none, | 20143 | .sentinel = if (sentinel) |s| s.toIntern() else .none, |
| 20194 | .child = child_ty.toIntern(), | 20144 | .child = child_ty.toIntern(), |
| 20195 | }); | 20145 | }); |
| 20196 | return sema.addType(ty); | 20146 | return Air.internedToRef(ty.toIntern()); |
| 20197 | }, | 20147 | }, |
| 20198 | .Optional => { | 20148 | .Optional => { |
| 20199 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 20149 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20204,7 +20154,7 @@ fn zirReify( | ... | @@ -20204,7 +20154,7 @@ fn zirReify( |
| 20204 | const child_ty = child_val.toType(); | 20154 | const child_ty = child_val.toType(); |
| 20205 | | 20155 | |
| 20206 | const ty = try mod.optionalType(child_ty.toIntern()); | 20156 | const ty = try mod.optionalType(child_ty.toIntern()); |
| 20207 | return sema.addType(ty); | 20157 | return Air.internedToRef(ty.toIntern()); |
| 20208 | }, | 20158 | }, |
| 20209 | .ErrorUnion => { | 20159 | .ErrorUnion => { |
| 20210 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 20160 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20223,11 +20173,11 @@ fn zirReify( | ... | @@ -20223,11 +20173,11 @@ fn zirReify( |
| 20223 | } | 20173 | } |
| 20224 | | 20174 | |
| 20225 | const ty = try mod.errorUnionType(error_set_ty, payload_ty); | 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 | .ErrorSet => { | 20178 | .ErrorSet => { |
| 20229 | const payload_val = union_val.val.toValue().optionalValue(mod) orelse | 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 | const len = try sema.usizeCast(block, src, payload_val.sliceLen(mod)); | 20182 | const len = try sema.usizeCast(block, src, payload_val.sliceLen(mod)); |
| 20233 | var names: InferredErrorSet.NameMap = .{}; | 20183 | var names: InferredErrorSet.NameMap = .{}; |
| ... | @@ -20250,7 +20200,7 @@ fn zirReify( | ... | @@ -20250,7 +20200,7 @@ fn zirReify( |
| 20250 | } | 20200 | } |
| 20251 | | 20201 | |
| 20252 | const ty = try mod.errorSetFromUnsortedNames(names.keys()); | 20202 | const ty = try mod.errorSetFromUnsortedNames(names.keys()); |
| 20253 | return sema.addType(ty); | 20203 | return Air.internedToRef(ty.toIntern()); |
| 20254 | }, | 20204 | }, |
| 20255 | .Struct => { | 20205 | .Struct => { |
| 20256 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); | 20206 | const fields = ip.typeOf(union_val.val).toType().structFields(mod); |
| ... | @@ -20744,7 +20694,7 @@ fn zirReify( | ... | @@ -20744,7 +20694,7 @@ fn zirReify( |
| 20744 | .section_is_generic = false, | 20694 | .section_is_generic = false, |
| 20745 | .addrspace_is_generic = false, | 20695 | .addrspace_is_generic = false, |
| 20746 | }); | 20696 | }); |
| 20747 | return sema.addType(ty); | 20697 | return Air.internedToRef(ty.toIntern()); |
| 20748 | }, | 20698 | }, |
| 20749 | .Frame => return sema.failWithUseOfAsync(block, src), | 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,7 +21056,7 @@ fn zirIntFromFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 21106 | | 21056 | |
| 21107 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 21057 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21108 | const result_val = try sema.intFromFloat(block, operand_src, val, operand_ty, dest_ty); | 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 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { | 21060 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { |
| 21111 | return sema.failWithNeededComptime(block, operand_src, "value being casted to 'comptime_int' must be comptime-known"); | 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,17 +21064,17 @@ fn zirIntFromFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 21114 | try sema.requireRuntimeBlock(block, inst_data.src(), operand_src); | 21064 | try sema.requireRuntimeBlock(block, inst_data.src(), operand_src); |
| 21115 | if (dest_ty.intInfo(mod).bits == 0) { | 21065 | if (dest_ty.intInfo(mod).bits == 0) { |
| 21116 | if (block.wantSafety()) { | 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 | try sema.addSafetyCheck(block, src, ok, .integer_part_out_of_bounds); | 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 | const result = try block.addTyOp(if (block.float_mode == .Optimized) .int_from_float_optimized else .int_from_float, dest_ty, operand); | 21072 | const result = try block.addTyOp(if (block.float_mode == .Optimized) .int_from_float_optimized else .int_from_float, dest_ty, operand); |
| 21123 | if (block.wantSafety()) { | 21073 | if (block.wantSafety()) { |
| 21124 | const back = try block.addTyOp(.float_from_int, operand_ty, result); | 21074 | const back = try block.addTyOp(.float_from_int, operand_ty, result); |
| 21125 | const diff = try block.addBinOp(.sub, operand, back); | 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))); | 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())); |
| 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))); | 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 | const ok = try block.addBinOp(.bool_and, ok_pos, ok_neg); | 21078 | const ok = try block.addBinOp(.bool_and, ok_pos, ok_neg); |
| 21129 | try sema.addSafetyCheck(block, src, ok, .integer_part_out_of_bounds); | 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,7 +21096,7 @@ fn zirFloatFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErro |
| 21146 | | 21096 | |
| 21147 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 21097 | if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21148 | const result_val = try val.floatFromIntAdvanced(sema.arena, operand_ty, dest_ty, sema.mod, sema); | 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 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { | 21100 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { |
| 21151 | return sema.failWithNeededComptime(block, operand_src, "value being casted to 'comptime_float' must be comptime-known"); | 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,7 +21146,7 @@ fn zirPtrFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21196 | .Pointer => try mod.ptrIntValue(ptr_ty, addr), | 21146 | .Pointer => try mod.ptrIntValue(ptr_ty, addr), |
| 21197 | else => unreachable, | 21147 | else => unreachable, |
| 21198 | }; | 21148 | }; |
| 21199 | return sema.addConstant(ptr_val); | 21149 | return Air.internedToRef(ptr_val.toIntern()); |
| 21200 | } | 21150 | } |
| 21201 | | 21151 | |
| 21202 | try sema.requireRuntimeBlock(block, src, operand_src); | 21152 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | @@ -21207,9 +21157,7 @@ fn zirPtrFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! | ... | @@ -21207,9 +21157,7 @@ fn zirPtrFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21207 | } | 21157 | } |
| 21208 | | 21158 | |
| 21209 | if (ptr_align > 1) { | 21159 | if (ptr_align > 1) { |
| 21210 | const align_minus_1 = try sema.addConstant( | 21160 | const align_minus_1 = Air.internedToRef((try mod.intValue(Type.usize, ptr_align - 1)).toIntern()); |
| 21211 | try mod.intValue(Type.usize, ptr_align - 1), | | |
| 21212 | ); | | |
| 21213 | const remainder = try block.addBinOp(.bit_and, operand_coerced, align_minus_1); | 21161 | const remainder = try block.addBinOp(.bit_and, operand_coerced, align_minus_1); |
| 21214 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); | 21162 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); |
| 21215 | try sema.addSafetyCheck(block, src, is_aligned, .incorrect_alignment); | 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,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 | try sema.requireRuntimeBlock(block, src, operand_src); | 21247 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | @@ -21620,16 +21568,16 @@ fn ptrCastFull( | ... | @@ -21620,16 +21568,16 @@ fn ptrCastFull( |
| 21620 | } | 21568 | } |
| 21621 | } | 21569 | } |
| 21622 | if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { | 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 | const arr_len = try mod.intValue(Type.usize, src_info.child.toType().arrayLen(mod)); | 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 | .ty = dest_ty.toIntern(), | 21574 | .ty = dest_ty.toIntern(), |
| 21627 | .addr = mod.intern_pool.indexToKey(ptr_val.toIntern()).ptr.addr, | 21575 | .addr = mod.intern_pool.indexToKey(ptr_val.toIntern()).ptr.addr, |
| 21628 | .len = arr_len.toIntern(), | 21576 | .len = arr_len.toIntern(), |
| 21629 | } })).toValue()); | 21577 | } }))); |
| 21630 | } else { | 21578 | } else { |
| 21631 | assert(dest_ptr_ty.eql(dest_ty, mod)); | 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,9 +21598,7 @@ fn ptrCastFull( |
| 21650 | } | 21598 | } |
| 21651 | | 21599 | |
| 21652 | if (block.wantSafety() and dest_align > src_align and try sema.typeHasRuntimeBits(dest_info.child.toType())) { | 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( | 21601 | const align_minus_1 = Air.internedToRef((try mod.intValue(Type.usize, dest_align - 1)).toIntern()); |
| 21654 | try mod.intValue(Type.usize, dest_align - 1), | | |
| 21655 | ); | | |
| 21656 | const ptr_int = try block.addUnOp(.int_from_ptr, ptr); | 21602 | const ptr_int = try block.addUnOp(.int_from_ptr, ptr); |
| 21657 | const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); | 21603 | const remainder = try block.addBinOp(.bit_and, ptr_int, align_minus_1); |
| 21658 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); | 21604 | const is_aligned = try block.addBinOp(.cmp_eq, remainder, .zero_usize); |
| ... | @@ -21676,7 +21622,7 @@ fn ptrCastFull( | ... | @@ -21676,7 +21622,7 @@ fn ptrCastFull( |
| 21676 | const intermediate = try block.addInst(.{ | 21622 | const intermediate = try block.addInst(.{ |
| 21677 | .tag = .addrspace_cast, | 21623 | .tag = .addrspace_cast, |
| 21678 | .data = .{ .ty_op = .{ | 21624 | .data = .{ .ty_op = .{ |
| 21679 | .ty = try sema.addType(intermediate_ty), | 21625 | .ty = Air.internedToRef(intermediate_ty.toIntern()), |
| 21680 | .operand = ptr, | 21626 | .operand = ptr, |
| 21681 | } }, | 21627 | } }, |
| 21682 | }); | 21628 | }); |
| ... | @@ -21692,13 +21638,11 @@ fn ptrCastFull( | ... | @@ -21692,13 +21638,11 @@ fn ptrCastFull( |
| 21692 | if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { | 21638 | if (dest_info.flags.size == .Slice and src_info.flags.size != .Slice) { |
| 21693 | // We have to construct a slice using the operand's child's array length | 21639 | // We have to construct a slice using the operand's child's array length |
| 21694 | // Note that we know from the check at the start of the function that operand_ty is slice-like | 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( | 21641 | const arr_len = Air.internedToRef((try mod.intValue(Type.usize, src_info.child.toType().arrayLen(mod))).toIntern()); |
| 21696 | try mod.intValue(Type.usize, src_info.child.toType().arrayLen(mod)), | | |
| 21697 | ); | | |
| 21698 | return block.addInst(.{ | 21642 | return block.addInst(.{ |
| 21699 | .tag = .slice, | 21643 | .tag = .slice, |
| 21700 | .data = .{ .ty_pl = .{ | 21644 | .data = .{ .ty_pl = .{ |
| 21701 | .ty = try sema.addType(dest_ty), | 21645 | .ty = Air.internedToRef(dest_ty.toIntern()), |
| 21702 | .payload = try sema.addExtra(Air.Bin{ | 21646 | .payload = try sema.addExtra(Air.Bin{ |
| 21703 | .lhs = result_ptr, | 21647 | .lhs = result_ptr, |
| 21704 | .rhs = arr_len, | 21648 | .rhs = arr_len, |
| ... | @@ -21727,7 +21671,7 @@ fn zirPtrCastNoDest(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst | ... | @@ -21727,7 +21671,7 @@ fn zirPtrCastNoDest(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst |
| 21727 | const dest_ty = try mod.ptrType(ptr_info); | 21671 | const dest_ty = try mod.ptrType(ptr_info); |
| 21728 | | 21672 | |
| 21729 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { | 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 | try sema.requireRuntimeBlock(block, src, null); | 21677 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -21759,13 +21703,13 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai | ... | @@ -21759,13 +21703,13 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21759 | const dest_info = dest_scalar_ty.intInfo(mod); | 21703 | const dest_info = dest_scalar_ty.intInfo(mod); |
| 21760 | | 21704 | |
| 21761 | if (try sema.typeHasOnePossibleValue(dest_ty)) |val| { | 21705 | if (try sema.typeHasOnePossibleValue(dest_ty)) |val| { |
| 21762 | return sema.addConstant(val); | 21706 | return Air.internedToRef(val.toIntern()); |
| 21763 | } | 21707 | } |
| 21764 | | 21708 | |
| 21765 | if (operand_scalar_ty.zigTypeTag(mod) != .ComptimeInt) { | 21709 | if (operand_scalar_ty.zigTypeTag(mod) != .ComptimeInt) { |
| 21766 | const operand_info = operand_ty.intInfo(mod); | 21710 | const operand_info = operand_ty.intInfo(mod); |
| 21767 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { | 21711 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21768 | return sema.addConstant(val); | 21712 | return Air.internedToRef(val.toIntern()); |
| 21769 | } | 21713 | } |
| 21770 | | 21714 | |
| 21771 | if (operand_info.signedness != dest_info.signedness) { | 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,22 +21739,22 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21795 | } | 21739 | } |
| 21796 | | 21740 | |
| 21797 | if (try sema.resolveMaybeUndefValIntable(operand)) |val| { | 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 | if (!dest_is_vector) { | 21743 | if (!dest_is_vector) { |
| 21800 | return sema.addConstant(try mod.getCoerced( | 21744 | return Air.internedToRef((try mod.getCoerced( |
| 21801 | try val.intTrunc(operand_ty, sema.arena, dest_info.signedness, dest_info.bits, mod), | 21745 | try val.intTrunc(operand_ty, sema.arena, dest_info.signedness, dest_info.bits, mod), |
| 21802 | dest_ty, | 21746 | dest_ty, |
| 21803 | )); | 21747 | )).toIntern()); |
| 21804 | } | 21748 | } |
| 21805 | const elems = try sema.arena.alloc(InternPool.Index, operand_ty.vectorLen(mod)); | 21749 | const elems = try sema.arena.alloc(InternPool.Index, operand_ty.vectorLen(mod)); |
| 21806 | for (elems, 0..) |*elem, i| { | 21750 | for (elems, 0..) |*elem, i| { |
| 21807 | const elem_val = try val.elemValue(mod, i); | 21751 | const elem_val = try val.elemValue(mod, i); |
| 21808 | elem.* = try (try elem_val.intTrunc(operand_scalar_ty, sema.arena, dest_info.signedness, dest_info.bits, mod)).intern(dest_scalar_ty, mod); | 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 | .ty = dest_ty.toIntern(), | 21755 | .ty = dest_ty.toIntern(), |
| 21812 | .storage = .{ .elems = elems }, | 21756 | .storage = .{ .elems = elems }, |
| 21813 | } })).toValue()); | 21757 | } }))); |
| 21814 | } | 21758 | } |
| 21815 | | 21759 | |
| 21816 | try sema.requireRuntimeBlock(block, src, operand_src); | 21760 | try sema.requireRuntimeBlock(block, src, operand_src); |
| ... | @@ -21834,7 +21778,7 @@ fn zirBitCount( | ... | @@ -21834,7 +21778,7 @@ fn zirBitCount( |
| 21834 | const bits = operand_ty.intInfo(mod).bits; | 21778 | const bits = operand_ty.intInfo(mod).bits; |
| 21835 | | 21779 | |
| 21836 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { | 21780 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21837 | return sema.addConstant(val); | 21781 | return Air.internedToRef(val.toIntern()); |
| 21838 | } | 21782 | } |
| 21839 | | 21783 | |
| 21840 | const result_scalar_ty = try mod.smallestUnsignedInt(bits); | 21784 | const result_scalar_ty = try mod.smallestUnsignedInt(bits); |
| ... | @@ -21846,7 +21790,7 @@ fn zirBitCount( | ... | @@ -21846,7 +21790,7 @@ fn zirBitCount( |
| 21846 | .child = result_scalar_ty.toIntern(), | 21790 | .child = result_scalar_ty.toIntern(), |
| 21847 | }); | 21791 | }); |
| 21848 | if (try sema.resolveMaybeUndefVal(operand)) |val| { | 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 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); | 21795 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| 21852 | const scalar_ty = operand_ty.scalarType(mod); | 21796 | const scalar_ty = operand_ty.scalarType(mod); |
| ... | @@ -21855,10 +21799,10 @@ fn zirBitCount( | ... | @@ -21855,10 +21799,10 @@ fn zirBitCount( |
| 21855 | const count = comptimeOp(elem_val, scalar_ty, mod); | 21799 | const count = comptimeOp(elem_val, scalar_ty, mod); |
| 21856 | elem.* = (try mod.intValue(result_scalar_ty, count)).toIntern(); | 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 | .ty = result_ty.toIntern(), | 21803 | .ty = result_ty.toIntern(), |
| 21860 | .storage = .{ .elems = elems }, | 21804 | .storage = .{ .elems = elems }, |
| 21861 | } })).toValue()); | 21805 | } }))); |
| 21862 | } else { | 21806 | } else { |
| 21863 | try sema.requireRuntimeBlock(block, src, operand_src); | 21807 | try sema.requireRuntimeBlock(block, src, operand_src); |
| 21864 | return block.addTyOp(air_tag, result_ty, operand); | 21808 | return block.addTyOp(air_tag, result_ty, operand); |
| ... | @@ -21866,8 +21810,8 @@ fn zirBitCount( | ... | @@ -21866,8 +21810,8 @@ fn zirBitCount( |
| 21866 | }, | 21810 | }, |
| 21867 | .Int => { | 21811 | .Int => { |
| 21868 | if (try sema.resolveMaybeUndefLazyVal(operand)) |val| { | 21812 | if (try sema.resolveMaybeUndefLazyVal(operand)) |val| { |
| 21869 | if (val.isUndef(mod)) return sema.addConstUndef(result_scalar_ty); | 21813 | if (val.isUndef(mod)) return mod.undefRef(result_scalar_ty); |
| 21870 | return sema.addIntUnsigned(result_scalar_ty, comptimeOp(val, operand_ty, mod)); | 21814 | return mod.intRef(result_scalar_ty, comptimeOp(val, operand_ty, mod)); |
| 21871 | } else { | 21815 | } else { |
| 21872 | try sema.requireRuntimeBlock(block, src, operand_src); | 21816 | try sema.requireRuntimeBlock(block, src, operand_src); |
| 21873 | return block.addTyOp(air_tag, result_scalar_ty, operand); | 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,15 +21840,15 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21896 | } | 21840 | } |
| 21897 | | 21841 | |
| 21898 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { | 21842 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21899 | return sema.addConstant(val); | 21843 | return Air.internedToRef(val.toIntern()); |
| 21900 | } | 21844 | } |
| 21901 | | 21845 | |
| 21902 | switch (operand_ty.zigTypeTag(mod)) { | 21846 | switch (operand_ty.zigTypeTag(mod)) { |
| 21903 | .Int => { | 21847 | .Int => { |
| 21904 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { | 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 | const result_val = try val.byteSwap(operand_ty, mod, sema.arena); | 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 | } else operand_src; | 21852 | } else operand_src; |
| 21909 | | 21853 | |
| 21910 | try sema.requireRuntimeBlock(block, src, runtime_src); | 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,7 +21857,7 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21913 | .Vector => { | 21857 | .Vector => { |
| 21914 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { | 21858 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21915 | if (val.isUndef(mod)) | 21859 | if (val.isUndef(mod)) |
| 21916 | return sema.addConstUndef(operand_ty); | 21860 | return mod.undefRef(operand_ty); |
| 21917 | | 21861 | |
| 21918 | const vec_len = operand_ty.vectorLen(mod); | 21862 | const vec_len = operand_ty.vectorLen(mod); |
| 21919 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); | 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,10 +21865,10 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 21921 | const elem_val = try val.elemValue(mod, i); | 21865 | const elem_val = try val.elemValue(mod, i); |
| 21922 | elem.* = try (try elem_val.byteSwap(scalar_ty, mod, sema.arena)).intern(scalar_ty, mod); | 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 | .ty = operand_ty.toIntern(), | 21869 | .ty = operand_ty.toIntern(), |
| 21926 | .storage = .{ .elems = elems }, | 21870 | .storage = .{ .elems = elems }, |
| 21927 | } })).toValue()); | 21871 | } }))); |
| 21928 | } else operand_src; | 21872 | } else operand_src; |
| 21929 | | 21873 | |
| 21930 | try sema.requireRuntimeBlock(block, src, runtime_src); | 21874 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | @@ -21943,16 +21887,16 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! | ... | @@ -21943,16 +21887,16 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21943 | const scalar_ty = try sema.checkIntOrVector(block, operand, operand_src); | 21887 | const scalar_ty = try sema.checkIntOrVector(block, operand, operand_src); |
| 21944 | | 21888 | |
| 21945 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { | 21889 | if (try sema.typeHasOnePossibleValue(operand_ty)) |val| { |
| 21946 | return sema.addConstant(val); | 21890 | return Air.internedToRef(val.toIntern()); |
| 21947 | } | 21891 | } |
| 21948 | | 21892 | |
| 21949 | const mod = sema.mod; | 21893 | const mod = sema.mod; |
| 21950 | switch (operand_ty.zigTypeTag(mod)) { | 21894 | switch (operand_ty.zigTypeTag(mod)) { |
| 21951 | .Int => { | 21895 | .Int => { |
| 21952 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { | 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 | const result_val = try val.bitReverse(operand_ty, mod, sema.arena); | 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 | } else operand_src; | 21900 | } else operand_src; |
| 21957 | | 21901 | |
| 21958 | try sema.requireRuntimeBlock(block, src, runtime_src); | 21902 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | @@ -21961,7 +21905,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! | ... | @@ -21961,7 +21905,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21961 | .Vector => { | 21905 | .Vector => { |
| 21962 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { | 21906 | const runtime_src = if (try sema.resolveMaybeUndefVal(operand)) |val| { |
| 21963 | if (val.isUndef(mod)) | 21907 | if (val.isUndef(mod)) |
| 21964 | return sema.addConstUndef(operand_ty); | 21908 | return mod.undefRef(operand_ty); |
| 21965 | | 21909 | |
| 21966 | const vec_len = operand_ty.vectorLen(mod); | 21910 | const vec_len = operand_ty.vectorLen(mod); |
| 21967 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); | 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,10 +21913,10 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21969 | const elem_val = try val.elemValue(mod, i); | 21913 | const elem_val = try val.elemValue(mod, i); |
| 21970 | elem.* = try (try elem_val.bitReverse(scalar_ty, mod, sema.arena)).intern(scalar_ty, mod); | 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 | .ty = operand_ty.toIntern(), | 21917 | .ty = operand_ty.toIntern(), |
| 21974 | .storage = .{ .elems = elems }, | 21918 | .storage = .{ .elems = elems }, |
| 21975 | } })).toValue()); | 21919 | } }))); |
| 21976 | } else operand_src; | 21920 | } else operand_src; |
| 21977 | | 21921 | |
| 21978 | try sema.requireRuntimeBlock(block, src, runtime_src); | 21922 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| ... | @@ -21984,13 +21928,13 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! | ... | @@ -21984,13 +21928,13 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 21984 | | 21928 | |
| 21985 | fn zirBitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 21929 | fn zirBitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 21986 | const offset = try sema.bitOffsetOf(block, inst); | 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 | fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 21934 | fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| 21991 | const offset = try sema.bitOffsetOf(block, inst); | 21935 | const offset = try sema.bitOffsetOf(block, inst); |
| 21992 | // TODO reminder to make this a compile error for packed structs | 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 | fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 { | 21940 | fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 { |
| ... | @@ -22622,10 +22566,10 @@ fn zirCmpxchg( | ... | @@ -22622,10 +22566,10 @@ fn zirCmpxchg( |
| 22622 | | 22566 | |
| 22623 | // special case zero bit types | 22567 | // special case zero bit types |
| 22624 | if ((try sema.typeHasOnePossibleValue(elem_ty)) != null) { | 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 | .ty = result_ty.toIntern(), | 22570 | .ty = result_ty.toIntern(), |
| 22627 | .val = .none, | 22571 | .val = .none, |
| 22628 | } })).toValue()); | 22572 | } }))); |
| 22629 | } | 22573 | } |
| 22630 | | 22574 | |
| 22631 | const runtime_src = if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| rs: { | 22575 | const runtime_src = if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| rs: { |
| ... | @@ -22634,7 +22578,7 @@ fn zirCmpxchg( | ... | @@ -22634,7 +22578,7 @@ fn zirCmpxchg( |
| 22634 | if (expected_val.isUndef(mod) or new_val.isUndef(mod)) { | 22578 | if (expected_val.isUndef(mod) or new_val.isUndef(mod)) { |
| 22635 | // TODO: this should probably cause the memory stored at the pointer | 22579 | // TODO: this should probably cause the memory stored at the pointer |
| 22636 | // to become undef as well | 22580 | // to become undef as well |
| 22637 | return sema.addConstUndef(result_ty); | 22581 | return mod.undefRef(result_ty); |
| 22638 | } | 22582 | } |
| 22639 | const ptr_ty = sema.typeOf(ptr); | 22583 | const ptr_ty = sema.typeOf(ptr); |
| 22640 | const stored_val = (try sema.pointerDeref(block, ptr_src, ptr_val, ptr_ty)) orelse break :rs ptr_src; | 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,7 +22589,7 @@ fn zirCmpxchg( |
| 22645 | break :blk .none; | 22589 | break :blk .none; |
| 22646 | } else stored_val.toIntern(), | 22590 | } else stored_val.toIntern(), |
| 22647 | } }); | 22591 | } }); |
| 22648 | return sema.addConstant(result_val.toValue()); | 22592 | return Air.internedToRef(result_val); |
| 22649 | } else break :rs new_value_src; | 22593 | } else break :rs new_value_src; |
| 22650 | } else break :rs expected_src; | 22594 | } else break :rs expected_src; |
| 22651 | } else ptr_src; | 22595 | } else ptr_src; |
| ... | @@ -22657,7 +22601,7 @@ fn zirCmpxchg( | ... | @@ -22657,7 +22601,7 @@ fn zirCmpxchg( |
| 22657 | return block.addInst(.{ | 22601 | return block.addInst(.{ |
| 22658 | .tag = air_tag, | 22602 | .tag = air_tag, |
| 22659 | .data = .{ .ty_pl = .{ | 22603 | .data = .{ .ty_pl = .{ |
| 22660 | .ty = try sema.addType(result_ty), | 22604 | .ty = Air.internedToRef(result_ty.toIntern()), |
| 22661 | .payload = try sema.addExtra(Air.Cmpxchg{ | 22605 | .payload = try sema.addExtra(Air.Cmpxchg{ |
| 22662 | .ptr = ptr, | 22606 | .ptr = ptr, |
| 22663 | .expected_value = expected_value, | 22607 | .expected_value = expected_value, |
| ... | @@ -22682,8 +22626,8 @@ fn zirSplat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I | ... | @@ -22682,8 +22626,8 @@ fn zirSplat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I |
| 22682 | const scalar_ty = dest_ty.childType(mod); | 22626 | const scalar_ty = dest_ty.childType(mod); |
| 22683 | const scalar = try sema.coerce(block, scalar_ty, operand, scalar_src); | 22627 | const scalar = try sema.coerce(block, scalar_ty, operand, scalar_src); |
| 22684 | if (try sema.resolveMaybeUndefVal(scalar)) |scalar_val| { | 22628 | if (try sema.resolveMaybeUndefVal(scalar)) |scalar_val| { |
| 22685 | if (scalar_val.isUndef(mod)) return sema.addConstUndef(dest_ty); | 22629 | if (scalar_val.isUndef(mod)) return mod.undefRef(dest_ty); |
| 22686 | return sema.addConstant(try sema.splat(dest_ty, scalar_val)); | 22630 | return Air.internedToRef((try sema.splat(dest_ty, scalar_val)).toIntern()); |
| 22687 | } | 22631 | } |
| 22688 | | 22632 | |
| 22689 | try sema.requireRuntimeBlock(block, inst_data.src(), scalar_src); | 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,7 +22674,7 @@ fn zirReduce(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 22730 | } | 22674 | } |
| 22731 | | 22675 | |
| 22732 | if (try sema.resolveMaybeUndefVal(operand)) |operand_val| { | 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 | var accum: Value = try operand_val.elemValue(mod, 0); | 22679 | var accum: Value = try operand_val.elemValue(mod, 0); |
| 22736 | var i: u32 = 1; | 22680 | var i: u32 = 1; |
| ... | @@ -22746,7 +22690,7 @@ fn zirReduce(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -22746,7 +22690,7 @@ fn zirReduce(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 22746 | .Mul => accum = try accum.numberMulWrap(elem_val, scalar_ty, sema.arena, mod), | 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 | try sema.requireRuntimeBlock(block, inst_data.src(), operand_src); | 22696 | try sema.requireRuntimeBlock(block, inst_data.src(), operand_src); |
| ... | @@ -22825,7 +22769,7 @@ fn analyzeShuffle( | ... | @@ -22825,7 +22769,7 @@ fn analyzeShuffle( |
| 22825 | }), | 22769 | }), |
| 22826 | }; | 22770 | }; |
| 22827 | if (maybe_a_len == null and maybe_b_len == null) { | 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 | const a_len = @as(u32, @intCast(maybe_a_len orelse maybe_b_len.?)); | 22774 | const a_len = @as(u32, @intCast(maybe_a_len orelse maybe_b_len.?)); |
| 22831 | const b_len = @as(u32, @intCast(maybe_b_len orelse a_len)); | 22775 | const b_len = @as(u32, @intCast(maybe_b_len orelse a_len)); |
| ... | @@ -22839,8 +22783,8 @@ fn analyzeShuffle( | ... | @@ -22839,8 +22783,8 @@ fn analyzeShuffle( |
| 22839 | .child = elem_ty.toIntern(), | 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); | 22786 | if (maybe_a_len == null) a = try mod.undefRef(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); | 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 | const operand_info = [2]std.meta.Tuple(&.{ u64, LazySrcLoc, Type }){ | 22789 | const operand_info = [2]std.meta.Tuple(&.{ u64, LazySrcLoc, Type }){ |
| 22846 | .{ a_len, a_src, a_ty }, | 22790 | .{ a_len, a_src, a_ty }, |
| ... | @@ -22893,10 +22837,10 @@ fn analyzeShuffle( | ... | @@ -22893,10 +22837,10 @@ fn analyzeShuffle( |
| 22893 | const unsigned = if (int >= 0) @as(u32, @intCast(int)) else @as(u32, @intCast(~int)); | 22837 | const unsigned = if (int >= 0) @as(u32, @intCast(int)) else @as(u32, @intCast(~int)); |
| 22894 | values[i] = try (try (if (int >= 0) a_val else b_val).elemValue(mod, unsigned)).intern(elem_ty, mod); | 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 | .ty = res_ty.toIntern(), | 22841 | .ty = res_ty.toIntern(), |
| 22898 | .storage = .{ .elems = values }, | 22842 | .storage = .{ .elems = values }, |
| 22899 | } })).toValue()); | 22843 | } }))); |
| 22900 | } | 22844 | } |
| 22901 | } | 22845 | } |
| 22902 | | 22846 | |
| ... | @@ -22923,10 +22867,10 @@ fn analyzeShuffle( | ... | @@ -22923,10 +22867,10 @@ fn analyzeShuffle( |
| 22923 | } }); | 22867 | } }); |
| 22924 | | 22868 | |
| 22925 | if (a_len < b_len) { | 22869 | if (a_len < b_len) { |
| 22926 | const undef = try sema.addConstUndef(a_ty); | 22870 | const undef = try mod.undefRef(a_ty); |
| 22927 | a = try sema.analyzeShuffle(block, src_node, elem_ty, a, undef, expand_mask.toValue(), @as(u32, @intCast(max_len))); | 22871 | a = try sema.analyzeShuffle(block, src_node, elem_ty, a, undef, expand_mask.toValue(), @as(u32, @intCast(max_len))); |
| 22928 | } else { | 22872 | } else { |
| 22929 | const undef = try sema.addConstUndef(b_ty); | 22873 | const undef = try mod.undefRef(b_ty); |
| 22930 | b = try sema.analyzeShuffle(block, src_node, elem_ty, b, undef, expand_mask.toValue(), @as(u32, @intCast(max_len))); | 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,7 +22878,7 @@ fn analyzeShuffle( |
| 22934 | return block.addInst(.{ | 22878 | return block.addInst(.{ |
| 22935 | .tag = .shuffle, | 22879 | .tag = .shuffle, |
| 22936 | .data = .{ .ty_pl = .{ | 22880 | .data = .{ .ty_pl = .{ |
| 22937 | .ty = try sema.addType(res_ty), | 22881 | .ty = Air.internedToRef(res_ty.toIntern()), |
| 22938 | .payload = try block.sema.addExtra(Air.Shuffle{ | 22882 | .payload = try block.sema.addExtra(Air.Shuffle{ |
| 22939 | .a = a, | 22883 | .a = a, |
| 22940 | .b = b, | 22884 | .b = b, |
| ... | @@ -22984,13 +22928,13 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C | ... | @@ -22984,13 +22928,13 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C |
| 22984 | const maybe_b = try sema.resolveMaybeUndefVal(b); | 22928 | const maybe_b = try sema.resolveMaybeUndefVal(b); |
| 22985 | | 22929 | |
| 22986 | const runtime_src = if (maybe_pred) |pred_val| rs: { | 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 | if (maybe_a) |a_val| { | 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 | if (maybe_b) |b_val| { | 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 | const elems = try sema.gpa.alloc(InternPool.Index, vec_len); | 22939 | const elems = try sema.gpa.alloc(InternPool.Index, vec_len); |
| 22996 | for (elems, 0..) |*elem, i| { | 22940 | for (elems, 0..) |*elem, i| { |
| ... | @@ -22999,25 +22943,25 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C | ... | @@ -22999,25 +22943,25 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C |
| 22999 | elem.* = try (try (if (should_choose_a) a_val else b_val).elemValue(mod, i)).intern(elem_ty, mod); | 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 | .ty = vec_ty.toIntern(), | 22947 | .ty = vec_ty.toIntern(), |
| 23004 | .storage = .{ .elems = elems }, | 22948 | .storage = .{ .elems = elems }, |
| 23005 | } })).toValue()); | 22949 | } }))); |
| 23006 | } else { | 22950 | } else { |
| 23007 | break :rs b_src; | 22951 | break :rs b_src; |
| 23008 | } | 22952 | } |
| 23009 | } else { | 22953 | } else { |
| 23010 | if (maybe_b) |b_val| { | 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 | break :rs a_src; | 22957 | break :rs a_src; |
| 23014 | } | 22958 | } |
| 23015 | } else rs: { | 22959 | } else rs: { |
| 23016 | if (maybe_a) |a_val| { | 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 | if (maybe_b) |b_val| { | 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 | break :rs pred_src; | 22966 | break :rs pred_src; |
| 23023 | }; | 22967 | }; |
| ... | @@ -23061,12 +23005,12 @@ fn zirAtomicLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! | ... | @@ -23061,12 +23005,12 @@ fn zirAtomicLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError! |
| 23061 | } | 23005 | } |
| 23062 | | 23006 | |
| 23063 | if (try sema.typeHasOnePossibleValue(elem_ty)) |val| { | 23007 | if (try sema.typeHasOnePossibleValue(elem_ty)) |val| { |
| 23064 | return sema.addConstant(val); | 23008 | return Air.internedToRef(val.toIntern()); |
| 23065 | } | 23009 | } |
| 23066 | | 23010 | |
| 23067 | if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { | 23011 | if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { |
| 23068 | if (try sema.pointerDeref(block, ptr_src, ptr_val, sema.typeOf(ptr))) |elem_val| { | 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,7 +23063,7 @@ fn zirAtomicRmw(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 23119 | | 23063 | |
| 23120 | // special case zero bit types | 23064 | // special case zero bit types |
| 23121 | if (try sema.typeHasOnePossibleValue(elem_ty)) |val| { | 23065 | if (try sema.typeHasOnePossibleValue(elem_ty)) |val| { |
| 23122 | return sema.addConstant(val); | 23066 | return Air.internedToRef(val.toIntern()); |
| 23123 | } | 23067 | } |
| 23124 | | 23068 | |
| 23125 | const runtime_src = if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| rs: { | 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,7 +23089,7 @@ fn zirAtomicRmw(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A |
| 23145 | // zig fmt: on | 23089 | // zig fmt: on |
| 23146 | }; | 23090 | }; |
| 23147 | try sema.storePtrVal(block, src, ptr_val, new_val, elem_ty); | 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 | } else break :rs ptr_src; | 23093 | } else break :rs ptr_src; |
| 23150 | } else ptr_src; | 23094 | } else ptr_src; |
| 23151 | | 23095 | |
| ... | @@ -23224,27 +23168,27 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. | ... | @@ -23224,27 +23168,27 @@ fn zirMulAdd(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. |
| 23224 | | 23168 | |
| 23225 | const runtime_src = if (maybe_mulend1) |mulend1_val| rs: { | 23169 | const runtime_src = if (maybe_mulend1) |mulend1_val| rs: { |
| 23226 | if (maybe_mulend2) |mulend2_val| { | 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 | if (maybe_addend) |addend_val| { | 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 | const result_val = try Value.mulAdd(ty, mulend1_val, mulend2_val, addend_val, sema.arena, sema.mod); | 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 | } else { | 23177 | } else { |
| 23234 | break :rs addend_src; | 23178 | break :rs addend_src; |
| 23235 | } | 23179 | } |
| 23236 | } else { | 23180 | } else { |
| 23237 | if (maybe_addend) |addend_val| { | 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 | break :rs mulend2_src; | 23184 | break :rs mulend2_src; |
| 23241 | } | 23185 | } |
| 23242 | } else rs: { | 23186 | } else rs: { |
| 23243 | if (maybe_mulend2) |mulend2_val| { | 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 | if (maybe_addend) |addend_val| { | 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 | break :rs mulend1_src; | 23193 | break :rs mulend1_src; |
| 23250 | }; | 23194 | }; |
| ... | @@ -23453,7 +23397,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr | ... | @@ -23453,7 +23397,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 23453 | }; | 23397 | }; |
| 23454 | return sema.failWithOwnedErrorMsg(msg); | 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 | try sema.requireRuntimeBlock(block, src, ptr_src); | 23403 | try sema.requireRuntimeBlock(block, src, ptr_src); |
| ... | @@ -23461,7 +23405,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr | ... | @@ -23461,7 +23405,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr |
| 23461 | return block.addInst(.{ | 23405 | return block.addInst(.{ |
| 23462 | .tag = .field_parent_ptr, | 23406 | .tag = .field_parent_ptr, |
| 23463 | .data = .{ .ty_pl = .{ | 23407 | .data = .{ .ty_pl = .{ |
| 23464 | .ty = try sema.addType(result_ptr), | 23408 | .ty = Air.internedToRef(result_ptr.toIntern()), |
| 23465 | .payload = try block.sema.addExtra(Air.FieldParentPtr{ | 23409 | .payload = try block.sema.addExtra(Air.FieldParentPtr{ |
| 23466 | .field_ptr = casted_field_ptr, | 23410 | .field_ptr = casted_field_ptr, |
| 23467 | .field_index = @as(u32, @intCast(field_index)), | 23411 | .field_index = @as(u32, @intCast(field_index)), |
| ... | @@ -23611,7 +23555,7 @@ fn analyzeMinMax( | ... | @@ -23611,7 +23555,7 @@ fn analyzeMinMax( |
| 23611 | | 23555 | |
| 23612 | const vec_len = simd_op.len orelse { | 23556 | const vec_len = simd_op.len orelse { |
| 23613 | const result_val = opFunc(cur_val, operand_val, mod); | 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 | continue; | 23559 | continue; |
| 23616 | }; | 23560 | }; |
| 23617 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); | 23561 | const elems = try sema.arena.alloc(InternPool.Index, vec_len); |
| ... | @@ -23621,10 +23565,10 @@ fn analyzeMinMax( | ... | @@ -23621,10 +23565,10 @@ fn analyzeMinMax( |
| 23621 | const uncoerced_elem = opFunc(lhs_elem_val, rhs_elem_val, mod); | 23565 | const uncoerced_elem = opFunc(lhs_elem_val, rhs_elem_val, mod); |
| 23622 | elem.* = (try mod.getCoerced(uncoerced_elem, simd_op.scalar_ty)).toIntern(); | 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 | .ty = simd_op.result_ty.toIntern(), | 23569 | .ty = simd_op.result_ty.toIntern(), |
| 23626 | .storage = .{ .elems = elems }, | 23570 | .storage = .{ .elems = elems }, |
| 23627 | } })).toValue()); | 23571 | } }))); |
| 23628 | } | 23572 | } |
| 23629 | | 23573 | |
| 23630 | const opt_runtime_idx = runtime_known.findFirstSet(); | 23574 | const opt_runtime_idx = runtime_known.findFirstSet(); |
| ... | @@ -23699,7 +23643,7 @@ fn analyzeMinMax( | ... | @@ -23699,7 +23643,7 @@ fn analyzeMinMax( |
| 23699 | const rhs_src = operand_srcs[idx]; | 23643 | const rhs_src = operand_srcs[idx]; |
| 23700 | const simd_op = try sema.checkSimdBinOp(block, src, lhs, rhs, lhs_src, rhs_src); | 23644 | const simd_op = try sema.checkSimdBinOp(block, src, lhs, rhs, lhs_src, rhs_src); |
| 23701 | if (known_undef) { | 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 | } else { | 23647 | } else { |
| 23704 | cur_minmax = try block.addBinOp(air_tag, simd_op.lhs, simd_op.rhs); | 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,7 +23799,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 23855 | const len_u64 = (try len_val.?.getUnsignedIntAdvanced(mod, sema)).?; | 23799 | const len_u64 = (try len_val.?.getUnsignedIntAdvanced(mod, sema)).?; |
| 23856 | const len = try sema.usizeCast(block, dest_src, len_u64); | 23800 | const len = try sema.usizeCast(block, dest_src, len_u64); |
| 23857 | for (0..len) |i| { | 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 | const dest_elem_ptr = try sema.elemPtrOneLayerOnly( | 23803 | const dest_elem_ptr = try sema.elemPtrOneLayerOnly( |
| 23860 | block, | 23804 | block, |
| 23861 | src, | 23805 | src, |
| ... | @@ -23942,7 +23886,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -23942,7 +23886,7 @@ fn zirMemcpy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 23942 | // Aliasing safety check. | 23886 | // Aliasing safety check. |
| 23943 | if (block.wantSafety()) { | 23887 | if (block.wantSafety()) { |
| 23944 | const len = if (len_val) |v| | 23888 | const len = if (len_val) |v| |
| 23945 | try sema.addConstant(v) | 23889 | Air.internedToRef(v.toIntern()) |
| 23946 | else if (dest_len != .none) | 23890 | else if (dest_len != .none) |
| 23947 | dest_len | 23891 | dest_len |
| 23948 | else | 23892 | else |
| ... | @@ -24025,7 +23969,7 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void | ... | @@ -24025,7 +23969,7 @@ fn zirMemset(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void |
| 24025 | if (!ptr_val.isComptimeMutablePtr(mod)) break :rs dest_src; | 23969 | if (!ptr_val.isComptimeMutablePtr(mod)) break :rs dest_src; |
| 24026 | if (try sema.resolveMaybeUndefVal(uncoerced_elem)) |_| { | 23970 | if (try sema.resolveMaybeUndefVal(uncoerced_elem)) |_| { |
| 24027 | for (0..len) |i| { | 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 | const elem_ptr = try sema.elemPtrOneLayerOnly( | 23973 | const elem_ptr = try sema.elemPtrOneLayerOnly( |
| 24030 | block, | 23974 | block, |
| 24031 | src, | 23975 | src, |
| ... | @@ -24142,7 +24086,7 @@ fn zirVarExtended( | ... | @@ -24142,7 +24086,7 @@ fn zirVarExtended( |
| 24142 | | 24086 | |
| 24143 | try sema.validateVarType(block, ty_src, var_ty, small.is_extern); | 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 | .ty = var_ty.toIntern(), | 24090 | .ty = var_ty.toIntern(), |
| 24147 | .init = init_val, | 24091 | .init = init_val, |
| 24148 | .decl = sema.owner_decl_index, | 24092 | .decl = sema.owner_decl_index, |
| ... | @@ -24152,7 +24096,7 @@ fn zirVarExtended( | ... | @@ -24152,7 +24096,7 @@ fn zirVarExtended( |
| 24152 | )).toOptional() else .none, | 24096 | )).toOptional() else .none, |
| 24153 | .is_extern = small.is_extern, | 24097 | .is_extern = small.is_extern, |
| 24154 | .is_threadlocal = small.is_threadlocal, | 24098 | .is_threadlocal = small.is_threadlocal, |
| 24155 | } })).toValue()); | 24099 | } }))); |
| 24156 | } | 24100 | } |
| 24157 | | 24101 | |
| 24158 | fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 24102 | fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { |
| ... | @@ -24650,14 +24594,14 @@ fn zirBuiltinExtern( | ... | @@ -24650,14 +24594,14 @@ fn zirBuiltinExtern( |
| 24650 | try mod.declareDeclDependency(sema.owner_decl_index, new_decl_index); | 24594 | try mod.declareDeclDependency(sema.owner_decl_index, new_decl_index); |
| 24651 | try sema.ensureDeclAnalyzed(new_decl_index); | 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 | .ty = switch (mod.intern_pool.indexToKey(ty.toIntern())) { | 24598 | .ty = switch (mod.intern_pool.indexToKey(ty.toIntern())) { |
| 24655 | .ptr_type => ty.toIntern(), | 24599 | .ptr_type => ty.toIntern(), |
| 24656 | .opt_type => |child_type| child_type, | 24600 | .opt_type => |child_type| child_type, |
| 24657 | else => unreachable, | 24601 | else => unreachable, |
| 24658 | }, | 24602 | }, |
| 24659 | .addr = .{ .decl = new_decl_index }, | 24603 | .addr = .{ .decl = new_decl_index }, |
| 24660 | } })).toValue(), ty)); | 24604 | } })).toValue(), ty)).toIntern()); |
| 24661 | } | 24605 | } |
| 24662 | | 24606 | |
| 24663 | fn zirWorkItem( | 24607 | fn zirWorkItem( |
| ... | @@ -25259,13 +25203,13 @@ fn panicWithMsg(sema: *Sema, block: *Block, src: LazySrcLoc, msg_inst: Air.Inst. | ... | @@ -25259,13 +25203,13 @@ fn panicWithMsg(sema: *Sema, block: *Block, src: LazySrcLoc, msg_inst: Air.Inst. |
| 25259 | | 25203 | |
| 25260 | const panic_func = mod.funcInfo(mod.panic_func_index); | 25204 | const panic_func = mod.funcInfo(mod.panic_func_index); |
| 25261 | const panic_fn = try sema.analyzeDeclVal(block, .unneeded, panic_func.owner_decl); | 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 | const opt_usize_ty = try mod.optionalType(.usize_type); | 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 | .ty = opt_usize_ty.toIntern(), | 25210 | .ty = opt_usize_ty.toIntern(), |
| 25267 | .val = .none, | 25211 | .val = .none, |
| 25268 | } })).toValue()); | 25212 | } }))); |
| 25269 | try sema.callBuiltin(block, src, panic_fn, .auto, &.{ msg_inst, null_stack_trace, null_ret_addr }, operation); | 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,7 +25298,7 @@ fn panicSentinelMismatch( |
| 25354 | assert(!parent_block.is_comptime); | 25298 | assert(!parent_block.is_comptime); |
| 25355 | const mod = sema.mod; | 25299 | const mod = sema.mod; |
| 25356 | const expected_sentinel_val = maybe_sentinel orelse return; | 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 | const ptr_ty = sema.typeOf(ptr); | 25303 | const ptr_ty = sema.typeOf(ptr); |
| 25360 | const actual_sentinel = if (ptr_ty.isSlice(mod)) | 25304 | const actual_sentinel = if (ptr_ty.isSlice(mod)) |
| ... | @@ -25478,9 +25422,7 @@ fn fieldVal( | ... | @@ -25478,9 +25422,7 @@ fn fieldVal( |
| 25478 | switch (inner_ty.zigTypeTag(mod)) { | 25422 | switch (inner_ty.zigTypeTag(mod)) { |
| 25479 | .Array => { | 25423 | .Array => { |
| 25480 | if (ip.stringEqlSlice(field_name, "len")) { | 25424 | if (ip.stringEqlSlice(field_name, "len")) { |
| 25481 | return sema.addConstant( | 25425 | return Air.internedToRef((try mod.intValue(Type.usize, inner_ty.arrayLen(mod))).toIntern()); |
| 25482 | try mod.intValue(Type.usize, inner_ty.arrayLen(mod)), | | |
| 25483 | ); | | |
| 25484 | } else if (ip.stringEqlSlice(field_name, "ptr") and is_pointer_to) { | 25426 | } else if (ip.stringEqlSlice(field_name, "ptr") and is_pointer_to) { |
| 25485 | const ptr_info = object_ty.ptrInfo(mod); | 25427 | const ptr_info = object_ty.ptrInfo(mod); |
| 25486 | const result_ty = try mod.ptrType(.{ | 25428 | const result_ty = try mod.ptrType(.{ |
| ... | @@ -25570,10 +25512,10 @@ fn fieldVal( | ... | @@ -25570,10 +25512,10 @@ fn fieldVal( |
| 25570 | child_type | 25512 | child_type |
| 25571 | else | 25513 | else |
| 25572 | try mod.singleErrorSetType(field_name); | 25514 | try mod.singleErrorSetType(field_name); |
| 25573 | return sema.addConstant((try mod.intern(.{ .err = .{ | 25515 | return Air.internedToRef((try mod.intern(.{ .err = .{ |
| 25574 | .ty = error_set_type.toIntern(), | 25516 | .ty = error_set_type.toIntern(), |
| 25575 | .name = field_name, | 25517 | .name = field_name, |
| 25576 | } })).toValue()); | 25518 | } }))); |
| 25577 | }, | 25519 | }, |
| 25578 | .Union => { | 25520 | .Union => { |
| 25579 | if (child_type.getNamespaceIndex(mod).unwrap()) |namespace| { | 25521 | if (child_type.getNamespaceIndex(mod).unwrap()) |namespace| { |
| ... | @@ -25585,9 +25527,7 @@ fn fieldVal( | ... | @@ -25585,9 +25527,7 @@ fn fieldVal( |
| 25585 | if (union_ty.unionTagType(mod)) |enum_ty| { | 25527 | if (union_ty.unionTagType(mod)) |enum_ty| { |
| 25586 | if (enum_ty.enumFieldIndex(field_name, mod)) |field_index_usize| { | 25528 | if (enum_ty.enumFieldIndex(field_name, mod)) |field_index_usize| { |
| 25587 | const field_index = @as(u32, @intCast(field_index_usize)); | 25529 | const field_index = @as(u32, @intCast(field_index_usize)); |
| 25588 | return sema.addConstant( | 25530 | return Air.internedToRef((try mod.enumValueFieldIndex(enum_ty, field_index)).toIntern()); |
| 25589 | try mod.enumValueFieldIndex(enum_ty, field_index), | | |
| 25590 | ); | | |
| 25591 | } | 25531 | } |
| 25592 | } | 25532 | } |
| 25593 | return sema.failWithBadMemberAccess(block, union_ty, field_name_src, field_name); | 25533 | return sema.failWithBadMemberAccess(block, union_ty, field_name_src, field_name); |
| ... | @@ -25602,7 +25542,7 @@ fn fieldVal( | ... | @@ -25602,7 +25542,7 @@ fn fieldVal( |
| 25602 | return sema.failWithBadMemberAccess(block, child_type, field_name_src, field_name); | 25542 | return sema.failWithBadMemberAccess(block, child_type, field_name_src, field_name); |
| 25603 | const field_index = @as(u32, @intCast(field_index_usize)); | 25543 | const field_index = @as(u32, @intCast(field_index_usize)); |
| 25604 | const enum_val = try mod.enumValueFieldIndex(child_type, field_index); | 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 | .Struct, .Opaque => { | 25547 | .Struct, .Opaque => { |
| 25608 | if (child_type.getNamespaceIndex(mod).unwrap()) |namespace| { | 25548 | if (child_type.getNamespaceIndex(mod).unwrap()) |namespace| { |
| ... | @@ -25714,13 +25654,13 @@ fn fieldPtr( | ... | @@ -25714,13 +25654,13 @@ fn fieldPtr( |
| 25714 | }); | 25654 | }); |
| 25715 | | 25655 | |
| 25716 | if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| { | 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 | .ty = result_ty.toIntern(), | 25658 | .ty = result_ty.toIntern(), |
| 25719 | .addr = .{ .field = .{ | 25659 | .addr = .{ .field = .{ |
| 25720 | .base = val.toIntern(), | 25660 | .base = val.toIntern(), |
| 25721 | .index = Value.slice_ptr_index, | 25661 | .index = Value.slice_ptr_index, |
| 25722 | } }, | 25662 | } }, |
| 25723 | } })).toValue()); | 25663 | } }))); |
| 25724 | } | 25664 | } |
| 25725 | try sema.requireRuntimeBlock(block, src, null); | 25665 | try sema.requireRuntimeBlock(block, src, null); |
| 25726 | | 25666 | |
| ... | @@ -25736,13 +25676,13 @@ fn fieldPtr( | ... | @@ -25736,13 +25676,13 @@ fn fieldPtr( |
| 25736 | }); | 25676 | }); |
| 25737 | | 25677 | |
| 25738 | if (try sema.resolveDefinedValue(block, object_ptr_src, inner_ptr)) |val| { | 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 | .ty = result_ty.toIntern(), | 25680 | .ty = result_ty.toIntern(), |
| 25741 | .addr = .{ .field = .{ | 25681 | .addr = .{ .field = .{ |
| 25742 | .base = val.toIntern(), | 25682 | .base = val.toIntern(), |
| 25743 | .index = Value.slice_len_index, | 25683 | .index = Value.slice_len_index, |
| 25744 | } }, | 25684 | } }, |
| 25745 | } })).toValue()); | 25685 | } }))); |
| 25746 | } | 25686 | } |
| 25747 | try sema.requireRuntimeBlock(block, src, null); | 25687 | try sema.requireRuntimeBlock(block, src, null); |
| 25748 | | 25688 | |
| ... | @@ -25924,7 +25864,7 @@ fn fieldCallBind( | ... | @@ -25924,7 +25864,7 @@ fn fieldCallBind( |
| 25924 | return sema.finishFieldCallBind(block, src, ptr_ty, field.ty, field_index, object_ptr); | 25864 | return sema.finishFieldCallBind(block, src, ptr_ty, field.ty, field_index, object_ptr); |
| 25925 | } else if (struct_ty.isTuple(mod)) { | 25865 | } else if (struct_ty.isTuple(mod)) { |
| 25926 | if (ip.stringEqlSlice(field_name, "len")) { | 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 | if (field_name.toUnsigned(ip)) |field_index| { | 25869 | if (field_name.toUnsigned(ip)) |field_index| { |
| 25930 | if (field_index >= struct_ty.structFieldCount(mod)) break :find_field; | 25870 | if (field_index >= struct_ty.structFieldCount(mod)) break :find_field; |
| ... | @@ -26064,18 +26004,18 @@ fn finishFieldCallBind( | ... | @@ -26064,18 +26004,18 @@ fn finishFieldCallBind( |
| 26064 | const container_ty = ptr_ty.childType(mod); | 26004 | const container_ty = ptr_ty.childType(mod); |
| 26065 | if (container_ty.zigTypeTag(mod) == .Struct) { | 26005 | if (container_ty.zigTypeTag(mod) == .Struct) { |
| 26066 | if (try container_ty.structFieldValueComptime(mod, field_index)) |default_val| { | 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 | if (try sema.resolveDefinedValue(block, src, object_ptr)) |struct_ptr_val| { | 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 | .ty = ptr_field_ty.toIntern(), | 26013 | .ty = ptr_field_ty.toIntern(), |
| 26074 | .addr = .{ .field = .{ | 26014 | .addr = .{ .field = .{ |
| 26075 | .base = struct_ptr_val.toIntern(), | 26015 | .base = struct_ptr_val.toIntern(), |
| 26076 | .index = field_index, | 26016 | .index = field_index, |
| 26077 | } }, | 26017 | } }, |
| 26078 | } })).toValue()); | 26018 | } }))); |
| 26079 | return .{ .direct = try sema.analyzeLoad(block, src, pointer, src) }; | 26019 | return .{ .direct = try sema.analyzeLoad(block, src, pointer, src) }; |
| 26080 | } | 26020 | } |
| 26081 | | 26021 | |
| ... | @@ -26152,7 +26092,7 @@ fn structFieldPtr( | ... | @@ -26152,7 +26092,7 @@ fn structFieldPtr( |
| 26152 | | 26092 | |
| 26153 | if (struct_ty.isTuple(mod)) { | 26093 | if (struct_ty.isTuple(mod)) { |
| 26154 | if (mod.intern_pool.stringEqlSlice(field_name, "len")) { | 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 | return sema.analyzeRef(block, src, len_inst); | 26096 | return sema.analyzeRef(block, src, len_inst); |
| 26157 | } | 26097 | } |
| 26158 | const field_index = try sema.tupleFieldIndex(block, struct_ty, field_name, field_name_src); | 26098 | const field_index = try sema.tupleFieldIndex(block, struct_ty, field_name, field_name_src); |
| ... | @@ -26269,7 +26209,7 @@ fn structFieldPtrByIndex( | ... | @@ -26269,7 +26209,7 @@ fn structFieldPtrByIndex( |
| 26269 | .ty = ptr_field_ty.toIntern(), | 26209 | .ty = ptr_field_ty.toIntern(), |
| 26270 | .addr = .{ .comptime_field = field.default_val }, | 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 | if (try sema.resolveDefinedValue(block, src, struct_ptr)) |struct_ptr_val| { | 26215 | if (try sema.resolveDefinedValue(block, src, struct_ptr)) |struct_ptr_val| { |
| ... | @@ -26280,7 +26220,7 @@ fn structFieldPtrByIndex( | ... | @@ -26280,7 +26220,7 @@ fn structFieldPtrByIndex( |
| 26280 | .index = field_index, | 26220 | .index = field_index, |
| 26281 | } }, | 26221 | } }, |
| 26282 | } }); | 26222 | } }); |
| 26283 | return sema.addConstant(val.toValue()); | 26223 | return Air.internedToRef(val); |
| 26284 | } | 26224 | } |
| 26285 | | 26225 | |
| 26286 | try sema.requireRuntimeBlock(block, src, null); | 26226 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -26311,15 +26251,15 @@ fn structFieldVal( | ... | @@ -26311,15 +26251,15 @@ fn structFieldVal( |
| 26311 | const field = struct_obj.fields.values()[field_index]; | 26251 | const field = struct_obj.fields.values()[field_index]; |
| 26312 | | 26252 | |
| 26313 | if (field.is_comptime) { | 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 | if (try sema.resolveMaybeUndefVal(struct_byval)) |struct_val| { | 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 | if ((try sema.typeHasOnePossibleValue(field.ty))) |opv| { | 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 | try sema.requireRuntimeBlock(block, src, null); | 26265 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -26348,7 +26288,7 @@ fn tupleFieldVal( | ... | @@ -26348,7 +26288,7 @@ fn tupleFieldVal( |
| 26348 | ) CompileError!Air.Inst.Ref { | 26288 | ) CompileError!Air.Inst.Ref { |
| 26349 | const mod = sema.mod; | 26289 | const mod = sema.mod; |
| 26350 | if (mod.intern_pool.stringEqlSlice(field_name, "len")) { | 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 | const field_index = try sema.tupleFieldIndex(block, tuple_ty, field_name, field_name_src); | 26293 | const field_index = try sema.tupleFieldIndex(block, tuple_ty, field_name, field_name_src); |
| 26354 | return sema.tupleFieldValByIndex(block, src, tuple_byval, field_index, tuple_ty); | 26294 | return sema.tupleFieldValByIndex(block, src, tuple_byval, field_index, tuple_ty); |
| ... | @@ -26388,26 +26328,26 @@ fn tupleFieldValByIndex( | ... | @@ -26388,26 +26328,26 @@ fn tupleFieldValByIndex( |
| 26388 | const field_ty = tuple_ty.structFieldType(field_index, mod); | 26328 | const field_ty = tuple_ty.structFieldType(field_index, mod); |
| 26389 | | 26329 | |
| 26390 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| { | 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 | if (try sema.resolveMaybeUndefVal(tuple_byval)) |tuple_val| { | 26334 | if (try sema.resolveMaybeUndefVal(tuple_byval)) |tuple_val| { |
| 26395 | if ((try sema.typeHasOnePossibleValue(field_ty))) |opv| { | 26335 | if ((try sema.typeHasOnePossibleValue(field_ty))) |opv| { |
| 26396 | return sema.addConstant(opv); | 26336 | return Air.internedToRef(opv.toIntern()); |
| 26397 | } | 26337 | } |
| 26398 | return switch (mod.intern_pool.indexToKey(tuple_val.toIntern())) { | 26338 | return switch (mod.intern_pool.indexToKey(tuple_val.toIntern())) { |
| 26399 | .undef => sema.addConstUndef(field_ty), | 26339 | .undef => mod.undefRef(field_ty), |
| 26400 | .aggregate => |aggregate| sema.addConstant(switch (aggregate.storage) { | 26340 | .aggregate => |aggregate| Air.internedToRef(switch (aggregate.storage) { |
| 26401 | .bytes => |bytes| try mod.intValue(Type.u8, bytes[0]), | 26341 | .bytes => |bytes| try mod.intValue(Type.u8, bytes[0]), |
| 26402 | .elems => |elems| elems[field_index].toValue(), | 26342 | .elems => |elems| elems[field_index].toValue(), |
| 26403 | .repeated_elem => |elem| elem.toValue(), | 26343 | .repeated_elem => |elem| elem.toValue(), |
| 26404 | }), | 26344 | }.toIntern()), |
| 26405 | else => unreachable, | 26345 | else => unreachable, |
| 26406 | }; | 26346 | }; |
| 26407 | } | 26347 | } |
| 26408 | | 26348 | |
| 26409 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| { | 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 | try sema.requireRuntimeBlock(block, src, null); | 26353 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -26493,13 +26433,13 @@ fn unionFieldPtr( | ... | @@ -26493,13 +26433,13 @@ fn unionFieldPtr( |
| 26493 | }, | 26433 | }, |
| 26494 | .Packed, .Extern => {}, | 26434 | .Packed, .Extern => {}, |
| 26495 | } | 26435 | } |
| 26496 | return sema.addConstant((try mod.intern(.{ .ptr = .{ | 26436 | return Air.internedToRef((try mod.intern(.{ .ptr = .{ |
| 26497 | .ty = ptr_field_ty.toIntern(), | 26437 | .ty = ptr_field_ty.toIntern(), |
| 26498 | .addr = .{ .field = .{ | 26438 | .addr = .{ .field = .{ |
| 26499 | .base = union_ptr_val.toIntern(), | 26439 | .base = union_ptr_val.toIntern(), |
| 26500 | .index = field_index, | 26440 | .index = field_index, |
| 26501 | } }, | 26441 | } }, |
| 26502 | } })).toValue()); | 26442 | } }))); |
| 26503 | } | 26443 | } |
| 26504 | | 26444 | |
| 26505 | try sema.requireRuntimeBlock(block, src, null); | 26445 | try sema.requireRuntimeBlock(block, src, null); |
| ... | @@ -26507,7 +26447,7 @@ fn unionFieldPtr( | ... | @@ -26507,7 +26447,7 @@ fn unionFieldPtr( |
| 26507 | union_ty.unionTagTypeSafety(mod) != null and union_obj.fields.count() > 1) | 26447 | union_ty.unionTagTypeSafety(mod) != null and union_obj.fields.count() > 1) |
| 26508 | { | 26448 | { |
| 26509 | const wanted_tag_val = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); | 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 | // TODO would it be better if get_union_tag supported pointers to unions? | 26451 | // TODO would it be better if get_union_tag supported pointers to unions? |
| 26512 | const union_val = try block.addTyOp(.load, union_ty, union_ptr); | 26452 | const union_val = try block.addTyOp(.load, union_ty, union_ptr); |
| 26513 | const active_tag = try block.addTyOp(.get_union_tag, union_obj.tag_ty, union_val); | 26453 | const active_tag = try block.addTyOp(.get_union_tag, union_obj.tag_ty, union_val); |
| ... | @@ -26540,7 +26480,7 @@ fn unionFieldVal( | ... | @@ -26540,7 +26480,7 @@ fn unionFieldVal( |
| 26540 | const enum_field_index = @as(u32, @intCast(union_obj.tag_ty.enumFieldIndex(field_name, mod).?)); | 26480 | const enum_field_index = @as(u32, @intCast(union_obj.tag_ty.enumFieldIndex(field_name, mod).?)); |
| 26541 | | 26481 | |
| 26542 | if (try sema.resolveMaybeUndefVal(union_byval)) |union_val| { | 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 | const un = ip.indexToKey(union_val.toIntern()).un; | 26485 | const un = ip.indexToKey(union_val.toIntern()).un; |
| 26546 | const field_tag = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); | 26486 | const field_tag = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); |
| ... | @@ -26548,7 +26488,7 @@ fn unionFieldVal( | ... | @@ -26548,7 +26488,7 @@ fn unionFieldVal( |
| 26548 | switch (union_obj.layout) { | 26488 | switch (union_obj.layout) { |
| 26549 | .Auto => { | 26489 | .Auto => { |
| 26550 | if (tag_matches) { | 26490 | if (tag_matches) { |
| 26551 | return sema.addConstant(un.val.toValue()); | 26491 | return Air.internedToRef(un.val); |
| 26552 | } else { | 26492 | } else { |
| 26553 | const msg = msg: { | 26493 | const msg = msg: { |
| 26554 | const active_index = union_obj.tag_ty.enumTagFieldIndex(un.tag.toValue(), mod).?; | 26494 | const active_index = union_obj.tag_ty.enumTagFieldIndex(un.tag.toValue(), mod).?; |
| ... | @@ -26565,11 +26505,11 @@ fn unionFieldVal( | ... | @@ -26565,11 +26505,11 @@ fn unionFieldVal( |
| 26565 | }, | 26505 | }, |
| 26566 | .Packed, .Extern => { | 26506 | .Packed, .Extern => { |
| 26567 | if (tag_matches) { | 26507 | if (tag_matches) { |
| 26568 | return sema.addConstant(un.val.toValue()); | 26508 | return Air.internedToRef(un.val); |
| 26569 | } else { | 26509 | } else { |
| 26570 | const old_ty = union_ty.unionFieldType(un.tag.toValue(), mod); | 26510 | const old_ty = union_ty.unionFieldType(un.tag.toValue(), mod); |
| 26571 | if (try sema.bitCastVal(block, src, un.val.toValue(), old_ty, field.ty, 0)) |new_val| { | 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,7 +26521,7 @@ fn unionFieldVal( |
| 26581 | union_ty.unionTagTypeSafety(mod) != null and union_obj.fields.count() > 1) | 26521 | union_ty.unionTagTypeSafety(mod) != null and union_obj.fields.count() > 1) |
| 26582 | { | 26522 | { |
| 26583 | const wanted_tag_val = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index); | 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 | const active_tag = try block.addTyOp(.get_union_tag, union_obj.tag_ty, union_byval); | 26525 | const active_tag = try block.addTyOp(.get_union_tag, union_obj.tag_ty, union_byval); |
| 26586 | try sema.panicInactiveUnionField(block, src, active_tag, wanted_tag); | 26526 | try sema.panicInactiveUnionField(block, src, active_tag, wanted_tag); |
| 26587 | } | 26527 | } |
| ... | @@ -26655,7 +26595,7 @@ fn elemPtrOneLayerOnly( | ... | @@ -26655,7 +26595,7 @@ fn elemPtrOneLayerOnly( |
| 26655 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); | 26595 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); |
| 26656 | const result_ty = try sema.elemPtrType(indexable_ty, index); | 26596 | const result_ty = try sema.elemPtrType(indexable_ty, index); |
| 26657 | const elem_ptr = try ptr_val.elemPtr(result_ty, index, mod); | 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 | const result_ty = try sema.elemPtrType(indexable_ty, null); | 26600 | const result_ty = try sema.elemPtrType(indexable_ty, null); |
| 26661 | | 26601 | |
| ... | @@ -26716,7 +26656,7 @@ fn elemVal( | ... | @@ -26716,7 +26656,7 @@ fn elemVal( |
| 26716 | const elem_ptr_ty = try mod.singleConstPtrType(elem_ty); | 26656 | const elem_ptr_ty = try mod.singleConstPtrType(elem_ty); |
| 26717 | const elem_ptr_val = try many_ptr_val.elemPtr(elem_ptr_ty, index, mod); | 26657 | const elem_ptr_val = try many_ptr_val.elemPtr(elem_ptr_ty, index, mod); |
| 26718 | if (try sema.pointerDeref(block, indexable_src, elem_ptr_val, elem_ptr_ty)) |elem_val| { | 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 | break :rs indexable_src; | 26661 | break :rs indexable_src; |
| 26722 | }; | 26662 | }; |
| ... | @@ -26732,7 +26672,7 @@ fn elemVal( | ... | @@ -26732,7 +26672,7 @@ fn elemVal( |
| 26732 | const index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index) orelse break :arr_sent; | 26672 | const index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index) orelse break :arr_sent; |
| 26733 | const index = try sema.usizeCast(block, src, index_val.toUnsignedInt(mod)); | 26673 | const index = try sema.usizeCast(block, src, index_val.toUnsignedInt(mod)); |
| 26734 | if (index != inner_ty.arrayLen(mod)) break :arr_sent; | 26674 | if (index != inner_ty.arrayLen(mod)) break :arr_sent; |
| 26735 | return sema.addConstant(sentinel); | 26675 | return Air.internedToRef(sentinel.toIntern()); |
| 26736 | } | 26676 | } |
| 26737 | const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety); | 26677 | const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety); |
| 26738 | return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src); | 26678 | return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src); |
| ... | @@ -26817,20 +26757,20 @@ fn tupleFieldPtr( | ... | @@ -26817,20 +26757,20 @@ fn tupleFieldPtr( |
| 26817 | }); | 26757 | }); |
| 26818 | | 26758 | |
| 26819 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_val| { | 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 | .ty = ptr_field_ty.toIntern(), | 26761 | .ty = ptr_field_ty.toIntern(), |
| 26822 | .addr = .{ .comptime_field = default_val.toIntern() }, | 26762 | .addr = .{ .comptime_field = default_val.toIntern() }, |
| 26823 | } })).toValue()); | 26763 | } }))); |
| 26824 | } | 26764 | } |
| 26825 | | 26765 | |
| 26826 | if (try sema.resolveMaybeUndefVal(tuple_ptr)) |tuple_ptr_val| { | 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 | .ty = ptr_field_ty.toIntern(), | 26768 | .ty = ptr_field_ty.toIntern(), |
| 26829 | .addr = .{ .field = .{ | 26769 | .addr = .{ .field = .{ |
| 26830 | .base = tuple_ptr_val.toIntern(), | 26770 | .base = tuple_ptr_val.toIntern(), |
| 26831 | .index = field_index, | 26771 | .index = field_index, |
| 26832 | } }, | 26772 | } }, |
| 26833 | } })).toValue()); | 26773 | } }))); |
| 26834 | } | 26774 | } |
| 26835 | | 26775 | |
| 26836 | if (!init) { | 26776 | if (!init) { |
| ... | @@ -26866,12 +26806,12 @@ fn tupleField( | ... | @@ -26866,12 +26806,12 @@ fn tupleField( |
| 26866 | const field_ty = tuple_ty.structFieldType(field_index, mod); | 26806 | const field_ty = tuple_ty.structFieldType(field_index, mod); |
| 26867 | | 26807 | |
| 26868 | if (try tuple_ty.structFieldValueComptime(mod, field_index)) |default_value| { | 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 | if (try sema.resolveMaybeUndefVal(tuple)) |tuple_val| { | 26812 | if (try sema.resolveMaybeUndefVal(tuple)) |tuple_val| { |
| 26873 | if (tuple_val.isUndef(mod)) return sema.addConstUndef(field_ty); | 26813 | if (tuple_val.isUndef(mod)) return mod.undefRef(field_ty); |
| 26874 | return sema.addConstant(try tuple_val.fieldValue(mod, field_index)); | 26814 | return Air.internedToRef((try tuple_val.fieldValue(mod, field_index)).toIntern()); |
| 26875 | } | 26815 | } |
| 26876 | | 26816 | |
| 26877 | try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_src); | 26817 | try sema.validateRuntimeElemAccess(block, field_index_src, field_ty, tuple_ty, tuple_src); |
| ... | @@ -26909,7 +26849,7 @@ fn elemValArray( | ... | @@ -26909,7 +26849,7 @@ fn elemValArray( |
| 26909 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); | 26849 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); |
| 26910 | if (array_sent) |s| { | 26850 | if (array_sent) |s| { |
| 26911 | if (index == array_len) { | 26851 | if (index == array_len) { |
| 26912 | return sema.addConstant(s); | 26852 | return Air.internedToRef(s.toIntern()); |
| 26913 | } | 26853 | } |
| 26914 | } | 26854 | } |
| 26915 | if (index >= array_len_s) { | 26855 | if (index >= array_len_s) { |
| ... | @@ -26919,12 +26859,12 @@ fn elemValArray( | ... | @@ -26919,12 +26859,12 @@ fn elemValArray( |
| 26919 | } | 26859 | } |
| 26920 | if (maybe_undef_array_val) |array_val| { | 26860 | if (maybe_undef_array_val) |array_val| { |
| 26921 | if (array_val.isUndef(mod)) { | 26861 | if (array_val.isUndef(mod)) { |
| 26922 | return sema.addConstUndef(elem_ty); | 26862 | return mod.undefRef(elem_ty); |
| 26923 | } | 26863 | } |
| 26924 | if (maybe_index_val) |index_val| { | 26864 | if (maybe_index_val) |index_val| { |
| 26925 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); | 26865 | const index = @as(usize, @intCast(index_val.toUnsignedInt(mod))); |
| 26926 | const elem_val = try array_val.elemValue(mod, index); | 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,7 +26875,7 @@ fn elemValArray( |
| 26935 | if (oob_safety and block.wantSafety()) { | 26875 | if (oob_safety and block.wantSafety()) { |
| 26936 | // Runtime check is only needed if unable to comptime check | 26876 | // Runtime check is only needed if unable to comptime check |
| 26937 | if (maybe_index_val == null) { | 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 | const cmp_op: Air.Inst.Tag = if (array_sent != null) .cmp_lte else .cmp_lt; | 26879 | const cmp_op: Air.Inst.Tag = if (array_sent != null) .cmp_lte else .cmp_lt; |
| 26940 | try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op); | 26880 | try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op); |
| 26941 | } | 26881 | } |
| ... | @@ -26980,11 +26920,11 @@ fn elemPtrArray( | ... | @@ -26980,11 +26920,11 @@ fn elemPtrArray( |
| 26980 | | 26920 | |
| 26981 | if (maybe_undef_array_ptr_val) |array_ptr_val| { | 26921 | if (maybe_undef_array_ptr_val) |array_ptr_val| { |
| 26982 | if (array_ptr_val.isUndef(mod)) { | 26922 | if (array_ptr_val.isUndef(mod)) { |
| 26983 | return sema.addConstUndef(elem_ptr_ty); | 26923 | return mod.undefRef(elem_ptr_ty); |
| 26984 | } | 26924 | } |
| 26985 | if (offset) |index| { | 26925 | if (offset) |index| { |
| 26986 | const elem_ptr = try array_ptr_val.elemPtr(elem_ptr_ty, index, mod); | 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,7 +26937,7 @@ fn elemPtrArray( |
| 26997 | | 26937 | |
| 26998 | // Runtime check is only needed if unable to comptime check. | 26938 | // Runtime check is only needed if unable to comptime check. |
| 26999 | if (oob_safety and block.wantSafety() and offset == null) { | 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 | const cmp_op: Air.Inst.Tag = if (array_sent) .cmp_lte else .cmp_lt; | 26941 | const cmp_op: Air.Inst.Tag = if (array_sent) .cmp_lte else .cmp_lt; |
| 27002 | try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op); | 26942 | try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op); |
| 27003 | } | 26943 | } |
| ... | @@ -27042,7 +26982,7 @@ fn elemValSlice( | ... | @@ -27042,7 +26982,7 @@ fn elemValSlice( |
| 27042 | const elem_ptr_ty = try sema.elemPtrType(slice_ty, index); | 26982 | const elem_ptr_ty = try sema.elemPtrType(slice_ty, index); |
| 27043 | const elem_ptr_val = try slice_val.elemPtr(elem_ptr_ty, index, mod); | 26983 | const elem_ptr_val = try slice_val.elemPtr(elem_ptr_ty, index, mod); |
| 27044 | if (try sema.pointerDeref(block, slice_src, elem_ptr_val, elem_ptr_ty)) |elem_val| { | 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 | runtime_src = slice_src; | 26987 | runtime_src = slice_src; |
| 27048 | } | 26988 | } |
| ... | @@ -27053,7 +26993,7 @@ fn elemValSlice( | ... | @@ -27053,7 +26993,7 @@ fn elemValSlice( |
| 27053 | try sema.requireRuntimeBlock(block, src, runtime_src); | 26993 | try sema.requireRuntimeBlock(block, src, runtime_src); |
| 27054 | if (oob_safety and block.wantSafety()) { | 26994 | if (oob_safety and block.wantSafety()) { |
| 27055 | const len_inst = if (maybe_slice_val) |slice_val| | 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 | else | 26997 | else |
| 27058 | try block.addTyOp(.slice_len, Type.usize, slice); | 26998 | try block.addTyOp(.slice_len, Type.usize, slice); |
| 27059 | const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt; | 26999 | const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt; |
| ... | @@ -27088,7 +27028,7 @@ fn elemPtrSlice( | ... | @@ -27088,7 +27028,7 @@ fn elemPtrSlice( |
| 27088 | | 27028 | |
| 27089 | if (maybe_undef_slice_val) |slice_val| { | 27029 | if (maybe_undef_slice_val) |slice_val| { |
| 27090 | if (slice_val.isUndef(mod)) { | 27030 | if (slice_val.isUndef(mod)) { |
| 27091 | return sema.addConstUndef(elem_ptr_ty); | 27031 | return mod.undefRef(elem_ptr_ty); |
| 27092 | } | 27032 | } |
| 27093 | const slice_len = slice_val.sliceLen(mod); | 27033 | const slice_len = slice_val.sliceLen(mod); |
| 27094 | const slice_len_s = slice_len + @intFromBool(slice_sent); | 27034 | const slice_len_s = slice_len + @intFromBool(slice_sent); |
| ... | @@ -27101,7 +27041,7 @@ fn elemPtrSlice( | ... | @@ -27101,7 +27041,7 @@ fn elemPtrSlice( |
| 27101 | return sema.fail(block, elem_index_src, "index {d} outside slice of length {d}{s}", .{ index, slice_len, sentinel_label }); | 27041 | return sema.fail(block, elem_index_src, "index {d} outside slice of length {d}{s}", .{ index, slice_len, sentinel_label }); |
| 27102 | } | 27042 | } |
| 27103 | const elem_ptr_val = try slice_val.elemPtr(elem_ptr_ty, index, mod); | 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,7 +27053,7 @@ fn elemPtrSlice( |
| 27113 | const len_inst = len: { | 27053 | const len_inst = len: { |
| 27114 | if (maybe_undef_slice_val) |slice_val| | 27054 | if (maybe_undef_slice_val) |slice_val| |
| 27115 | if (!slice_val.isUndef(mod)) | 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 | break :len try block.addTyOp(.slice_len, Type.usize, slice); | 27057 | break :len try block.addTyOp(.slice_len, Type.usize, slice); |
| 27118 | }; | 27058 | }; |
| 27119 | const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt; | 27059 | const cmp_op: Air.Inst.Tag = if (slice_sent) .cmp_lte else .cmp_lt; |
| ... | @@ -27205,15 +27145,15 @@ fn coerceExtra( | ... | @@ -27205,15 +27145,15 @@ fn coerceExtra( |
| 27205 | .Optional => optional: { | 27145 | .Optional => optional: { |
| 27206 | // undefined sets the optional bit also to undefined. | 27146 | // undefined sets the optional bit also to undefined. |
| 27207 | if (is_undef) { | 27147 | if (is_undef) { |
| 27208 | return sema.addConstUndef(dest_ty); | 27148 | return mod.undefRef(dest_ty); |
| 27209 | } | 27149 | } |
| 27210 | | 27150 | |
| 27211 | // null to ?T | 27151 | // null to ?T |
| 27212 | if (inst_ty.zigTypeTag(mod) == .Null) { | 27152 | if (inst_ty.zigTypeTag(mod) == .Null) { |
| 27213 | return sema.addConstant((try mod.intern(.{ .opt = .{ | 27153 | return Air.internedToRef((try mod.intern(.{ .opt = .{ |
| 27214 | .ty = dest_ty.toIntern(), | 27154 | .ty = dest_ty.toIntern(), |
| 27215 | .val = .none, | 27155 | .val = .none, |
| 27216 | } })).toValue()); | 27156 | } }))); |
| 27217 | } | 27157 | } |
| 27218 | | 27158 | |
| 27219 | // cast from ?*T and ?[*]T to ?*anyopaque | 27159 | // cast from ?*T and ?[*]T to ?*anyopaque |
| ... | @@ -27382,7 +27322,7 @@ fn coerceExtra( | ... | @@ -27382,7 +27322,7 @@ fn coerceExtra( |
| 27382 | // coercion to C pointer | 27322 | // coercion to C pointer |
| 27383 | .C => switch (inst_ty.zigTypeTag(mod)) { | 27323 | .C => switch (inst_ty.zigTypeTag(mod)) { |
| 27384 | .Null => { | 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 | .ComptimeInt => { | 27327 | .ComptimeInt => { |
| 27388 | const addr = sema.coerceExtra(block, Type.usize, inst, inst_src, .{ .report_err = false }) catch |err| switch (err) { | 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,14 +27426,14 @@ fn coerceExtra( |
| 27486 | if (inst_child_ty.structFieldCount(mod) == 0) { | 27426 | if (inst_child_ty.structFieldCount(mod) == 0) { |
| 27487 | // Optional slice is represented with a null pointer so | 27427 | // Optional slice is represented with a null pointer so |
| 27488 | // we use a dummy pointer value with the required alignment. | 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 | .ty = dest_ty.toIntern(), | 27430 | .ty = dest_ty.toIntern(), |
| 27491 | .addr = .{ .int = (if (dest_info.flags.alignment != .none) | 27431 | .addr = .{ .int = (if (dest_info.flags.alignment != .none) |
| 27492 | try mod.intValue(Type.usize, dest_info.flags.alignment.toByteUnitsOptional().?) | 27432 | try mod.intValue(Type.usize, dest_info.flags.alignment.toByteUnitsOptional().?) |
| 27493 | else | 27433 | else |
| 27494 | try mod.getCoerced(try dest_info.child.toType().lazyAbiAlignment(mod), Type.usize)).toIntern() }, | 27434 | try mod.getCoerced(try dest_info.child.toType().lazyAbiAlignment(mod), Type.usize)).toIntern() }, |
| 27495 | .len = (try mod.intValue(Type.usize, 0)).toIntern(), | 27435 | .len = (try mod.intValue(Type.usize, 0)).toIntern(), |
| 27496 | } })).toValue()); | 27436 | } }))); |
| 27497 | } | 27437 | } |
| 27498 | | 27438 | |
| 27499 | // pointer to tuple to slice | 27439 | // pointer to tuple to slice |
| ... | @@ -27539,7 +27479,7 @@ fn coerceExtra( | ... | @@ -27539,7 +27479,7 @@ fn coerceExtra( |
| 27539 | .Int, .ComptimeInt => switch (inst_ty.zigTypeTag(mod)) { | 27479 | .Int, .ComptimeInt => switch (inst_ty.zigTypeTag(mod)) { |
| 27540 | .Float, .ComptimeFloat => float: { | 27480 | .Float, .ComptimeFloat => float: { |
| 27541 | if (is_undef) { | 27481 | if (is_undef) { |
| 27542 | return sema.addConstUndef(dest_ty); | 27482 | return mod.undefRef(dest_ty); |
| 27543 | } | 27483 | } |
| 27544 | const val = (try sema.resolveMaybeUndefVal(inst)) orelse { | 27484 | const val = (try sema.resolveMaybeUndefVal(inst)) orelse { |
| 27545 | if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { | 27485 | if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { |
| ... | @@ -27558,11 +27498,11 @@ fn coerceExtra( | ... | @@ -27558,11 +27498,11 @@ fn coerceExtra( |
| 27558 | ); | 27498 | ); |
| 27559 | } | 27499 | } |
| 27560 | const result_val = try sema.intFromFloat(block, inst_src, val, inst_ty, dest_ty); | 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 | .Int, .ComptimeInt => { | 27503 | .Int, .ComptimeInt => { |
| 27564 | if (is_undef) { | 27504 | if (is_undef) { |
| 27565 | return sema.addConstUndef(dest_ty); | 27505 | return mod.undefRef(dest_ty); |
| 27566 | } | 27506 | } |
| 27567 | if (try sema.resolveMaybeUndefVal(inst)) |val| { | 27507 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 27568 | // comptime-known integer to other number | 27508 | // comptime-known integer to other number |
| ... | @@ -27570,7 +27510,7 @@ fn coerceExtra( | ... | @@ -27570,7 +27510,7 @@ fn coerceExtra( |
| 27570 | if (!opts.report_err) return error.NotCoercible; | 27510 | if (!opts.report_err) return error.NotCoercible; |
| 27571 | return sema.fail(block, inst_src, "type '{}' cannot represent integer value '{}'", .{ dest_ty.fmt(mod), val.fmtValue(inst_ty, mod) }); | 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 | if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { | 27515 | if (dest_ty.zigTypeTag(mod) == .ComptimeInt) { |
| 27576 | if (!opts.report_err) return error.NotCoercible; | 27516 | if (!opts.report_err) return error.NotCoercible; |
| ... | @@ -27590,7 +27530,7 @@ fn coerceExtra( | ... | @@ -27590,7 +27530,7 @@ fn coerceExtra( |
| 27590 | } | 27530 | } |
| 27591 | }, | 27531 | }, |
| 27592 | .Undefined => { | 27532 | .Undefined => { |
| 27593 | return sema.addConstUndef(dest_ty); | 27533 | return mod.undefRef(dest_ty); |
| 27594 | }, | 27534 | }, |
| 27595 | else => {}, | 27535 | else => {}, |
| 27596 | }, | 27536 | }, |
| ... | @@ -27598,11 +27538,11 @@ fn coerceExtra( | ... | @@ -27598,11 +27538,11 @@ fn coerceExtra( |
| 27598 | .ComptimeFloat => { | 27538 | .ComptimeFloat => { |
| 27599 | const val = try sema.resolveConstValue(block, .unneeded, inst, ""); | 27539 | const val = try sema.resolveConstValue(block, .unneeded, inst, ""); |
| 27600 | const result_val = try val.floatCast(dest_ty, mod); | 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 | .Float => { | 27543 | .Float => { |
| 27604 | if (is_undef) { | 27544 | if (is_undef) { |
| 27605 | return sema.addConstUndef(dest_ty); | 27545 | return mod.undefRef(dest_ty); |
| 27606 | } | 27546 | } |
| 27607 | if (try sema.resolveMaybeUndefVal(inst)) |val| { | 27547 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 27608 | const result_val = try val.floatCast(dest_ty, mod); | 27548 | const result_val = try val.floatCast(dest_ty, mod); |
| ... | @@ -27614,7 +27554,7 @@ fn coerceExtra( | ... | @@ -27614,7 +27554,7 @@ fn coerceExtra( |
| 27614 | .{ dest_ty.fmt(mod), val.fmtValue(inst_ty, mod) }, | 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 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { | 27558 | } else if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { |
| 27619 | if (!opts.report_err) return error.NotCoercible; | 27559 | if (!opts.report_err) return error.NotCoercible; |
| 27620 | return sema.failWithNeededComptime(block, inst_src, "value being casted to 'comptime_float' must be comptime-known"); | 27560 | return sema.failWithNeededComptime(block, inst_src, "value being casted to 'comptime_float' must be comptime-known"); |
| ... | @@ -27630,7 +27570,7 @@ fn coerceExtra( | ... | @@ -27630,7 +27570,7 @@ fn coerceExtra( |
| 27630 | }, | 27570 | }, |
| 27631 | .Int, .ComptimeInt => int: { | 27571 | .Int, .ComptimeInt => int: { |
| 27632 | if (is_undef) { | 27572 | if (is_undef) { |
| 27633 | return sema.addConstUndef(dest_ty); | 27573 | return mod.undefRef(dest_ty); |
| 27634 | } | 27574 | } |
| 27635 | const val = (try sema.resolveMaybeUndefVal(inst)) orelse { | 27575 | const val = (try sema.resolveMaybeUndefVal(inst)) orelse { |
| 27636 | if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { | 27576 | if (dest_ty.zigTypeTag(mod) == .ComptimeFloat) { |
| ... | @@ -27650,10 +27590,10 @@ fn coerceExtra( | ... | @@ -27650,10 +27590,10 @@ fn coerceExtra( |
| 27650 | // .{ dest_ty.fmt(mod), val }, | 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 | .Undefined => { | 27595 | .Undefined => { |
| 27656 | return sema.addConstUndef(dest_ty); | 27596 | return mod.undefRef(dest_ty); |
| 27657 | }, | 27597 | }, |
| 27658 | else => {}, | 27598 | else => {}, |
| 27659 | }, | 27599 | }, |
| ... | @@ -27676,9 +27616,7 @@ fn coerceExtra( | ... | @@ -27676,9 +27616,7 @@ fn coerceExtra( |
| 27676 | }; | 27616 | }; |
| 27677 | return sema.failWithOwnedErrorMsg(msg); | 27617 | return sema.failWithOwnedErrorMsg(msg); |
| 27678 | }; | 27618 | }; |
| 27679 | return sema.addConstant( | 27619 | return Air.internedToRef((try mod.enumValueFieldIndex(dest_ty, @as(u32, @intCast(field_index)))).toIntern()); |
| 27680 | try mod.enumValueFieldIndex(dest_ty, @as(u32, @intCast(field_index))), | | |
| 27681 | ); | | |
| 27682 | }, | 27620 | }, |
| 27683 | .Union => blk: { | 27621 | .Union => blk: { |
| 27684 | // union to its own tag type | 27622 | // union to its own tag type |
| ... | @@ -27688,7 +27626,7 @@ fn coerceExtra( | ... | @@ -27688,7 +27626,7 @@ fn coerceExtra( |
| 27688 | } | 27626 | } |
| 27689 | }, | 27627 | }, |
| 27690 | .Undefined => { | 27628 | .Undefined => { |
| 27691 | return sema.addConstUndef(dest_ty); | 27629 | return mod.undefRef(dest_ty); |
| 27692 | }, | 27630 | }, |
| 27693 | else => {}, | 27631 | else => {}, |
| 27694 | }, | 27632 | }, |
| ... | @@ -27696,21 +27634,19 @@ fn coerceExtra( | ... | @@ -27696,21 +27634,19 @@ fn coerceExtra( |
| 27696 | .ErrorUnion => eu: { | 27634 | .ErrorUnion => eu: { |
| 27697 | if (maybe_inst_val) |inst_val| { | 27635 | if (maybe_inst_val) |inst_val| { |
| 27698 | switch (inst_val.toIntern()) { | 27636 | switch (inst_val.toIntern()) { |
| 27699 | .undef => return sema.addConstUndef(dest_ty), | 27637 | .undef => return mod.undefRef(dest_ty), |
| 27700 | else => switch (mod.intern_pool.indexToKey(inst_val.toIntern())) { | 27638 | else => switch (mod.intern_pool.indexToKey(inst_val.toIntern())) { |
| 27701 | .error_union => |error_union| switch (error_union.val) { | 27639 | .error_union => |error_union| switch (error_union.val) { |
| 27702 | .err_name => |err_name| { | 27640 | .err_name => |err_name| { |
| 27703 | const error_set_ty = inst_ty.errorUnionSet(mod); | 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 | .ty = error_set_ty.toIntern(), | 27643 | .ty = error_set_ty.toIntern(), |
| 27706 | .name = err_name, | 27644 | .name = err_name, |
| 27707 | } })).toValue()); | 27645 | } }))); |
| 27708 | return sema.wrapErrorUnionSet(block, dest_ty, error_set_val, inst_src); | 27646 | return sema.wrapErrorUnionSet(block, dest_ty, error_set_val, inst_src); |
| 27709 | }, | 27647 | }, |
| 27710 | .payload => |payload| { | 27648 | .payload => |payload| { |
| 27711 | const payload_val = try sema.addConstant( | 27649 | const payload_val = Air.internedToRef(payload); |
| 27712 | payload.toValue(), | | |
| 27713 | ); | | |
| 27714 | return sema.wrapErrorUnionPayload(block, dest_ty, payload_val, inst_src) catch |err| switch (err) { | 27650 | return sema.wrapErrorUnionPayload(block, dest_ty, payload_val, inst_src) catch |err| switch (err) { |
| 27715 | error.NotCoercible => break :eu, | 27651 | error.NotCoercible => break :eu, |
| 27716 | else => |e| return e, | 27652 | else => |e| return e, |
| ... | @@ -27727,7 +27663,7 @@ fn coerceExtra( | ... | @@ -27727,7 +27663,7 @@ fn coerceExtra( |
| 27727 | return sema.wrapErrorUnionSet(block, dest_ty, inst, inst_src); | 27663 | return sema.wrapErrorUnionSet(block, dest_ty, inst, inst_src); |
| 27728 | }, | 27664 | }, |
| 27729 | .Undefined => { | 27665 | .Undefined => { |
| 27730 | return sema.addConstUndef(dest_ty); | 27666 | return mod.undefRef(dest_ty); |
| 27731 | }, | 27667 | }, |
| 27732 | else => eu: { | 27668 | else => eu: { |
| 27733 | // T to E!T | 27669 | // T to E!T |
| ... | @@ -27745,7 +27681,7 @@ fn coerceExtra( | ... | @@ -27745,7 +27681,7 @@ fn coerceExtra( |
| 27745 | } | 27681 | } |
| 27746 | }, | 27682 | }, |
| 27747 | .Undefined => { | 27683 | .Undefined => { |
| 27748 | return sema.addConstUndef(dest_ty); | 27684 | return mod.undefRef(dest_ty); |
| 27749 | }, | 27685 | }, |
| 27750 | else => {}, | 27686 | else => {}, |
| 27751 | }, | 27687 | }, |
| ... | @@ -27760,7 +27696,7 @@ fn coerceExtra( | ... | @@ -27760,7 +27696,7 @@ fn coerceExtra( |
| 27760 | } | 27696 | } |
| 27761 | }, | 27697 | }, |
| 27762 | .Undefined => { | 27698 | .Undefined => { |
| 27763 | return sema.addConstUndef(dest_ty); | 27699 | return mod.undefRef(dest_ty); |
| 27764 | }, | 27700 | }, |
| 27765 | else => {}, | 27701 | else => {}, |
| 27766 | }, | 27702 | }, |
| ... | @@ -27772,7 +27708,7 @@ fn coerceExtra( | ... | @@ -27772,7 +27708,7 @@ fn coerceExtra( |
| 27772 | } | 27708 | } |
| 27773 | }, | 27709 | }, |
| 27774 | .Undefined => { | 27710 | .Undefined => { |
| 27775 | return sema.addConstUndef(dest_ty); | 27711 | return mod.undefRef(dest_ty); |
| 27776 | }, | 27712 | }, |
| 27777 | else => {}, | 27713 | else => {}, |
| 27778 | }, | 27714 | }, |
| ... | @@ -27794,7 +27730,7 @@ fn coerceExtra( | ... | @@ -27794,7 +27730,7 @@ fn coerceExtra( |
| 27794 | // special logic has a chance to run first, such as `*[N]T` to `[]T` which | 27730 | // special logic has a chance to run first, such as `*[N]T` to `[]T` which |
| 27795 | // should initialize the length field of the slice. | 27731 | // should initialize the length field of the slice. |
| 27796 | if (is_undef) { | 27732 | if (is_undef) { |
| 27797 | return sema.addConstUndef(dest_ty); | 27733 | return mod.undefRef(dest_ty); |
| 27798 | } | 27734 | } |
| 27799 | | 27735 | |
| 27800 | if (!opts.report_err) return error.NotCoercible; | 27736 | if (!opts.report_err) return error.NotCoercible; |
| ... | @@ -27863,7 +27799,7 @@ fn coerceInMemory( | ... | @@ -27863,7 +27799,7 @@ fn coerceInMemory( |
| 27863 | val: Value, | 27799 | val: Value, |
| 27864 | dst_ty: Type, | 27800 | dst_ty: Type, |
| 27865 | ) CompileError!Air.Inst.Ref { | 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 | const InMemoryCoercionResult = union(enum) { | 27805 | const InMemoryCoercionResult = union(enum) { |
| ... | @@ -28880,7 +28816,7 @@ fn storePtr2( | ... | @@ -28880,7 +28816,7 @@ fn storePtr2( |
| 28880 | while (i < field_count) : (i += 1) { | 28816 | while (i < field_count) : (i += 1) { |
| 28881 | const elem_src = operand_src; // TODO better source location | 28817 | const elem_src = operand_src; // TODO better source location |
| 28882 | const elem = try sema.tupleField(block, operand_src, uncasted_operand, elem_src, i); | 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 | const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src, false, true); | 28820 | const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src, false, true); |
| 28885 | try sema.storePtr2(block, src, elem_ptr, elem_src, elem, elem_src, .store); | 28821 | try sema.storePtr2(block, src, elem_ptr, elem_src, elem, elem_src, .store); |
| 28886 | } | 28822 | } |
| ... | @@ -29920,7 +29856,7 @@ fn bitCast( | ... | @@ -29920,7 +29856,7 @@ fn bitCast( |
| 29920 | | 29856 | |
| 29921 | if (try sema.resolveMaybeUndefVal(inst)) |val| { | 29857 | if (try sema.resolveMaybeUndefVal(inst)) |val| { |
| 29922 | if (try sema.bitCastVal(block, inst_src, val, old_ty, dest_ty, 0)) |result_val| { | 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 | try sema.requireRuntimeBlock(block, inst_src, operand_src); | 29862 | try sema.requireRuntimeBlock(block, inst_src, operand_src); |
| ... | @@ -29973,7 +29909,7 @@ fn coerceArrayPtrToSlice( | ... | @@ -29973,7 +29909,7 @@ fn coerceArrayPtrToSlice( |
| 29973 | }, | 29909 | }, |
| 29974 | .len = (try mod.intValue(Type.usize, array_ty.arrayLen(mod))).toIntern(), | 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 | try sema.requireRuntimeBlock(block, inst_src, null); | 29914 | try sema.requireRuntimeBlock(block, inst_src, null); |
| 29979 | return block.addTyOp(.array_to_slice, dest_ty, inst); | 29915 | return block.addTyOp(.array_to_slice, dest_ty, inst); |
| ... | @@ -30040,8 +29976,8 @@ fn coerceCompatiblePtrs( | ... | @@ -30040,8 +29976,8 @@ fn coerceCompatiblePtrs( |
| 30040 | return sema.fail(block, inst_src, "null pointer casted to type '{}'", .{dest_ty.fmt(sema.mod)}); | 29976 | return sema.fail(block, inst_src, "null pointer casted to type '{}'", .{dest_ty.fmt(sema.mod)}); |
| 30041 | } | 29977 | } |
| 30042 | // The comptime Value representation is compatible with both types. | 29978 | // The comptime Value representation is compatible with both types. |
| 30043 | return sema.addConstant( | 29979 | return Air.internedToRef( |
| 30044 | try mod.getCoerced((try val.intern(inst_ty, mod)).toValue(), dest_ty), | 29980 | (try mod.getCoerced((try val.intern(inst_ty, mod)).toValue(), dest_ty)).toIntern(), |
| 30045 | ); | 29981 | ); |
| 30046 | } | 29982 | } |
| 30047 | try sema.requireRuntimeBlock(block, inst_src, null); | 29983 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | @@ -30139,7 +30075,7 @@ fn coerceEnumToUnion( | ... | @@ -30139,7 +30075,7 @@ fn coerceEnumToUnion( |
| 30139 | return sema.failWithOwnedErrorMsg(msg); | 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 | try sema.requireRuntimeBlock(block, inst_src, null); | 30081 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | @@ -30347,7 +30283,7 @@ fn coerceArrayLike( | ... | @@ -30347,7 +30283,7 @@ fn coerceArrayLike( |
| 30347 | var runtime_src: ?LazySrcLoc = null; | 30283 | var runtime_src: ?LazySrcLoc = null; |
| 30348 | | 30284 | |
| 30349 | for (element_vals, element_refs, 0..) |*val, *ref, i| { | 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 | const src = inst_src; // TODO better source location | 30287 | const src = inst_src; // TODO better source location |
| 30352 | const elem_src = inst_src; // TODO better source location | 30288 | const elem_src = inst_src; // TODO better source location |
| 30353 | const elem_ref = try sema.elemValArray(block, src, inst_src, inst, elem_src, index_ref, true); | 30289 | const elem_ref = try sema.elemValArray(block, src, inst_src, inst, elem_src, index_ref, true); |
| ... | @@ -30367,10 +30303,10 @@ fn coerceArrayLike( | ... | @@ -30367,10 +30303,10 @@ fn coerceArrayLike( |
| 30367 | return block.addAggregateInit(dest_ty, element_refs); | 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 | .ty = dest_ty.toIntern(), | 30307 | .ty = dest_ty.toIntern(), |
| 30372 | .storage = .{ .elems = element_vals }, | 30308 | .storage = .{ .elems = element_vals }, |
| 30373 | } })).toValue()); | 30309 | } }))); |
| 30374 | } | 30310 | } |
| 30375 | | 30311 | |
| 30376 | /// If the lengths match, coerces element-wise. | 30312 | /// If the lengths match, coerces element-wise. |
| ... | @@ -30411,7 +30347,7 @@ fn coerceTupleToArray( | ... | @@ -30411,7 +30347,7 @@ fn coerceTupleToArray( |
| 30411 | if (i_usize == inst_len) { | 30347 | if (i_usize == inst_len) { |
| 30412 | const sentinel_val = dest_ty.sentinel(mod).?; | 30348 | const sentinel_val = dest_ty.sentinel(mod).?; |
| 30413 | val.* = sentinel_val.toIntern(); | 30349 | val.* = sentinel_val.toIntern(); |
| 30414 | ref.* = try sema.addConstant(sentinel_val); | 30350 | ref.* = Air.internedToRef(sentinel_val.toIntern()); |
| 30415 | break; | 30351 | break; |
| 30416 | } | 30352 | } |
| 30417 | const elem_src = inst_src; // TODO better source location | 30353 | const elem_src = inst_src; // TODO better source location |
| ... | @@ -30432,10 +30368,10 @@ fn coerceTupleToArray( | ... | @@ -30432,10 +30368,10 @@ fn coerceTupleToArray( |
| 30432 | return block.addAggregateInit(dest_ty, element_refs); | 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 | .ty = dest_ty.toIntern(), | 30372 | .ty = dest_ty.toIntern(), |
| 30437 | .storage = .{ .elems = element_vals }, | 30373 | .storage = .{ .elems = element_vals }, |
| 30438 | } })).toValue()); | 30374 | } }))); |
| 30439 | } | 30375 | } |
| 30440 | | 30376 | |
| 30441 | /// If the lengths match, coerces element-wise. | 30377 | /// If the lengths match, coerces element-wise. |
| ... | @@ -30575,7 +30511,7 @@ fn coerceTupleToStruct( | ... | @@ -30575,7 +30511,7 @@ fn coerceTupleToStruct( |
| 30575 | if (runtime_src == null) { | 30511 | if (runtime_src == null) { |
| 30576 | field_vals[i] = field.default_val; | 30512 | field_vals[i] = field.default_val; |
| 30577 | } else { | 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,7 +30533,7 @@ fn coerceTupleToStruct( |
| 30597 | // TODO: figure out InternPool removals for incremental compilation | 30533 | // TODO: figure out InternPool removals for incremental compilation |
| 30598 | //errdefer ip.remove(struct_val); | 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 | fn coerceTupleToTuple( | 30539 | fn coerceTupleToTuple( |
| ... | @@ -30719,7 +30655,7 @@ fn coerceTupleToTuple( | ... | @@ -30719,7 +30655,7 @@ fn coerceTupleToTuple( |
| 30719 | if (runtime_src == null) { | 30655 | if (runtime_src == null) { |
| 30720 | field_vals[i] = default_val; | 30656 | field_vals[i] = default_val; |
| 30721 | } else { | 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,12 +30670,10 @@ fn coerceTupleToTuple( |
| 30734 | return block.addAggregateInit(tuple_ty, field_refs); | 30670 | return block.addAggregateInit(tuple_ty, field_refs); |
| 30735 | } | 30671 | } |
| 30736 | | 30672 | |
| 30737 | return sema.addConstant( | 30673 | return Air.internedToRef((try mod.intern(.{ .aggregate = .{ |
| 30738 | (try mod.intern(.{ .aggregate = .{ | 30674 | .ty = tuple_ty.toIntern(), |
| 30739 | .ty = tuple_ty.toIntern(), | 30675 | .storage = .{ .elems = field_vals }, |
| 30740 | .storage = .{ .elems = field_vals }, | 30676 | } }))); |
| 30741 | } })).toValue(), | | |
| 30742 | ); | | |
| 30743 | } | 30677 | } |
| 30744 | | 30678 | |
| 30745 | fn analyzeDeclVal( | 30679 | fn analyzeDeclVal( |
| ... | @@ -30863,10 +30797,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: Decl.Index, analyze_fn_body: boo | ... | @@ -30863,10 +30797,10 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: Decl.Index, analyze_fn_body: boo |
| 30863 | if (analyze_fn_body) { | 30797 | if (analyze_fn_body) { |
| 30864 | try sema.maybeQueueFuncBodyAnalysis(decl_index); | 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 | .ty = ptr_ty.toIntern(), | 30801 | .ty = ptr_ty.toIntern(), |
| 30868 | .addr = .{ .decl = decl_index }, | 30802 | .addr = .{ .decl = decl_index }, |
| 30869 | } })).toValue()); | 30803 | } }))); |
| 30870 | } | 30804 | } |
| 30871 | | 30805 | |
| 30872 | fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: Decl.Index) !void { | 30806 | fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: Decl.Index) !void { |
| ... | @@ -30939,12 +30873,12 @@ fn analyzeLoad( | ... | @@ -30939,12 +30873,12 @@ fn analyzeLoad( |
| 30939 | }; | 30873 | }; |
| 30940 | | 30874 | |
| 30941 | if (try sema.typeHasOnePossibleValue(elem_ty)) |opv| { | 30875 | if (try sema.typeHasOnePossibleValue(elem_ty)) |opv| { |
| 30942 | return sema.addConstant(opv); | 30876 | return Air.internedToRef(opv.toIntern()); |
| 30943 | } | 30877 | } |
| 30944 | | 30878 | |
| 30945 | if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { | 30879 | if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| { |
| 30946 | if (try sema.pointerDeref(block, src, ptr_val, ptr_ty)) |elem_val| { | 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,8 +30908,8 @@ fn analyzeSlicePtr( |
| 30974 | const mod = sema.mod; | 30908 | const mod = sema.mod; |
| 30975 | const result_ty = slice_ty.slicePtrFieldType(mod); | 30909 | const result_ty = slice_ty.slicePtrFieldType(mod); |
| 30976 | if (try sema.resolveMaybeUndefVal(slice)) |val| { | 30910 | if (try sema.resolveMaybeUndefVal(slice)) |val| { |
| 30977 | if (val.isUndef(mod)) return sema.addConstUndef(result_ty); | 30911 | if (val.isUndef(mod)) return mod.undefRef(result_ty); |
| 30978 | return sema.addConstant(val.slicePtr(mod)); | 30912 | return Air.internedToRef(val.slicePtr(mod).toIntern()); |
| 30979 | } | 30913 | } |
| 30980 | try sema.requireRuntimeBlock(block, slice_src, null); | 30914 | try sema.requireRuntimeBlock(block, slice_src, null); |
| 30981 | return block.addTyOp(.slice_ptr, result_ty, slice); | 30915 | return block.addTyOp(.slice_ptr, result_ty, slice); |
| ... | @@ -30990,9 +30924,9 @@ fn analyzeSliceLen( | ... | @@ -30990,9 +30924,9 @@ fn analyzeSliceLen( |
| 30990 | const mod = sema.mod; | 30924 | const mod = sema.mod; |
| 30991 | if (try sema.resolveMaybeUndefVal(slice_inst)) |slice_val| { | 30925 | if (try sema.resolveMaybeUndefVal(slice_inst)) |slice_val| { |
| 30992 | if (slice_val.isUndef(mod)) { | 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 | try sema.requireRuntimeBlock(block, src, null); | 30931 | try sema.requireRuntimeBlock(block, src, null); |
| 30998 | return block.addTyOp(.slice_len, Type.usize, slice_inst); | 30932 | return block.addTyOp(.slice_len, Type.usize, slice_inst); |
| ... | @@ -31009,7 +30943,7 @@ fn analyzeIsNull( | ... | @@ -31009,7 +30943,7 @@ fn analyzeIsNull( |
| 31009 | const result_ty = Type.bool; | 30943 | const result_ty = Type.bool; |
| 31010 | if (try sema.resolveMaybeUndefVal(operand)) |opt_val| { | 30944 | if (try sema.resolveMaybeUndefVal(operand)) |opt_val| { |
| 31011 | if (opt_val.isUndef(mod)) { | 30945 | if (opt_val.isUndef(mod)) { |
| 31012 | return sema.addConstUndef(result_ty); | 30946 | return mod.undefRef(result_ty); |
| 31013 | } | 30947 | } |
| 31014 | const is_null = opt_val.isNull(mod); | 30948 | const is_null = opt_val.isNull(mod); |
| 31015 | const bool_value = if (invert_logic) !is_null else is_null; | 30949 | const bool_value = if (invert_logic) !is_null else is_null; |
| ... | @@ -31081,7 +31015,7 @@ fn analyzeIsNonErrComptimeOnly( | ... | @@ -31081,7 +31015,7 @@ fn analyzeIsNonErrComptimeOnly( |
| 31081 | else => {}, | 31015 | else => {}, |
| 31082 | } | 31016 | } |
| 31083 | } else if (operand == .undef) { | 31017 | } else if (operand == .undef) { |
| 31084 | return sema.addConstUndef(Type.bool); | 31018 | return mod.undefRef(Type.bool); |
| 31085 | } else if (@intFromEnum(operand) < InternPool.static_len) { | 31019 | } else if (@intFromEnum(operand) < InternPool.static_len) { |
| 31086 | // None of the ref tags can be errors. | 31020 | // None of the ref tags can be errors. |
| 31087 | return .bool_true; | 31021 | return .bool_true; |
| ... | @@ -31165,7 +31099,7 @@ fn analyzeIsNonErrComptimeOnly( | ... | @@ -31165,7 +31099,7 @@ fn analyzeIsNonErrComptimeOnly( |
| 31165 | | 31099 | |
| 31166 | if (maybe_operand_val) |err_union| { | 31100 | if (maybe_operand_val) |err_union| { |
| 31167 | if (err_union.isUndef(mod)) { | 31101 | if (err_union.isUndef(mod)) { |
| 31168 | return sema.addConstUndef(Type.bool); | 31102 | return mod.undefRef(Type.bool); |
| 31169 | } | 31103 | } |
| 31170 | if (err_union.getErrorName(mod) == .none) { | 31104 | if (err_union.getErrorName(mod) == .none) { |
| 31171 | return .bool_true; | 31105 | return .bool_true; |
| ... | @@ -31341,7 +31275,7 @@ fn analyzeSlice( | ... | @@ -31341,7 +31275,7 @@ fn analyzeSlice( |
| 31341 | break :e end; | 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 | } else if (slice_ty.isSlice(mod)) { | 31279 | } else if (slice_ty.isSlice(mod)) { |
| 31346 | if (!end_is_len) { | 31280 | if (!end_is_len) { |
| 31347 | const end = if (by_length) end: { | 31281 | const end = if (by_length) end: { |
| ... | @@ -31554,15 +31488,15 @@ fn analyzeSlice( | ... | @@ -31554,15 +31488,15 @@ fn analyzeSlice( |
| 31554 | }; | 31488 | }; |
| 31555 | | 31489 | |
| 31556 | if (!new_ptr_val.isUndef(mod)) { | 31490 | if (!new_ptr_val.isUndef(mod)) { |
| 31557 | return sema.addConstant(try mod.getCoerced( | 31491 | return Air.internedToRef((try mod.getCoerced( |
| 31558 | (try new_ptr_val.intern(new_ptr_ty, mod)).toValue(), | 31492 | (try new_ptr_val.intern(new_ptr_ty, mod)).toValue(), |
| 31559 | return_ty, | 31493 | return_ty, |
| 31560 | )); | 31494 | )).toIntern()); |
| 31561 | } | 31495 | } |
| 31562 | | 31496 | |
| 31563 | // Special case: @as([]i32, undefined)[x..x] | 31497 | // Special case: @as([]i32, undefined)[x..x] |
| 31564 | if (new_len_int == 0) { | 31498 | if (new_len_int == 0) { |
| 31565 | return sema.addConstUndef(return_ty); | 31499 | return mod.undefRef(return_ty); |
| 31566 | } | 31500 | } |
| 31567 | | 31501 | |
| 31568 | return sema.fail(block, src, "non-zero length slice of undefined pointer", .{}); | 31502 | return sema.fail(block, src, "non-zero length slice of undefined pointer", .{}); |
| ... | @@ -31591,12 +31525,12 @@ fn analyzeSlice( | ... | @@ -31591,12 +31525,12 @@ fn analyzeSlice( |
| 31591 | | 31525 | |
| 31592 | // requirement: end <= len | 31526 | // requirement: end <= len |
| 31593 | const opt_len_inst = if (array_ty.zigTypeTag(mod) == .Array) | 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 | else if (slice_ty.isSlice(mod)) blk: { | 31529 | else if (slice_ty.isSlice(mod)) blk: { |
| 31596 | if (try sema.resolveDefinedValue(block, src, ptr_or_slice)) |slice_val| { | 31530 | if (try sema.resolveDefinedValue(block, src, ptr_or_slice)) |slice_val| { |
| 31597 | // we don't need to add one for sentinels because the | 31531 | // we don't need to add one for sentinels because the |
| 31598 | // underlying value data includes the sentinel | 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 | const slice_len_inst = try block.addTyOp(.slice_len, Type.usize, ptr_or_slice); | 31536 | const slice_len_inst = try block.addTyOp(.slice_len, Type.usize, ptr_or_slice); |
| ... | @@ -31619,7 +31553,7 @@ fn analyzeSlice( | ... | @@ -31619,7 +31553,7 @@ fn analyzeSlice( |
| 31619 | const result = try block.addInst(.{ | 31553 | const result = try block.addInst(.{ |
| 31620 | .tag = .slice, | 31554 | .tag = .slice, |
| 31621 | .data = .{ .ty_pl = .{ | 31555 | .data = .{ .ty_pl = .{ |
| 31622 | .ty = try sema.addType(return_ty), | 31556 | .ty = Air.internedToRef(return_ty.toIntern()), |
| 31623 | .payload = try sema.addExtra(Air.Bin{ | 31557 | .payload = try sema.addExtra(Air.Bin{ |
| 31624 | .lhs = new_ptr, | 31558 | .lhs = new_ptr, |
| 31625 | .rhs = new_len, | 31559 | .rhs = new_len, |
| ... | @@ -31683,7 +31617,7 @@ fn cmpNumeric( | ... | @@ -31683,7 +31617,7 @@ fn cmpNumeric( |
| 31683 | } | 31617 | } |
| 31684 | | 31618 | |
| 31685 | if (lhs_val.isUndef(mod) or rhs_val.isUndef(mod)) { | 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 | if (lhs_val.isNan(mod) or rhs_val.isNan(mod)) { | 31622 | if (lhs_val.isNan(mod) or rhs_val.isNan(mod)) { |
| 31689 | if (op == std.math.CompareOperator.neq) { | 31623 | if (op == std.math.CompareOperator.neq) { |
| ... | @@ -31776,7 +31710,7 @@ fn cmpNumeric( | ... | @@ -31776,7 +31710,7 @@ fn cmpNumeric( |
| 31776 | var lhs_bits: usize = undefined; | 31710 | var lhs_bits: usize = undefined; |
| 31777 | if (try sema.resolveMaybeUndefLazyVal(lhs)) |lhs_val| { | 31711 | if (try sema.resolveMaybeUndefLazyVal(lhs)) |lhs_val| { |
| 31778 | if (lhs_val.isUndef(mod)) | 31712 | if (lhs_val.isUndef(mod)) |
| 31779 | return sema.addConstUndef(Type.bool); | 31713 | return mod.undefRef(Type.bool); |
| 31780 | if (lhs_val.isNan(mod)) switch (op) { | 31714 | if (lhs_val.isNan(mod)) switch (op) { |
| 31781 | .neq => return Air.Inst.Ref.bool_true, | 31715 | .neq => return Air.Inst.Ref.bool_true, |
| 31782 | else => return Air.Inst.Ref.bool_false, | 31716 | else => return Air.Inst.Ref.bool_false, |
| ... | @@ -31834,7 +31768,7 @@ fn cmpNumeric( | ... | @@ -31834,7 +31768,7 @@ fn cmpNumeric( |
| 31834 | var rhs_bits: usize = undefined; | 31768 | var rhs_bits: usize = undefined; |
| 31835 | if (try sema.resolveMaybeUndefLazyVal(rhs)) |rhs_val| { | 31769 | if (try sema.resolveMaybeUndefLazyVal(rhs)) |rhs_val| { |
| 31836 | if (rhs_val.isUndef(mod)) | 31770 | if (rhs_val.isUndef(mod)) |
| 31837 | return sema.addConstUndef(Type.bool); | 31771 | return mod.undefRef(Type.bool); |
| 31838 | if (rhs_val.isNan(mod)) switch (op) { | 31772 | if (rhs_val.isNan(mod)) switch (op) { |
| 31839 | .neq => return Air.Inst.Ref.bool_true, | 31773 | .neq => return Air.Inst.Ref.bool_true, |
| 31840 | else => return Air.Inst.Ref.bool_false, | 31774 | else => return Air.Inst.Ref.bool_false, |
| ... | @@ -32039,10 +31973,10 @@ fn cmpVector( | ... | @@ -32039,10 +31973,10 @@ fn cmpVector( |
| 32039 | if (try sema.resolveMaybeUndefVal(casted_lhs)) |lhs_val| { | 31973 | if (try sema.resolveMaybeUndefVal(casted_lhs)) |lhs_val| { |
| 32040 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { | 31974 | if (try sema.resolveMaybeUndefVal(casted_rhs)) |rhs_val| { |
| 32041 | if (lhs_val.isUndef(mod) or rhs_val.isUndef(mod)) { | 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 | const cmp_val = try sema.compareVector(lhs_val, op, rhs_val, resolved_ty); | 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 | } else { | 31980 | } else { |
| 32047 | break :src rhs_src; | 31981 | break :src rhs_src; |
| 32048 | } | 31982 | } |
| ... | @@ -32063,10 +31997,10 @@ fn wrapOptional( | ... | @@ -32063,10 +31997,10 @@ fn wrapOptional( |
| 32063 | inst_src: LazySrcLoc, | 31997 | inst_src: LazySrcLoc, |
| 32064 | ) !Air.Inst.Ref { | 31998 | ) !Air.Inst.Ref { |
| 32065 | if (try sema.resolveMaybeUndefVal(inst)) |val| { | 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 | .ty = dest_ty.toIntern(), | 32001 | .ty = dest_ty.toIntern(), |
| 32068 | .val = val.toIntern(), | 32002 | .val = val.toIntern(), |
| 32069 | } })).toValue()); | 32003 | } }))); |
| 32070 | } | 32004 | } |
| 32071 | | 32005 | |
| 32072 | try sema.requireRuntimeBlock(block, inst_src, null); | 32006 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | @@ -32084,10 +32018,10 @@ fn wrapErrorUnionPayload( | ... | @@ -32084,10 +32018,10 @@ fn wrapErrorUnionPayload( |
| 32084 | const dest_payload_ty = dest_ty.errorUnionPayload(mod); | 32018 | const dest_payload_ty = dest_ty.errorUnionPayload(mod); |
| 32085 | const coerced = try sema.coerceExtra(block, dest_payload_ty, inst, inst_src, .{ .report_err = false }); | 32019 | const coerced = try sema.coerceExtra(block, dest_payload_ty, inst, inst_src, .{ .report_err = false }); |
| 32086 | if (try sema.resolveMaybeUndefVal(coerced)) |val| { | 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 | .ty = dest_ty.toIntern(), | 32022 | .ty = dest_ty.toIntern(), |
| 32089 | .val = .{ .payload = try val.intern(dest_payload_ty, mod) }, | 32023 | .val = .{ .payload = try val.intern(dest_payload_ty, mod) }, |
| 32090 | } })).toValue()); | 32024 | } }))); |
| 32091 | } | 32025 | } |
| 32092 | try sema.requireRuntimeBlock(block, inst_src, null); | 32026 | try sema.requireRuntimeBlock(block, inst_src, null); |
| 32093 | try sema.queueFullTypeResolution(dest_payload_ty); | 32027 | try sema.queueFullTypeResolution(dest_payload_ty); |
| ... | @@ -32145,10 +32079,10 @@ fn wrapErrorUnionSet( | ... | @@ -32145,10 +32079,10 @@ fn wrapErrorUnionSet( |
| 32145 | else => unreachable, | 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 | .ty = dest_ty.toIntern(), | 32083 | .ty = dest_ty.toIntern(), |
| 32150 | .val = .{ .err_name = expected_name }, | 32084 | .val = .{ .err_name = expected_name }, |
| 32151 | } })).toValue()); | 32085 | } }))); |
| 32152 | } | 32086 | } |
| 32153 | | 32087 | |
| 32154 | try sema.requireRuntimeBlock(block, inst_src, null); | 32088 | try sema.requireRuntimeBlock(block, inst_src, null); |
| ... | @@ -32165,10 +32099,10 @@ fn unionToTag( | ... | @@ -32165,10 +32099,10 @@ fn unionToTag( |
| 32165 | ) !Air.Inst.Ref { | 32099 | ) !Air.Inst.Ref { |
| 32166 | const mod = sema.mod; | 32100 | const mod = sema.mod; |
| 32167 | if ((try sema.typeHasOnePossibleValue(enum_ty))) |opv| { | 32101 | if ((try sema.typeHasOnePossibleValue(enum_ty))) |opv| { |
| 32168 | return sema.addConstant(opv); | 32102 | return Air.internedToRef(opv.toIntern()); |
| 32169 | } | 32103 | } |
| 32170 | if (try sema.resolveMaybeUndefVal(un)) |un_val| { | 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 | try sema.requireRuntimeBlock(block, un_src, null); | 32107 | try sema.requireRuntimeBlock(block, un_src, null); |
| 32174 | return block.addTyOp(.get_union_tag, enum_ty, un); | 32108 | return block.addTyOp(.get_union_tag, enum_ty, un); |
| ... | @@ -33510,7 +33444,7 @@ fn resolvePeerTypesInner( | ... | @@ -33510,7 +33444,7 @@ fn resolvePeerTypesInner( |
| 33510 | comptime_val = null; | 33444 | comptime_val = null; |
| 33511 | break; | 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 | const coerced_inst = sema.coerceExtra(block, field_ty.toType(), uncoerced_field, src, .{ .report_err = false }) catch |err| switch (err) { | 33448 | const coerced_inst = sema.coerceExtra(block, field_ty.toType(), uncoerced_field, src, .{ .report_err = false }) catch |err| switch (err) { |
| 33515 | // 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 | 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 | error.NotCoercible => { | 33450 | error.NotCoercible => { |
| ... | @@ -35977,27 +35911,6 @@ pub fn getTmpAir(sema: Sema) Air { | ... | @@ -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 | pub fn addExtra(sema: *Sema, extra: anytype) Allocator.Error!u32 { | 35914 | pub fn addExtra(sema: *Sema, extra: anytype) Allocator.Error!u32 { |
| 36002 | const fields = std.meta.fields(@TypeOf(extra)); | 35915 | const fields = std.meta.fields(@TypeOf(extra)); |
| 36003 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, fields.len); | 35916 | try sema.air_extra.ensureUnusedCapacity(sema.gpa, fields.len); |
| ... | @@ -36075,13 +35988,13 @@ fn analyzeComptimeAlloc( | ... | @@ -36075,13 +35988,13 @@ fn analyzeComptimeAlloc( |
| 36075 | | 35988 | |
| 36076 | try sema.comptime_mutable_decls.append(decl_index); | 35989 | try sema.comptime_mutable_decls.append(decl_index); |
| 36077 | try mod.declareDeclDependency(sema.owner_decl_index, decl_index); | 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 | .ty = ptr_type.toIntern(), | 35992 | .ty = ptr_type.toIntern(), |
| 36080 | .addr = .{ .mut_decl = .{ | 35993 | .addr = .{ .mut_decl = .{ |
| 36081 | .decl = decl_index, | 35994 | .decl = decl_index, |
| 36082 | .runtime_index = block.runtime_index, | 35995 | .runtime_index = block.runtime_index, |
| 36083 | } }, | 35996 | } }, |
| 36084 | } })).toValue()); | 35997 | } }))); |
| 36085 | } | 35998 | } |
| 36086 | | 35999 | |
| 36087 | /// The places where a user can specify an address space attribute | 36000 | /// The places where a user can specify an address space attribute |