authorgravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2023-08-11 14:02:52+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-08-11 11:02:24-07:00
log5e0107fbce8f33f84af232c3edc912a81615175f
tree1e937c9434b6502df9eff05a8175f8171985c936
parent8b9161179d08a3f1dc22ea61e6165a0c638bfae3

Sema: remove redundant addConstant functions

After ff37ccd, interned values are trivial to convert to Air refs, using `Air.internedToRef`. This made functions like `Sema.addConstant` effectively redundant. This commit removes `Sema.addConstant` and `Sema.addType`, replacing them with direct usages of `Air.internedToRef`. Additionally, a new helper `Module.undefValue` is added, and the following functions are moved into Module: * `Sema.addConstUndef` -> `Module.undefRef` * `Sema.addUnsignedInt` -> `Module.intRef` (now also works for signed types) The general pattern here is that any `Module.xyzValue` helper may also have a corresponding `Module.xyzRef` helper, which just wraps the call in `Air.internedToRef`.

2 files changed, 595 insertions(+), 670 deletions(-)

src/Module.zig+12
...@@ -6612,6 +6612,14 @@ pub fn enumValueFieldIndex(mod: *Module, ty: Type, field_index: u32) Allocator.E...@@ -6612,6 +6612,14 @@ pub fn enumValueFieldIndex(mod: *Module, ty: Type, field_index: u32) Allocator.E
6612 } })).toValue();6612 } })).toValue();
6613}6613}
66146614
6615pub fn undefValue(mod: *Module, ty: Type) Allocator.Error!Value {
6616 return (try mod.intern(.{ .undef = ty.toIntern() })).toValue();
6617}
6618
6619pub fn undefRef(mod: *Module, ty: Type) Allocator.Error!Air.Inst.Ref {
6620 return Air.internedToRef((try mod.undefValue(ty)).toIntern());
6621}
6622
6615pub fn intValue(mod: *Module, ty: Type, x: anytype) Allocator.Error!Value {6623pub fn intValue(mod: *Module, ty: Type, x: anytype) Allocator.Error!Value {
6616 if (std.math.cast(u64, x)) |casted| return intValue_u64(mod, ty, casted);6624 if (std.math.cast(u64, x)) |casted| return intValue_u64(mod, ty, casted);
6617 if (std.math.cast(i64, x)) |casted| return intValue_i64(mod, ty, casted);6625 if (std.math.cast(i64, x)) |casted| return intValue_i64(mod, ty, casted);
...@@ -6620,6 +6628,10 @@ pub fn intValue(mod: *Module, ty: Type, x: anytype) Allocator.Error!Value {...@@ -6620,6 +6628,10 @@ pub fn intValue(mod: *Module, ty: Type, x: anytype) Allocator.Error!Value {
6620 return intValue_big(mod, ty, big_int.toConst());6628 return intValue_big(mod, ty, big_int.toConst());
6621}6629}
66226630
6631pub fn intRef(mod: *Module, ty: Type, x: anytype) Allocator.Error!Air.Inst.Ref {
6632 return Air.internedToRef((try mod.intValue(ty, x)).toIntern());
6633}
6634
6623pub fn intValue_big(mod: *Module, ty: Type, x: BigIntConst) Allocator.Error!Value {6635pub fn intValue_big(mod: *Module, ty: Type, x: BigIntConst) Allocator.Error!Value {
6624 const i = try intern(mod, .{ .int = .{6636 const i = try intern(mod, .{ .int = .{
6625 .ty = ty.toIntern(),6637 .ty = ty.toIntern(),
src/Sema.zig+583-670
...@@ -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 }
634634
...@@ -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(
27392737
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 });
27622760
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
37813779
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 }
37863784
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 }
45934591
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}
45974595
...@@ -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 else4684 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 }
46914689
...@@ -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 else4890 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 by4954 // 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(
49664964
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();
54365434
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}
54405438
5441fn zirIntBig(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {5439fn 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);
54565454
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}
54645460
5465fn zirFloat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {5461fn 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}
54725469
5473fn zirFloat128(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {5470fn 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}
54825477
5483fn zirCompileError(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index {5478fn 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}
57475742
5748fn zirSuspendBlock(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {5743fn 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_reason6933 // TODO set comptime_reason
6939 }6934 }
6940 // Give the arg its result type6935 // 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);
69446939
...@@ -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 }
74067399
...@@ -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}
80728065
8073fn zirOptionalType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8066fn 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());
80878080
8088 return sema.addType(opt_type);8081 return Air.internedToRef(opt_type.toIntern());
8089}8082}
80908083
8091fn zirElemTypeIndex(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8084fn 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 instruction8096 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}
81128105
...@@ -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 instruction8110 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}
81208113
8121fn zirVectorElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8114fn 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}
81378130
8138fn zirVectorType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8131fn 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}
81538146
8154fn zirArrayType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8147fn 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 });
81698162
8170 return sema.addType(array_ty);8163 return Air.internedToRef(array_ty.toIntern());
8171}8164}
81728165
8173fn zirArrayTypeSentinel(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8166fn 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 });
81938186
8194 return sema.addType(array_ty);8187 return Air.internedToRef(array_ty.toIntern());
8195}8188}
81968189
8197fn validateArrayElemType(sema: *Sema, block: *Block, elem_type: Type, elem_src: LazySrcLoc) !void {8190fn 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);
82188211
8219 return sema.addType(anyframe_type);8212 return Air.internedToRef(anyframe_type.toIntern());
8220}8213}
82218214
8222fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8215fn 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}
82438236
8244fn validateErrorUnionPayloadType(sema: *Sema, block: *Block, payload_ty: Type, payload_src: LazySrcLoc) !void {8237fn 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}
82708263
8271fn zirIntFromError(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) CompileError!Air.Inst.Ref {8264fn 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
82828275
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 }
82938286
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}
84188411
8419fn zirIntFromEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {8412fn 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);
84508443
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 }
84548447
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 }
84598452
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 }
85168509
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. In8512 // 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 }
86048597
...@@ -8654,7 +8647,7 @@ fn zirOptionalPayload(...@@ -8654,7 +8647,7 @@ fn zirOptionalPayload(
86548647
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 else8651 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 }
87128703
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 }
87938784
...@@ -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);
88318822
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 }
88388829
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 }
88698860
...@@ -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 }
98999891
9900 return sema.addConstant(opv);9892 return Air.internedToRef(opv.toIntern());
9901 }9893 }
99029894
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);
99199911
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());
99349926
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 }
1017310165
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}
1026610258
...@@ -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 }
1061210602
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 }
1068610676
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 }
1069910687
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 }
1070310691
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 }
1071110699
...@@ -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 below10743 .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;
1187811866
11879 const item_ref = try sema.addConstant(item);11867 const item_ref = Air.internedToRef(item.toIntern());
1188011868
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;
1212512113
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());
1212812116
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);
1217812166
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;
1220712195
12208 const item_ref = try sema.addConstant(cur.toValue());12196 const item_ref = Air.internedToRef(cur);
1220912197
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(
1248312471
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;
1248812476
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}
1289812886
12899fn zirEmbedFile(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {12887fn 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}
1296012948
12961fn zirShl(12949fn zirShl(
...@@ -12991,7 +12979,7 @@ fn zirShl(...@@ -12991,7 +12979,7 @@ fn zirShl(
1299112979
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 }
1303813026
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 };
1307213060
13073 return sema.addConstant(val);13061 return Air.internedToRef(val.toIntern());
13074 } else lhs_src;13062 } else lhs_src;
1307513063
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 or13066 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 else13120 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);
1313813124
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(
1317113157
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);
1324513231
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.
1336013346
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 }
1338013366
...@@ -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;
1340213388
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 };
1345713443
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
1363613622
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 }
1365713643
...@@ -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", .{});
1374013726
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 };
1377813764
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 }
1391413900
...@@ -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 }
1396013946
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}
1396413950
...@@ -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 }
1398013966
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}
1398413970
...@@ -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 }
1412814114
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 }
1443214414
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 }
1454614524
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 }
1528115247
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 }
1529115257
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}
1529715263
...@@ -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 else15433 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);
1547315435
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 else15531 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);
1557515533
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 }
1576715717
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 else15720 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);
1577215722
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 else15764 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);
1581815768
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);
1588915839
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);
1620816158
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);
1631516265
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 }
1632016270
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),
1639316343
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}
1641616366
16417fn zirBitSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {16367fn 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),
1643616386
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}
1645616406
16457fn zirThis(16407fn 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. #1493816540 // 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}
1669016640
16691fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {16641fn 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 } });
1713617086
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}
1784717797
17848fn zirTypeofBuiltin(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {17798fn 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}
1787317823
17874fn zirTypeofLog2IntType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {17824fn 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}
1788217832
17883fn log2IntType(sema: *Sema, block: *Block, operand: Type, src: LazySrcLoc) CompileError!Type {17833fn 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 }
1795717907
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}
1796117911
17962fn zirBoolNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {17912fn 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_false17927 Air.Inst.Ref.bool_false
17978 else17928 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}
1846218412
...@@ -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}
1890518855
18906fn zirStructInitEmpty(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {18856fn 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}
1895918909
18960fn zirUnionInit(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {18910fn 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 }
1900618956
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 }
1949319443
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 }
1949719447
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());
1954519495
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());
1955819508
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());
1967519625
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) orelse19687 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) orelse19695 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}
1979119741
19792fn zirFrame(19742fn 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}
1981519765
19816fn zirIntFromBool(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {19766fn 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);
1988219832
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 }
1989319843
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 }
1990419854
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();
2020520155
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 }
2022420174
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) orelse20179 const payload_val = union_val.val.toValue().optionalValue(mod) orelse
20230 return sema.addType(Type.anyerror);20180 return Air.internedToRef(Type.anyerror.toIntern());
2023120181
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 }
2025120201
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
2110621056
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
2114621096
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 }
2120121151
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 }
2120821158
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 }
2129521243
21296 return sema.addConstant(try mod.getCoerced(val, dest_ty));21244 return Air.internedToRef((try mod.getCoerced(val, dest_ty)).toIntern());
21297 }21245 }
2129821246
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 }
2165121599
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 length21639 // 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-like21640 // 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);
2172821672
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 }
2173221676
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);
2176021704
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 }
2176421708
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 }
2177021714
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 }
2179621740
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 }
2181521759
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;
2183521779
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 }
2183921783
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);
2185021794
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 }
2189721841
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 }
2190121845
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;
2190921853
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);
2191721861
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;
2192921873
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);
2194421888
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 }
2194821892
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;
2195721901
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);
2196521909
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;
2197721921
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!
2198421928
21985fn zirBitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {21929fn 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}
2198921933
21990fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {21934fn 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 structs21936 // 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}
2199521939
21996fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 {21940fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u64 {
...@@ -22622,10 +22566,10 @@ fn zirCmpxchg(...@@ -22622,10 +22566,10 @@ fn zirCmpxchg(
2262222566
22623 // special case zero bit types22567 // 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 }
2263022574
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 pointer22579 // TODO: this should probably cause the memory stored at the pointer
22636 // to become undef as well22580 // 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 }
2268822632
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 }
2273122675
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);
2273422678
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 }
2275122695
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 });
2284122785
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);
2284422788
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 }
2290222846
...@@ -22923,10 +22867,10 @@ fn analyzeShuffle(...@@ -22923,10 +22867,10 @@ fn analyzeShuffle(
22923 } });22867 } });
2292422868
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);
2298522929
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);
2298822932
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);
2299122935
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);
2299422938
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 }
2300122945
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 }
2306223006
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 }
2306623010
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 }
2307223016
...@@ -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
2311923063
23120 // special case zero bit types23064 // 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 }
2312423068
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: on23089 // 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;
2315123095
...@@ -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.
2322423168
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);
2322823172
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 }
2345823402
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(
2361123555
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 }
2362923573
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_len23891 dest_len
23948 else23892 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(
2414224086
24143 try sema.validateVarType(block, ty_src, var_ty, small.is_extern);24087 try sema.validateVarType(block, ty_src, var_ty, small.is_extern);
2414424088
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}
2415724101
24158fn zirFuncFancy(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {24102fn 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);
2465224596
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}
2466224606
24663fn zirWorkItem(24607fn 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.
2525925203
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);
2526325207
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}
2527125215
...@@ -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());
2535825302
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_type25512 child_type
25571 else25513 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 });
2571525655
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);
2572625666
...@@ -25736,13 +25676,13 @@ fn fieldPtr(...@@ -25736,13 +25676,13 @@ fn fieldPtr(
25736 });25676 });
2573725677
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);
2574825688
...@@ -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 }
2607026010
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 }
2608126021
...@@ -26152,7 +26092,7 @@ fn structFieldPtr(...@@ -26152,7 +26092,7 @@ fn structFieldPtr(
2615226092
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 }
2627426214
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 }
2628526225
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];
2631226252
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 }
2631626256
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 }
2632426264
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);
2638926329
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 }
2639326333
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 }
2640826348
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 }
2641226352
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 }
2650426444
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).?));
2654126481
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);
2654426484
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);
2666126601
...@@ -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 });
2681826758
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 }
2682526765
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 }
2683526775
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);
2686726807
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 field26809 return Air.internedToRef(default_value.toIntern()); // comptime field
26870 }26810 }
2687126811
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 }
2687626816
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 }
2693026870
...@@ -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 check26876 // 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(
2698026920
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 }
2699026930
...@@ -26997,7 +26937,7 @@ fn elemPtrArray(...@@ -26997,7 +26937,7 @@ fn elemPtrArray(
2699726937
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 else26997 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(
2708827028
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 }
2710727047
...@@ -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 }
2721027150
27211 // null to ?T27151 // 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 }
2721827158
27219 // cast from ?*T and ?[*]T to ?*anyopaque27159 // cast from ?*T and ?[*]T to ?*anyopaque
...@@ -27382,7 +27322,7 @@ fn coerceExtra(...@@ -27382,7 +27322,7 @@ fn coerceExtra(
27382 // coercion to C pointer27322 // 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 so27427 // 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 else27433 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 }
2749827438
27499 // pointer to tuple to slice27439 // 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 number27508 // 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 type27622 // 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!T27669 // 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` which27730 // 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 }
2779927735
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}
2786827804
27869const InMemoryCoercionResult = union(enum) {27805const 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 location28817 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(
2992029856
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 };
3014130077
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 }
3014430080
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;
3034830284
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 location30287 const src = inst_src; // TODO better source location
30352 const elem_src = inst_src; // TODO better source location30288 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 }
3036930305
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}
3037530311
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 location30353 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 }
3043430370
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}
3044030376
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 }
3058130517
...@@ -30597,7 +30533,7 @@ fn coerceTupleToStruct(...@@ -30597,7 +30533,7 @@ fn coerceTupleToStruct(
30597 // TODO: figure out InternPool removals for incremental compilation30533 // TODO: figure out InternPool removals for incremental compilation
30598 //errdefer ip.remove(struct_val);30534 //errdefer ip.remove(struct_val);
3059930535
30600 return sema.addConstant(struct_val.toValue());30536 return Air.internedToRef(struct_val);
30601}30537}
3060230538
30603fn coerceTupleToTuple(30539fn 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 }
3072530661
...@@ -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 }
3073630672
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}
3074430678
30745fn analyzeDeclVal(30679fn 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}
3087130805
30872fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: Decl.Index) !void {30806fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: Decl.Index) !void {
...@@ -30939,12 +30873,12 @@ fn analyzeLoad(...@@ -30939,12 +30873,12 @@ fn analyzeLoad(
30939 };30873 };
3094030874
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 }
3094430878
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 }
3095030884
...@@ -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(
3116531099
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 }
3134331277
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 };
3155531489
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 }
3156231496
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 }
3156731501
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(
3159131525
31592 // requirement: end <= len31526 // 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 the31531 // we don't need to add one for sentinels because the
31598 // underlying value data includes the sentinel31532 // 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 }
3160131535
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 }
3168431618
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 }
3207132005
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 }
3215332087
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 anyway33449 // 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}
3597935913
35980// TODO: make this non-fallible or remove it entirely
35981pub fn addType(sema: *Sema, ty: Type) !Air.Inst.Ref {
35982 _ = sema;
35983 return Air.internedToRef(ty.toIntern());
35984}
35985
35986fn 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
35991fn 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
35996pub fn addConstant(sema: *Sema, val: Value) !Air.Inst.Ref {
35997 _ = sema;
35998 return Air.internedToRef(val.toIntern());
35999}
36000
36001pub fn addExtra(sema: *Sema, extra: anytype) Allocator.Error!u32 {35914pub 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(
3607535988
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}
3608635999
36087/// The places where a user can specify an address space attribute36000/// The places where a user can specify an address space attribute