authorgravatar for justus@klausecker.deJustus Klausecker <justus@klausecker.de> 2025-08-07 19:42:40+02:00
committergravatar for justus@klausecker.deJustus Klausecker <justus@klausecker.de> 2025-08-12 16:33:57+02:00
log79e5c138c6474713776caf25cbc21923471ff759
treede185dfb6047e9ab3f3723672c35df61fc74611c
parent7756fa66411d88f8e280d6d5e91d809ea536cbff

replace even more aggregate interns


8 files changed, 68 insertions(+), 197 deletions(-)

src/Air/Legalize.zig+3-12
......@@ -941,10 +941,7 @@ fn scalarizeBlockPayload(l: *Legalize, orig_inst: Air.Inst.Index, comptime form:
941941 .lhs = Air.internedToRef(try pt.intern(.{ .ptr = .{
942942 .ty = (try pt.manyConstPtrType(mask_elem_ty)).toIntern(),
943943 .base_addr = .{ .uav = .{
944 .val = try pt.intern(.{ .aggregate = .{
945 .ty = mask_ty.toIntern(),
946 .storage = .{ .elems = mask_elems },
947 } }),
944 .val = (try pt.aggregateValue(mask_ty, mask_elems)).toIntern(),
948945 .orig_ty = (try pt.singleConstPtrType(mask_ty)).toIntern(),
949946 } },
950947 .byte_offset = 0,
......@@ -1023,10 +1020,7 @@ fn scalarizeBlockPayload(l: *Legalize, orig_inst: Air.Inst.Index, comptime form:
10231020 break :operand_b Air.internedToRef(try pt.intern(.{ .ptr = .{
10241021 .ty = (try pt.manyConstPtrType(elem_ty)).toIntern(),
10251022 .base_addr = .{ .uav = .{
1026 .val = try pt.intern(.{ .aggregate = .{
1027 .ty = ct_elems_ty.toIntern(),
1028 .storage = .{ .elems = ct_elems.keys() },
1029 } }),
1023 .val = (try pt.aggregateValue(ct_elems_ty, ct_elems.keys())).toIntern(),
10301024 .orig_ty = (try pt.singleConstPtrType(ct_elems_ty)).toIntern(),
10311025 } },
10321026 .byte_offset = 0,
......@@ -2550,10 +2544,7 @@ fn floatFromBigIntVal(
25502544 else => unreachable,
25512545 };
25522546 if (is_vector) {
2553 return .fromInterned(try pt.intern(.{ .aggregate = .{
2554 .ty = float_ty.toIntern(),
2555 .storage = .{ .repeated_elem = scalar_val.toIntern() },
2556 } }));
2547 return pt.aggregateSplatValue(float_ty, scalar_val);
25572548 } else {
25582549 return scalar_val;
25592550 }
src/Sema.zig+1-2
......@@ -14838,8 +14838,7 @@ fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
1483814838
1483914839 if (maybe_lhs_val) |lhs_val| {
1484014840 if (maybe_rhs_val) |rhs_val| {
14841 const result = try arith.div(sema, block, resolved_type, lhs_val, rhs_val, src, lhs_src, rhs_src, .div);
14842 return Air.internedToRef(result.toIntern());
14841 return .fromValue(try arith.div(sema, block, resolved_type, lhs_val, rhs_val, src, lhs_src, rhs_src, .div));
1484314842 }
1484414843 if (allow_div_zero) {
1484514844 if (lhs_val.isUndef(zcu)) return pt.undefRef(resolved_type);
src/Sema/LowerZon.zig+11-34
......@@ -120,10 +120,7 @@ fn lowerExprAnonResTy(self: *LowerZon, node: Zoir.Node.Index) CompileError!Inter
120120 .values = values,
121121 },
122122 );
123 return pt.intern(.{ .aggregate = .{
124 .ty = ty,
125 .storage = .{ .elems = values },
126 } });
123 return (try pt.aggregateValue(.fromInterned(ty), values)).toIntern();
127124 },
128125 .struct_literal => |init| {
129126 const elems = try self.sema.arena.alloc(InternPool.Index, init.names.len);
......@@ -205,10 +202,7 @@ fn lowerExprAnonResTy(self: *LowerZon, node: Zoir.Node.Index) CompileError!Inter
205202 try self.sema.declareDependency(.{ .interned = struct_ty });
206203 try self.sema.addTypeReferenceEntry(self.nodeSrc(node), struct_ty);
207204
208 return try pt.intern(.{ .aggregate = .{
209 .ty = struct_ty,
210 .storage = .{ .elems = elems },
211 } });
205 return (try pt.aggregateValue(.fromInterned(struct_ty), elems)).toIntern();
212206 },
213207 }
214208}
......@@ -638,10 +632,7 @@ fn lowerArray(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.
638632 elems[elems.len - 1] = sentinel.toIntern();
639633 }
640634
641 return self.sema.pt.intern(.{ .aggregate = .{
642 .ty = res_ty.toIntern(),
643 .storage = .{ .elems = elems },
644 } });
635 return (try self.sema.pt.aggregateValue(res_ty, elems)).toIntern();
645636}
646637
647638fn lowerEnum(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.Index {
......@@ -752,10 +743,7 @@ fn lowerTuple(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.
752743 }
753744 }
754745
755 return self.sema.pt.intern(.{ .aggregate = .{
756 .ty = res_ty.toIntern(),
757 .storage = .{ .elems = elems },
758 } });
746 return (try self.sema.pt.aggregateValue(res_ty, elems)).toIntern();
759747}
760748
761749fn lowerStruct(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.Index {
......@@ -815,12 +803,7 @@ fn lowerStruct(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool
815803 if (value.* == .none) return self.fail(node, "missing field '{f}'", .{name.fmt(ip)});
816804 }
817805
818 return self.sema.pt.intern(.{ .aggregate = .{
819 .ty = res_ty.toIntern(),
820 .storage = .{
821 .elems = field_values,
822 },
823 } });
806 return (try self.sema.pt.aggregateValue(res_ty, field_values)).toIntern();
824807}
825808
826809fn lowerSlice(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.Index {
......@@ -867,16 +850,13 @@ fn lowerSlice(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.
867850 elems[elems.len - 1] = ptr_info.sentinel;
868851 }
869852
870 const array_ty = try self.sema.pt.intern(.{ .array_type = .{
853 const array_ty = try self.sema.pt.arrayType(.{
871854 .len = elems.len,
872855 .sentinel = ptr_info.sentinel,
873856 .child = ptr_info.child,
874 } });
857 });
875858
876 const array = try self.sema.pt.intern(.{ .aggregate = .{
877 .ty = array_ty,
878 .storage = .{ .elems = elems },
879 } });
859 const array_val = try self.sema.pt.aggregateValue(array_ty, elems);
880860
881861 const many_item_ptr_type = try self.sema.pt.intern(.{ .ptr_type = .{
882862 .child = ptr_info.child,
......@@ -894,8 +874,8 @@ fn lowerSlice(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool.
894874 .ty = many_item_ptr_type,
895875 .base_addr = .{
896876 .uav = .{
897 .orig_ty = (try self.sema.pt.singleConstPtrType(.fromInterned(array_ty))).toIntern(),
898 .val = array,
877 .orig_ty = (try self.sema.pt.singleConstPtrType(array_ty)).toIntern(),
878 .val = array_val.toIntern(),
899879 },
900880 },
901881 .byte_offset = 0,
......@@ -994,8 +974,5 @@ fn lowerVector(self: *LowerZon, node: Zoir.Node.Index, res_ty: Type) !InternPool
994974 elem.* = try self.lowerExprKnownResTy(elem_nodes.at(@intCast(i)), .fromInterned(vector_info.child));
995975 }
996976
997 return self.sema.pt.intern(.{ .aggregate = .{
998 .ty = res_ty.toIntern(),
999 .storage = .{ .elems = elems },
1000 } });
977 return (try self.sema.pt.aggregateValue(res_ty, elems)).toIntern();
1001978}
src/Sema/arith.zig+10-30
......@@ -906,12 +906,7 @@ pub fn modRem(
906906 const rhs_elem = try rhs_val.elemValue(pt, elem_idx);
907907 result_elem.* = (try modRemScalar(sema, block, elem_ty, lhs_elem, rhs_elem, lhs_src, rhs_src, op, elem_idx)).toIntern();
908908 }
909
910 const result_val = try pt.intern(.{ .aggregate = .{
911 .ty = ty.toIntern(),
912 .storage = .{ .elems = elem_vals },
913 } });
914 return .fromInterned(result_val);
909 return pt.aggregateValue(ty, elem_vals);
915910 },
916911 else => return modRemScalar(sema, block, ty, lhs_val, rhs_val, lhs_src, rhs_src, op, null),
917912 }
......@@ -1022,14 +1017,11 @@ pub fn shlWithOverflow(
10221017 wr.* = elem_result.wrapped_result.toIntern();
10231018 }
10241019 return .{
1025 .overflow_bit = .fromInterned(try pt.intern(.{ .aggregate = .{
1026 .ty = (try pt.vectorType(.{ .len = @intCast(overflow_bits.len), .child = .u1_type })).toIntern(),
1027 .storage = .{ .elems = overflow_bits },
1028 } })),
1029 .wrapped_result = .fromInterned(try pt.intern(.{ .aggregate = .{
1030 .ty = lhs_ty.toIntern(),
1031 .storage = .{ .elems = wrapped_results },
1032 } })),
1020 .overflow_bit = try pt.aggregateValue(try pt.vectorType(.{
1021 .len = @intCast(overflow_bits.len),
1022 .child = .u1_type,
1023 }), overflow_bits),
1024 .wrapped_result = try pt.aggregateValue(lhs_ty, wrapped_results),
10331025 };
10341026 },
10351027 else => unreachable,
......@@ -1222,10 +1214,7 @@ pub fn truncate(
12221214 dest_bits,
12231215 )).toIntern();
12241216 }
1225 return .fromInterned(try pt.intern(.{ .aggregate = .{
1226 .ty = dest_ty.toIntern(),
1227 .storage = .{ .elems = elem_vals },
1228 } }));
1217 return pt.aggregateValue(dest_ty, elem_vals);
12291218 },
12301219 else => unreachable,
12311220 }
......@@ -1256,10 +1245,7 @@ pub fn bitwiseNot(sema: *Sema, ty: Type, val: Value) CompileError!Value {
12561245 else
12571246 (try intBitwiseNot(sema, elem_val, elem_ty)).toIntern();
12581247 }
1259 return .fromInterned(try pt.intern(.{ .aggregate = .{
1260 .ty = ty.toIntern(),
1261 .storage = .{ .elems = elem_vals },
1262 } }));
1248 return pt.aggregateValue(ty, elem_vals);
12631249 },
12641250 else => unreachable,
12651251 }
......@@ -1357,10 +1343,7 @@ pub fn bitReverse(sema: *Sema, val: Value, ty: Type) CompileError!Value {
13571343 else
13581344 (try intBitReverse(sema, elem_val, elem_ty)).toIntern();
13591345 }
1360 return .fromInterned(try pt.intern(.{ .aggregate = .{
1361 .ty = ty.toIntern(),
1362 .storage = .{ .elems = elem_vals },
1363 } }));
1346 return pt.aggregateValue(ty, elem_vals);
13641347 },
13651348 else => unreachable,
13661349 }
......@@ -1389,10 +1372,7 @@ pub fn byteSwap(sema: *Sema, val: Value, ty: Type) CompileError!Value {
13891372 else
13901373 (try intByteSwap(sema, elem_val, elem_ty)).toIntern();
13911374 }
1392 return .fromInterned(try pt.intern(.{ .aggregate = .{
1393 .ty = ty.toIntern(),
1394 .storage = .{ .elems = elem_vals },
1395 } }));
1375 return pt.aggregateValue(ty, elem_vals);
13961376 },
13971377 else => unreachable,
13981378 }
src/Sema/comptime_ptr_access.zig+4-6
......@@ -980,13 +980,14 @@ fn unflattenArray(
980980 elems: []const InternPool.Index,
981981 next_idx: *u64,
982982) Allocator.Error!Value {
983 const zcu = sema.pt.zcu;
983 const pt = sema.pt;
984 const zcu = pt.zcu;
984985 const arena = sema.arena;
985986
986987 if (ty.zigTypeTag(zcu) != .array) {
987988 const val = Value.fromInterned(elems[@intCast(next_idx.*)]);
988989 next_idx.* += 1;
989 return sema.pt.getCoerced(val, ty);
990 return pt.getCoerced(val, ty);
990991 }
991992
992993 const elem_ty = ty.childType(zcu);
......@@ -998,10 +999,7 @@ fn unflattenArray(
998999 // TODO: validate sentinel
9991000 _ = try unflattenArray(sema, elem_ty, elems, next_idx);
10001001 }
1001 return Value.fromInterned(try sema.pt.intern(.{ .aggregate = .{
1002 .ty = ty.toIntern(),
1003 .storage = .{ .elems = buf },
1004 } }));
1002 return pt.aggregateValue(ty, buf);
10051003}
10061004
10071005/// Given a `MutableValue` representing a potentially-nested array, treats `index` as an index into
src/Type.zig+8-24
......@@ -2490,15 +2490,11 @@ pub fn onePossibleValue(starting_type: Type, pt: Zcu.PerThread) !?Value {
24902490
24912491 inline .array_type, .vector_type => |seq_type, seq_tag| {
24922492 const has_sentinel = seq_tag == .array_type and seq_type.sentinel != .none;
2493 if (seq_type.len + @intFromBool(has_sentinel) == 0) return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2494 .ty = ty.toIntern(),
2495 .storage = .{ .elems = &.{} },
2496 } }));
2493 if (seq_type.len + @intFromBool(has_sentinel) == 0) {
2494 return try pt.aggregateValue(ty, &.{});
2495 }
24972496 if (try Type.fromInterned(seq_type.child).onePossibleValue(pt)) |opv| {
2498 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2499 .ty = ty.toIntern(),
2500 .storage = .{ .repeated_elem = opv.toIntern() },
2501 } }));
2497 return try pt.aggregateSplatValue(ty, opv);
25022498 }
25032499 return null;
25042500 },
......@@ -2567,10 +2563,7 @@ pub fn onePossibleValue(starting_type: Type, pt: Zcu.PerThread) !?Value {
25672563
25682564 // In this case the struct has no runtime-known fields and
25692565 // therefore has one possible value.
2570 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2571 .ty = ty.toIntern(),
2572 .storage = .{ .elems = field_vals },
2573 } }));
2566 return try pt.aggregateValue(ty, field_vals);
25742567 },
25752568
25762569 .tuple_type => |tuple| {
......@@ -2582,10 +2575,7 @@ pub fn onePossibleValue(starting_type: Type, pt: Zcu.PerThread) !?Value {
25822575 // TODO: write something like getCoercedInts to avoid needing to dupe
25832576 const duped_values = try zcu.gpa.dupe(InternPool.Index, tuple.values.get(ip));
25842577 defer zcu.gpa.free(duped_values);
2585 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2586 .ty = ty.toIntern(),
2587 .storage = .{ .elems = duped_values },
2588 } }));
2578 return try pt.aggregateValue(ty, duped_values);
25892579 },
25902580
25912581 .union_type => {
......@@ -2957,10 +2947,7 @@ pub fn getParentNamespace(ty: Type, zcu: *Zcu) InternPool.OptionalNamespaceIndex
29572947pub fn minInt(ty: Type, pt: Zcu.PerThread, dest_ty: Type) !Value {
29582948 const zcu = pt.zcu;
29592949 const scalar = try minIntScalar(ty.scalarType(zcu), pt, dest_ty.scalarType(zcu));
2960 return if (ty.zigTypeTag(zcu) == .vector) Value.fromInterned(try pt.intern(.{ .aggregate = .{
2961 .ty = dest_ty.toIntern(),
2962 .storage = .{ .repeated_elem = scalar.toIntern() },
2963 } })) else scalar;
2950 return if (ty.zigTypeTag(zcu) == .vector) pt.aggregateSplatValue(dest_ty, scalar) else scalar;
29642951}
29652952
29662953/// Asserts that the type is an integer.
......@@ -2987,10 +2974,7 @@ pub fn minIntScalar(ty: Type, pt: Zcu.PerThread, dest_ty: Type) !Value {
29872974pub fn maxInt(ty: Type, pt: Zcu.PerThread, dest_ty: Type) !Value {
29882975 const zcu = pt.zcu;
29892976 const scalar = try maxIntScalar(ty.scalarType(zcu), pt, dest_ty.scalarType(zcu));
2990 return if (ty.zigTypeTag(zcu) == .vector) Value.fromInterned(try pt.intern(.{ .aggregate = .{
2991 .ty = dest_ty.toIntern(),
2992 .storage = .{ .repeated_elem = scalar.toIntern() },
2993 } })) else scalar;
2977 return if (ty.zigTypeTag(zcu) == .vector) pt.aggregateSplatValue(dest_ty, scalar) else scalar;
29942978}
29952979
29962980/// The returned Value will have type dest_ty.
src/Value.zig+26-77
......@@ -1586,10 +1586,7 @@ pub fn sqrt(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !
15861586 const elem_val = try val.elemValue(pt, i);
15871587 scalar.* = (try sqrtScalar(elem_val, scalar_ty, pt)).toIntern();
15881588 }
1589 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1590 .ty = float_type.toIntern(),
1591 .storage = .{ .elems = result_data },
1592 } }));
1589 return pt.aggregateValue(float_type, result_data);
15931590 }
15941591 return sqrtScalar(val, float_type, pt);
15951592}
......@@ -1620,10 +1617,7 @@ pub fn sin(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !V
16201617 const elem_val = try val.elemValue(pt, i);
16211618 scalar.* = (try sinScalar(elem_val, scalar_ty, pt)).toIntern();
16221619 }
1623 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1624 .ty = float_type.toIntern(),
1625 .storage = .{ .elems = result_data },
1626 } }));
1620 return pt.aggregateValue(float_type, result_data);
16271621 }
16281622 return sinScalar(val, float_type, pt);
16291623}
......@@ -1654,10 +1648,7 @@ pub fn cos(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !V
16541648 const elem_val = try val.elemValue(pt, i);
16551649 scalar.* = (try cosScalar(elem_val, scalar_ty, pt)).toIntern();
16561650 }
1657 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1658 .ty = float_type.toIntern(),
1659 .storage = .{ .elems = result_data },
1660 } }));
1651 return pt.aggregateValue(float_type, result_data);
16611652 }
16621653 return cosScalar(val, float_type, pt);
16631654}
......@@ -1688,10 +1679,7 @@ pub fn tan(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !V
16881679 const elem_val = try val.elemValue(pt, i);
16891680 scalar.* = (try tanScalar(elem_val, scalar_ty, pt)).toIntern();
16901681 }
1691 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1692 .ty = float_type.toIntern(),
1693 .storage = .{ .elems = result_data },
1694 } }));
1682 return pt.aggregateValue(float_type, result_data);
16951683 }
16961684 return tanScalar(val, float_type, pt);
16971685}
......@@ -1722,10 +1710,7 @@ pub fn exp(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !V
17221710 const elem_val = try val.elemValue(pt, i);
17231711 scalar.* = (try expScalar(elem_val, scalar_ty, pt)).toIntern();
17241712 }
1725 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1726 .ty = float_type.toIntern(),
1727 .storage = .{ .elems = result_data },
1728 } }));
1713 return pt.aggregateValue(float_type, result_data);
17291714 }
17301715 return expScalar(val, float_type, pt);
17311716}
......@@ -1756,10 +1741,7 @@ pub fn exp2(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !
17561741 const elem_val = try val.elemValue(pt, i);
17571742 scalar.* = (try exp2Scalar(elem_val, scalar_ty, pt)).toIntern();
17581743 }
1759 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1760 .ty = float_type.toIntern(),
1761 .storage = .{ .elems = result_data },
1762 } }));
1744 return pt.aggregateValue(float_type, result_data);
17631745 }
17641746 return exp2Scalar(val, float_type, pt);
17651747}
......@@ -1790,10 +1772,7 @@ pub fn log(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !V
17901772 const elem_val = try val.elemValue(pt, i);
17911773 scalar.* = (try logScalar(elem_val, scalar_ty, pt)).toIntern();
17921774 }
1793 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1794 .ty = float_type.toIntern(),
1795 .storage = .{ .elems = result_data },
1796 } }));
1775 return pt.aggregateValue(float_type, result_data);
17971776 }
17981777 return logScalar(val, float_type, pt);
17991778}
......@@ -1824,10 +1803,7 @@ pub fn log2(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !
18241803 const elem_val = try val.elemValue(pt, i);
18251804 scalar.* = (try log2Scalar(elem_val, scalar_ty, pt)).toIntern();
18261805 }
1827 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1828 .ty = float_type.toIntern(),
1829 .storage = .{ .elems = result_data },
1830 } }));
1806 return pt.aggregateValue(float_type, result_data);
18311807 }
18321808 return log2Scalar(val, float_type, pt);
18331809}
......@@ -1858,10 +1834,7 @@ pub fn log10(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread)
18581834 const elem_val = try val.elemValue(pt, i);
18591835 scalar.* = (try log10Scalar(elem_val, scalar_ty, pt)).toIntern();
18601836 }
1861 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1862 .ty = float_type.toIntern(),
1863 .storage = .{ .elems = result_data },
1864 } }));
1837 return pt.aggregateValue(float_type, result_data);
18651838 }
18661839 return log10Scalar(val, float_type, pt);
18671840}
......@@ -1892,10 +1865,7 @@ pub fn abs(val: Value, ty: Type, arena: Allocator, pt: Zcu.PerThread) !Value {
18921865 const elem_val = try val.elemValue(pt, i);
18931866 scalar.* = (try absScalar(elem_val, scalar_ty, pt, arena)).toIntern();
18941867 }
1895 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1896 .ty = ty.toIntern(),
1897 .storage = .{ .elems = result_data },
1898 } }));
1868 return pt.aggregateValue(ty, result_data);
18991869 }
19001870 return absScalar(val, ty, pt, arena);
19011871}
......@@ -1945,10 +1915,7 @@ pub fn floor(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread)
19451915 const elem_val = try val.elemValue(pt, i);
19461916 scalar.* = (try floorScalar(elem_val, scalar_ty, pt)).toIntern();
19471917 }
1948 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1949 .ty = float_type.toIntern(),
1950 .storage = .{ .elems = result_data },
1951 } }));
1918 return pt.aggregateValue(float_type, result_data);
19521919 }
19531920 return floorScalar(val, float_type, pt);
19541921}
......@@ -1979,10 +1946,7 @@ pub fn ceil(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread) !
19791946 const elem_val = try val.elemValue(pt, i);
19801947 scalar.* = (try ceilScalar(elem_val, scalar_ty, pt)).toIntern();
19811948 }
1982 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
1983 .ty = float_type.toIntern(),
1984 .storage = .{ .elems = result_data },
1985 } }));
1949 return pt.aggregateValue(float_type, result_data);
19861950 }
19871951 return ceilScalar(val, float_type, pt);
19881952}
......@@ -2013,10 +1977,7 @@ pub fn round(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread)
20131977 const elem_val = try val.elemValue(pt, i);
20141978 scalar.* = (try roundScalar(elem_val, scalar_ty, pt)).toIntern();
20151979 }
2016 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2017 .ty = float_type.toIntern(),
2018 .storage = .{ .elems = result_data },
2019 } }));
1980 return pt.aggregateValue(float_type, result_data);
20201981 }
20211982 return roundScalar(val, float_type, pt);
20221983}
......@@ -2047,10 +2008,7 @@ pub fn trunc(val: Value, float_type: Type, arena: Allocator, pt: Zcu.PerThread)
20472008 const elem_val = try val.elemValue(pt, i);
20482009 scalar.* = (try truncScalar(elem_val, scalar_ty, pt)).toIntern();
20492010 }
2050 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2051 .ty = float_type.toIntern(),
2052 .storage = .{ .elems = result_data },
2053 } }));
2011 return pt.aggregateValue(float_type, result_data);
20542012 }
20552013 return truncScalar(val, float_type, pt);
20562014}
......@@ -2090,10 +2048,7 @@ pub fn mulAdd(
20902048 const addend_elem = try addend.elemValue(pt, i);
20912049 scalar.* = (try mulAddScalar(scalar_ty, mulend1_elem, mulend2_elem, addend_elem, pt)).toIntern();
20922050 }
2093 return Value.fromInterned(try pt.intern(.{ .aggregate = .{
2094 .ty = float_type.toIntern(),
2095 .storage = .{ .elems = result_data },
2096 } }));
2051 return pt.aggregateValue(float_type, result_data);
20972052 }
20982053 return mulAddScalar(float_type, mulend1, mulend2, addend, pt);
20992054}
......@@ -2978,17 +2933,17 @@ pub fn resolveLazy(
29782933 }
29792934 if (resolved_elems.len > 0) resolved_elems[i] = resolved_elem;
29802935 }
2981 return if (resolved_elems.len == 0) val else Value.fromInterned(try pt.intern(.{ .aggregate = .{
2982 .ty = aggregate.ty,
2983 .storage = .{ .elems = resolved_elems },
2984 } }));
2936 return if (resolved_elems.len == 0)
2937 val
2938 else
2939 pt.aggregateValue(.fromInterned(aggregate.ty), resolved_elems);
29852940 },
29862941 .repeated_elem => |elem| {
2987 const resolved_elem = (try Value.fromInterned(elem).resolveLazy(arena, pt)).toIntern();
2988 return if (resolved_elem == elem) val else Value.fromInterned(try pt.intern(.{ .aggregate = .{
2989 .ty = aggregate.ty,
2990 .storage = .{ .repeated_elem = resolved_elem },
2991 } }));
2942 const resolved_elem = try Value.fromInterned(elem).resolveLazy(arena, pt);
2943 return if (resolved_elem.toIntern() == elem)
2944 val
2945 else
2946 pt.aggregateSplatValue(.fromInterned(aggregate.ty), resolved_elem);
29922947 },
29932948 },
29942949 .un => |un| {
......@@ -3205,10 +3160,7 @@ pub fn uninterpret(val: anytype, ty: Type, pt: Zcu.PerThread) error{ OutOfMemory
32053160 const field_ty = ty.fieldType(field_idx, zcu);
32063161 field_val.* = (try uninterpret(@field(val, field.name), field_ty, pt)).toIntern();
32073162 }
3208 return .fromInterned(try pt.intern(.{ .aggregate = .{
3209 .ty = ty.toIntern(),
3210 .storage = .{ .elems = &field_vals },
3211 } }));
3163 return pt.aggregateValue(ty, &field_vals);
32123164 },
32133165 .by_name => {
32143166 const struct_obj = zcu.typeToStruct(ty) orelse return error.TypeMismatch;
......@@ -3230,10 +3182,7 @@ pub fn uninterpret(val: anytype, ty: Type, pt: Zcu.PerThread) error{ OutOfMemory
32303182 field_val.* = default_init;
32313183 }
32323184 }
3233 return .fromInterned(try pt.intern(.{ .aggregate = .{
3234 .ty = ty.toIntern(),
3235 .storage = .{ .elems = field_vals },
3236 } }));
3185 return pt.aggregateValue(ty, &field_vals);
32373186 },
32383187 },
32393188 };
src/Zcu/PerThread.zig+5-12
......@@ -3327,10 +3327,7 @@ pub fn populateTestFunctions(pt: Zcu.PerThread) Allocator.Error!void {
33273327 .byte_offset = 0,
33283328 } }),
33293329 };
3330 test_fn_val.* = try pt.intern(.{ .aggregate = .{
3331 .ty = test_fn_ty.toIntern(),
3332 .storage = .{ .elems = &test_fn_fields },
3333 } });
3330 test_fn_val.* = (try pt.aggregateValue(test_fn_ty, &test_fn_fields)).toIntern();
33343331 }
33353332
33363333 const array_ty = try pt.arrayType(.{
......@@ -3338,13 +3335,9 @@ pub fn populateTestFunctions(pt: Zcu.PerThread) Allocator.Error!void {
33383335 .child = test_fn_ty.toIntern(),
33393336 .sentinel = .none,
33403337 });
3341 const array_val = try pt.intern(.{ .aggregate = .{
3342 .ty = array_ty.toIntern(),
3343 .storage = .{ .elems = test_fn_vals },
3344 } });
33453338 break :array .{
33463339 .orig_ty = (try pt.singleConstPtrType(array_ty)).toIntern(),
3347 .val = array_val,
3340 .val = (try pt.aggregateValue(array_ty, test_fn_vals)).toIntern(),
33483341 };
33493342 };
33503343
......@@ -3685,15 +3678,15 @@ pub fn aggregateValue(pt: Zcu.PerThread, ty: Type, elems: []const InternPool.Ind
36853678}
36863679
36873680/// Asserts that `ty` is either an array or a vector.
3688pub fn aggregateSplatValue(pt: Zcu.PerThread, ty: Type, repeated: Value) Allocator.Error!Value {
3681pub fn aggregateSplatValue(pt: Zcu.PerThread, ty: Type, repeated_elem: Value) Allocator.Error!Value {
36893682 switch (ty.zigTypeTag(pt.zcu)) {
36903683 .array, .vector => {},
36913684 else => unreachable,
36923685 }
3693 if (repeated.isUndef(pt.zcu)) return pt.undefValue(ty);
3686 if (repeated_elem.isUndef(pt.zcu)) return pt.undefValue(ty);
36943687 return .fromInterned(try pt.intern(.{ .aggregate = .{
36953688 .ty = ty.toIntern(),
3696 .storage = .{ .repeated_elem = repeated.toIntern() },
3689 .storage = .{ .repeated_elem = repeated_elem.toIntern() },
36973690 } }));
36983691}
36993692