fix(ir): reflection builtins on an Any read its runtime tag, not payload [F0.8]

`type_name` / `type_is_unsigned` on an `Any` argument unconditionally read
the Any's payload as a TypeId index. That is correct only when the Any holds
a Type value (`{ .any, tid }`); for an Any holding a runtime *value*
(`av : Any = 6`, tag s64, payload 6) it returned `types[6]` — `type_name(av)`
gave "u8" and `type_is_unsigned(av)` gave true.

Both backends now branch on the Any's runtime type-tag: tag == `.any` → the
box is a Type value, use the payload as the TypeId; otherwise the tag IS the
held value's type. So `type_name(av)` → "s64", `type_is_unsigned(av)` → false,
while `type_name(type_of(x))` still names the held type. The `{}` formatter is
unchanged (it already passed `type_of(val)`, a proper Type value).

- src/ir/interp.zig: shared `Value.reflectTypeId` tag-branching resolver; the
  `type_name` / `type_is_unsigned` interp arms route through it.
- src/backend/llvm/ops.zig: shared `Ops.reflectArgTypeId` emits
  extractvalue-tag / icmp-eq-.any / select for the runtime path; both
  reflection arms route through it. The two backends agree.
- examples/0164-types-reflection-any-tag.sx: regression pinning type_name /
  type_is_unsigned / print on an Any holding a value vs a Type.
- src/ir/interp.test.zig: unit test for `reflectTypeId`.
- 22 .ir snapshots: the new select appears in every std-importing program's
  IR (any_to_string embeds these builtins) — benign, verified structurally
  identical apart from the three new instructions.
- issues/0090, specs.md: documented the Any-tag rule.
This commit is contained in:
agra
2026-06-05 12:09:52 +03:00
parent b053c64149
commit 5f64ee4426
31 changed files with 3379 additions and 3105 deletions

View File

@@ -1250,8 +1250,11 @@ match.arm.38: ; preds = %entry
match.arm.39: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry
%loadN = load { i64, i64 }, ptr %allocaN, align 8
%tiu.tid = extractvalue { i64, i64 } %loadN, 1
%tiu.gep = getelementptr inbounds [89 x i1], ptr @__sx_type_is_unsigned, i64 0, i64 %tiu.tid
%refl.tag = extractvalue { i64, i64 } %loadN, 0
%refl.val = extractvalue { i64, i64 } %loadN, 1
%refl.istype = icmp eq i64 %refl.tag, 13
%refl.tid = select i1 %refl.istype, i64 %refl.val, i64 %refl.tag
%tiu.gep = getelementptr inbounds [89 x i1], ptr @__sx_type_is_unsigned, i64 0, i64 %refl.tid
%tiu.load = load i1, ptr %tiu.gep, align 1
br i1 %tiu.load, label %if.then.53, label %if.else.54
@@ -1371,8 +1374,11 @@ match.arm.50: ; No predecessors!
match.arm.51: ; preds = %entry
%loadN = load { i64, i64 }, ptr %alloca, align 8
%tn.tid = extractvalue { i64, i64 } %loadN, 1
%tn.gep = getelementptr inbounds [89 x { ptr, i64 }], ptr @__sx_type_names, i64 0, i64 %tn.tid
%refl.tag32 = extractvalue { i64, i64 } %loadN, 0
%refl.val33 = extractvalue { i64, i64 } %loadN, 1
%refl.istype34 = icmp eq i64 %refl.tag32, 13
%refl.tid35 = select i1 %refl.istype34, i64 %refl.val33, i64 %refl.tag32
%tn.gep = getelementptr inbounds [89 x { ptr, i64 }], ptr @__sx_type_names, i64 0, i64 %refl.tid35
%tn.load = load { ptr, i64 }, ptr %tn.gep, align 8
store { ptr, i64 } %tn.load, ptr %allocaN, align 8
br label %match.merge.37
@@ -1382,15 +1388,15 @@ match.unr.52: ; preds = %entry
if.then.53: ; preds = %match.arm.39
%loadN = load { i64, i64 }, ptr %alloca, align 8
%ua.raw33 = extractvalue { i64, i64 } %loadN, 1
%callN = call { ptr, i64 } @uint_to_string(ptr %0, i64 %ua.raw33)
%ua.raw37 = extractvalue { i64, i64 } %loadN, 1
%callN = call { ptr, i64 } @uint_to_string(ptr %0, i64 %ua.raw37)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %if.merge.55
if.else.54: ; preds = %match.arm.39
%loadN = load { i64, i64 }, ptr %alloca, align 8
%ua.raw36 = extractvalue { i64, i64 } %loadN, 1
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %ua.raw36)
%ua.raw40 = extractvalue { i64, i64 } %loadN, 1
%callN = call { ptr, i64 } @int_to_string(ptr %0, i64 %ua.raw40)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %if.merge.55
@@ -1398,16 +1404,16 @@ if.merge.55: ; preds = %if.else.54, %if.the
br label %match.merge.37
f32.unbox.81: ; preds = %match.arm.42
%ua.raw38 = extractvalue { i64, i64 } %loadN, 1
%trN = trunc i64 %ua.raw38 to i32
%ua.raw42 = extractvalue { i64, i64 } %loadN, 1
%trN = trunc i64 %ua.raw42 to i32
%iNf = bitcast i32 %trN to float
%fpext = fpext float %iNf to double
store double %fpext, ptr %allocaN, align 8
br label %float.merge.83
f64.unbox.82: ; preds = %match.arm.42
%ua.raw39 = extractvalue { i64, i64 } %loadN, 1
%iNd = bitcast i64 %ua.raw39 to double
%ua.raw43 = extractvalue { i64, i64 } %loadN, 1
%iNd = bitcast i64 %ua.raw43 to double
store double %iNd, ptr %allocaN, align 8
br label %float.merge.83
@@ -1427,122 +1433,122 @@ dispatch.default.95: ; preds = %match.arm.43
br label %dispatch.merge.94
dispatch.case.96: ; preds = %match.arm.43
%ua.raw43 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr44 = inttoptr i64 %ua.raw43 to ptr
%ua.load45 = load { { ptr, i64 }, i32, i32, { ptr, i64 } }, ptr %ua.ptr44, align 8
%callN = call { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %ua.load45)
%ua.raw47 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr48 = inttoptr i64 %ua.raw47 to ptr
%ua.load49 = load { { ptr, i64 }, i32, i32, { ptr, i64 } }, ptr %ua.ptr48, align 8
%callN = call { ptr, i64 } @struct_to_string__Source_Location(ptr %0, { { ptr, i64 }, i32, i32, { ptr, i64 } } %ua.load49)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.97: ; preds = %match.arm.43
%ua.raw47 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr48 = inttoptr i64 %ua.raw47 to ptr
%ua.load49 = load { ptr, ptr, ptr }, ptr %ua.ptr48, align 8
%callN = call { ptr, i64 } @struct_to_string__Allocator(ptr %0, { ptr, ptr, ptr } %ua.load49)
%ua.raw51 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr52 = inttoptr i64 %ua.raw51 to ptr
%ua.load53 = load { ptr, ptr, ptr }, ptr %ua.ptr52, align 8
%callN = call { ptr, i64 } @struct_to_string__Allocator(ptr %0, { ptr, ptr, ptr } %ua.load53)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.98: ; preds = %match.arm.43
%ua.raw51 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr52 = inttoptr i64 %ua.raw51 to ptr
%ua.load53 = load {}, ptr %ua.ptr52, align 1
%callN = call { ptr, i64 } @struct_to_string__CAllocator(ptr %0, {} %ua.load53)
%ua.raw55 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr56 = inttoptr i64 %ua.raw55 to ptr
%ua.load57 = load {}, ptr %ua.ptr56, align 1
%callN = call { ptr, i64 } @struct_to_string__CAllocator(ptr %0, {} %ua.load57)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.99: ; preds = %match.arm.43
%ua.raw55 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr56 = inttoptr i64 %ua.raw55 to ptr
%ua.load57 = load { i64 }, ptr %ua.ptr56, align 8
%callN = call { ptr, i64 } @struct_to_string__GPA(ptr %0, { i64 } %ua.load57)
%ua.raw59 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr60 = inttoptr i64 %ua.raw59 to ptr
%ua.load61 = load { i64 }, ptr %ua.ptr60, align 8
%callN = call { ptr, i64 } @struct_to_string__GPA(ptr %0, { i64 } %ua.load61)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.100: ; preds = %match.arm.43
%ua.raw59 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr60 = inttoptr i64 %ua.raw59 to ptr
%ua.load61 = load { ptr, i64 }, ptr %ua.ptr60, align 8
%callN = call { ptr, i64 } @struct_to_string__ArenaChunk(ptr %0, { ptr, i64 } %ua.load61)
%ua.raw63 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr64 = inttoptr i64 %ua.raw63 to ptr
%ua.load65 = load { ptr, i64 }, ptr %ua.ptr64, align 8
%callN = call { ptr, i64 } @struct_to_string__ArenaChunk(ptr %0, { ptr, i64 } %ua.load65)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.101: ; preds = %match.arm.43
%ua.raw63 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr64 = inttoptr i64 %ua.raw63 to ptr
%ua.load65 = load { ptr, i64, { ptr, ptr, ptr } }, ptr %ua.ptr64, align 8
%callN = call { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %ua.load65)
%ua.raw67 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr68 = inttoptr i64 %ua.raw67 to ptr
%ua.load69 = load { ptr, i64, { ptr, ptr, ptr } }, ptr %ua.ptr68, align 8
%callN = call { ptr, i64 } @struct_to_string__Arena(ptr %0, { ptr, i64, { ptr, ptr, ptr } } %ua.load69)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.102: ; preds = %match.arm.43
%ua.raw67 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr68 = inttoptr i64 %ua.raw67 to ptr
%ua.load69 = load { ptr, i64, i64 }, ptr %ua.ptr68, align 8
%callN = call { ptr, i64 } @struct_to_string__BufAlloc(ptr %0, { ptr, i64, i64 } %ua.load69)
%ua.raw71 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr72 = inttoptr i64 %ua.raw71 to ptr
%ua.load73 = load { ptr, i64, i64 }, ptr %ua.ptr72, align 8
%callN = call { ptr, i64 } @struct_to_string__BufAlloc(ptr %0, { ptr, i64, i64 } %ua.load73)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.103: ; preds = %match.arm.43
%ua.raw71 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr72 = inttoptr i64 %ua.raw71 to ptr
%ua.load73 = load { { ptr, ptr, ptr }, i64, i64, i64 }, ptr %ua.ptr72, align 8
%callN = call { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %ua.load73)
%ua.raw75 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr76 = inttoptr i64 %ua.raw75 to ptr
%ua.load77 = load { { ptr, ptr, ptr }, i64, i64, i64 }, ptr %ua.ptr76, align 8
%callN = call { ptr, i64 } @struct_to_string__TrackingAllocator(ptr %0, { { ptr, ptr, ptr }, i64, i64, i64 } %ua.load77)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.104: ; preds = %match.arm.43
%ua.raw75 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr76 = inttoptr i64 %ua.raw75 to ptr
%ua.load77 = load { { ptr, ptr, ptr }, ptr }, ptr %ua.ptr76, align 8
%callN = call { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %ua.load77)
%ua.raw79 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr80 = inttoptr i64 %ua.raw79 to ptr
%ua.load81 = load { { ptr, ptr, ptr }, ptr }, ptr %ua.ptr80, align 8
%callN = call { ptr, i64 } @struct_to_string__Context(ptr %0, { { ptr, ptr, ptr }, ptr } %ua.load81)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.105: ; preds = %match.arm.43
%ua.raw79 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr80 = inttoptr i64 %ua.raw79 to ptr
%ua.load81 = load { i64 }, ptr %ua.ptr80, align 8
%callN = call { ptr, i64 } @struct_to_string__IntCell(ptr %0, { i64 } %ua.load81)
%ua.raw83 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr84 = inttoptr i64 %ua.raw83 to ptr
%ua.load85 = load { i64 }, ptr %ua.ptr84, align 8
%callN = call { ptr, i64 } @struct_to_string__IntCell(ptr %0, { i64 } %ua.load85)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.106: ; preds = %match.arm.43
%ua.raw83 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr84 = inttoptr i64 %ua.raw83 to ptr
%ua.load85 = load { { ptr, i64 } }, ptr %ua.ptr84, align 8
%callN = call { ptr, i64 } @struct_to_string__StrCell(ptr %0, { { ptr, i64 } } %ua.load85)
%ua.raw87 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr88 = inttoptr i64 %ua.raw87 to ptr
%ua.load89 = load { { ptr, i64 } }, ptr %ua.ptr88, align 8
%callN = call { ptr, i64 } @struct_to_string__StrCell(ptr %0, { { ptr, i64 } } %ua.load89)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.107: ; preds = %match.arm.43
%ua.raw87 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr88 = inttoptr i64 %ua.raw87 to ptr
%ua.load89 = load { ptr, ptr }, ptr %ua.ptr88, align 8
%callN = call { ptr, i64 } @struct_to_string__VL__s64(ptr %0, { ptr, ptr } %ua.load89)
%ua.raw91 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr92 = inttoptr i64 %ua.raw91 to ptr
%ua.load93 = load { ptr, ptr }, ptr %ua.ptr92, align 8
%callN = call { ptr, i64 } @struct_to_string__VL__s64(ptr %0, { ptr, ptr } %ua.load93)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.108: ; preds = %match.arm.43
%ua.raw91 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr92 = inttoptr i64 %ua.raw91 to ptr
%ua.load93 = load { ptr }, ptr %ua.ptr92, align 8
%callN = call { ptr, i64 } @struct_to_string____VL__s64__Vtable(ptr %0, { ptr } %ua.load93)
%ua.raw95 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr96 = inttoptr i64 %ua.raw95 to ptr
%ua.load97 = load { ptr }, ptr %ua.ptr96, align 8
%callN = call { ptr, i64 } @struct_to_string____VL__s64__Vtable(ptr %0, { ptr } %ua.load97)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.109: ; preds = %match.arm.43
%ua.raw95 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr96 = inttoptr i64 %ua.raw95 to ptr
%ua.load97 = load { ptr, ptr }, ptr %ua.ptr96, align 8
%callN = call { ptr, i64 } @struct_to_string__VL__string(ptr %0, { ptr, ptr } %ua.load97)
%ua.raw99 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr100 = inttoptr i64 %ua.raw99 to ptr
%ua.load101 = load { ptr, ptr }, ptr %ua.ptr100, align 8
%callN = call { ptr, i64 } @struct_to_string__VL__string(ptr %0, { ptr, ptr } %ua.load101)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
dispatch.case.110: ; preds = %match.arm.43
%ua.raw99 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr100 = inttoptr i64 %ua.raw99 to ptr
%ua.load101 = load { ptr }, ptr %ua.ptr100, align 8
%callN = call { ptr, i64 } @struct_to_string____VL__string__Vtable(ptr %0, { ptr } %ua.load101)
%ua.raw103 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr104 = inttoptr i64 %ua.raw103 to ptr
%ua.load105 = load { ptr }, ptr %ua.ptr104, align 8
%callN = call { ptr, i64 } @struct_to_string____VL__string__Vtable(ptr %0, { ptr } %ua.load105)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.94
@@ -1556,18 +1562,18 @@ dispatch.default.187: ; preds = %match.arm.47
br label %dispatch.merge.186
dispatch.case.188: ; preds = %match.arm.47
%ua.raw104 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr105 = inttoptr i64 %ua.raw104 to ptr
%ua.load106 = load [4 x i64], ptr %ua.ptr105, align 8
%callN = call { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %ua.load106)
%ua.raw108 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr109 = inttoptr i64 %ua.raw108 to ptr
%ua.load110 = load [4 x i64], ptr %ua.ptr109, align 8
%callN = call { ptr, i64 } @array_to_string__AR_4_s64(ptr %0, [4 x i64] %ua.load110)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.186
dispatch.case.189: ; preds = %match.arm.47
%ua.raw108 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr109 = inttoptr i64 %ua.raw108 to ptr
%ua.load110 = load [1 x { i64, i64 }], ptr %ua.ptr109, align 8
%callN = call { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %ua.load110)
%ua.raw112 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr113 = inttoptr i64 %ua.raw112 to ptr
%ua.load114 = load [1 x { i64, i64 }], ptr %ua.ptr113, align 8
%callN = call { ptr, i64 } @array_to_string__AR_1_Any(ptr %0, [1 x { i64, i64 }] %ua.load114)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.186
@@ -1581,18 +1587,18 @@ dispatch.default.201: ; preds = %match.arm.48
br label %dispatch.merge.200
dispatch.case.202: ; preds = %match.arm.48
%ua.raw113 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr114 = inttoptr i64 %ua.raw113 to ptr
%ua.load115 = load { ptr, i64 }, ptr %ua.ptr114, align 8
%callN = call { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %ua.load115)
%ua.raw117 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr118 = inttoptr i64 %ua.raw117 to ptr
%ua.load119 = load { ptr, i64 }, ptr %ua.ptr118, align 8
%callN = call { ptr, i64 } @slice_to_string__string(ptr %0, { ptr, i64 } %ua.load119)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.200
dispatch.case.203: ; preds = %match.arm.48
%ua.raw117 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr118 = inttoptr i64 %ua.raw117 to ptr
%ua.load119 = load { ptr, i64 }, ptr %ua.ptr118, align 8
%callN = call { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %ua.load119)
%ua.raw121 = extractvalue { i64, i64 } %loadN, 1
%ua.ptr122 = inttoptr i64 %ua.raw121 to ptr
%ua.load123 = load { ptr, i64 }, ptr %ua.ptr122, align 8
%callN = call { ptr, i64 } @slice_to_string__Any(ptr %0, { ptr, i64 } %ua.load123)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.200
@@ -1606,177 +1612,177 @@ dispatch.default.215: ; preds = %match.arm.49
br label %dispatch.merge.214
dispatch.case.216: ; preds = %match.arm.49
%ua.raw122 = extractvalue { i64, i64 } %loadN, 1
%iNp = inttoptr i64 %ua.raw122 to ptr
%ua.raw126 = extractvalue { i64, i64 } %loadN, 1
%iNp = inttoptr i64 %ua.raw126 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_void(ptr %0, ptr %iNp)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.217: ; preds = %match.arm.49
%ua.raw124 = extractvalue { i64, i64 } %loadN, 1
%iNp125 = inttoptr i64 %ua.raw124 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_CAllocator(ptr %0, ptr %iNp125)
%ua.raw128 = extractvalue { i64, i64 } %loadN, 1
%iNp129 = inttoptr i64 %ua.raw128 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_CAllocator(ptr %0, ptr %iNp129)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.218: ; preds = %match.arm.49
%ua.raw127 = extractvalue { i64, i64 } %loadN, 1
%iNp128 = inttoptr i64 %ua.raw127 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_GPA(ptr %0, ptr %iNp128)
%ua.raw131 = extractvalue { i64, i64 } %loadN, 1
%iNp132 = inttoptr i64 %ua.raw131 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_GPA(ptr %0, ptr %iNp132)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.219: ; preds = %match.arm.49
%ua.raw130 = extractvalue { i64, i64 } %loadN, 1
%iNp131 = inttoptr i64 %ua.raw130 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ArenaChunk(ptr %0, ptr %iNp131)
%ua.raw134 = extractvalue { i64, i64 } %loadN, 1
%iNp135 = inttoptr i64 %ua.raw134 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ArenaChunk(ptr %0, ptr %iNp135)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.220: ; preds = %match.arm.49
%ua.raw133 = extractvalue { i64, i64 } %loadN, 1
%iNp134 = inttoptr i64 %ua.raw133 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_Arena(ptr %0, ptr %iNp134)
%ua.raw137 = extractvalue { i64, i64 } %loadN, 1
%iNp138 = inttoptr i64 %ua.raw137 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_Arena(ptr %0, ptr %iNp138)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.221: ; preds = %match.arm.49
%ua.raw136 = extractvalue { i64, i64 } %loadN, 1
%iNp137 = inttoptr i64 %ua.raw136 to ptr
%callN = call { ptr, i64 } @pointer_to_string__mptr_u8(ptr %0, ptr %iNp137)
%ua.raw140 = extractvalue { i64, i64 } %loadN, 1
%iNp141 = inttoptr i64 %ua.raw140 to ptr
%callN = call { ptr, i64 } @pointer_to_string__mptr_u8(ptr %0, ptr %iNp141)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.222: ; preds = %match.arm.49
%ua.raw139 = extractvalue { i64, i64 } %loadN, 1
%iNp140 = inttoptr i64 %ua.raw139 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_BufAlloc(ptr %0, ptr %iNp140)
%ua.raw143 = extractvalue { i64, i64 } %loadN, 1
%iNp144 = inttoptr i64 %ua.raw143 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_BufAlloc(ptr %0, ptr %iNp144)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.223: ; preds = %match.arm.49
%ua.raw142 = extractvalue { i64, i64 } %loadN, 1
%iNp143 = inttoptr i64 %ua.raw142 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_TrackingAllocator(ptr %0, ptr %iNp143)
%ua.raw146 = extractvalue { i64, i64 } %loadN, 1
%iNp147 = inttoptr i64 %ua.raw146 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_TrackingAllocator(ptr %0, ptr %iNp147)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.224: ; preds = %match.arm.49
%ua.raw145 = extractvalue { i64, i64 } %loadN, 1
%iNp146 = inttoptr i64 %ua.raw145 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_IntCell(ptr %0, ptr %iNp146)
%ua.raw149 = extractvalue { i64, i64 } %loadN, 1
%iNp150 = inttoptr i64 %ua.raw149 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_IntCell(ptr %0, ptr %iNp150)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.225: ; preds = %match.arm.49
%ua.raw148 = extractvalue { i64, i64 } %loadN, 1
%iNp149 = inttoptr i64 %ua.raw148 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_StrCell(ptr %0, ptr %iNp149)
%ua.raw152 = extractvalue { i64, i64 } %loadN, 1
%iNp153 = inttoptr i64 %ua.raw152 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_StrCell(ptr %0, ptr %iNp153)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.226: ; preds = %match.arm.49
%ua.raw151 = extractvalue { i64, i64 } %loadN, 1
%iNp152 = inttoptr i64 %ua.raw151 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_CAllocator(ptr %0, ptr %iNp152)
%ua.raw155 = extractvalue { i64, i64 } %loadN, 1
%iNp156 = inttoptr i64 %ua.raw155 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_CAllocator(ptr %0, ptr %iNp156)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.227: ; preds = %match.arm.49
%ua.raw154 = extractvalue { i64, i64 } %loadN, 1
%iNp155 = inttoptr i64 %ua.raw154 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_s64(ptr %0, ptr %iNp155)
%ua.raw158 = extractvalue { i64, i64 } %loadN, 1
%iNp159 = inttoptr i64 %ua.raw158 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_s64(ptr %0, ptr %iNp159)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.228: ; preds = %match.arm.49
%ua.raw157 = extractvalue { i64, i64 } %loadN, 1
%iNp158 = inttoptr i64 %ua.raw157 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_void(ptr %0, ptr %iNp158)
%ua.raw161 = extractvalue { i64, i64 } %loadN, 1
%iNp162 = inttoptr i64 %ua.raw161 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_void(ptr %0, ptr %iNp162)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.229: ; preds = %match.arm.49
%ua.raw160 = extractvalue { i64, i64 } %loadN, 1
%iNp161 = inttoptr i64 %ua.raw160 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_VL__s64(ptr %0, ptr %iNp161)
%ua.raw164 = extractvalue { i64, i64 } %loadN, 1
%iNp165 = inttoptr i64 %ua.raw164 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_VL__s64(ptr %0, ptr %iNp165)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.230: ; preds = %match.arm.49
%ua.raw163 = extractvalue { i64, i64 } %loadN, 1
%iNp164 = inttoptr i64 %ua.raw163 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_IntCell(ptr %0, ptr %iNp164)
%ua.raw167 = extractvalue { i64, i64 } %loadN, 1
%iNp168 = inttoptr i64 %ua.raw167 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_IntCell(ptr %0, ptr %iNp168)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.231: ; preds = %match.arm.49
%ua.raw166 = extractvalue { i64, i64 } %loadN, 1
%iNp167 = inttoptr i64 %ua.raw166 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr___VL__s64__Vtable(ptr %0, ptr %iNp167)
%ua.raw170 = extractvalue { i64, i64 } %loadN, 1
%iNp171 = inttoptr i64 %ua.raw170 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr___VL__s64__Vtable(ptr %0, ptr %iNp171)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.232: ; preds = %match.arm.49
%ua.raw169 = extractvalue { i64, i64 } %loadN, 1
%iNp170 = inttoptr i64 %ua.raw169 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_string(ptr %0, ptr %iNp170)
%ua.raw173 = extractvalue { i64, i64 } %loadN, 1
%iNp174 = inttoptr i64 %ua.raw173 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_string(ptr %0, ptr %iNp174)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.233: ; preds = %match.arm.49
%ua.raw172 = extractvalue { i64, i64 } %loadN, 1
%iNp173 = inttoptr i64 %ua.raw172 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_Any(ptr %0, ptr %iNp173)
%ua.raw176 = extractvalue { i64, i64 } %loadN, 1
%iNp177 = inttoptr i64 %ua.raw176 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_Any(ptr %0, ptr %iNp177)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.234: ; preds = %match.arm.49
%ua.raw175 = extractvalue { i64, i64 } %loadN, 1
%iNp176 = inttoptr i64 %ua.raw175 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_AR_1_Any(ptr %0, ptr %iNp176)
%ua.raw179 = extractvalue { i64, i64 } %loadN, 1
%iNp180 = inttoptr i64 %ua.raw179 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_AR_1_Any(ptr %0, ptr %iNp180)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.235: ; preds = %match.arm.49
%ua.raw178 = extractvalue { i64, i64 } %loadN, 1
%iNp179 = inttoptr i64 %ua.raw178 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_SL_Any(ptr %0, ptr %iNp179)
%ua.raw182 = extractvalue { i64, i64 } %loadN, 1
%iNp183 = inttoptr i64 %ua.raw182 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_SL_Any(ptr %0, ptr %iNp183)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.236: ; preds = %match.arm.49
%ua.raw181 = extractvalue { i64, i64 } %loadN, 1
%iNp182 = inttoptr i64 %ua.raw181 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_u8(ptr %0, ptr %iNp182)
%ua.raw185 = extractvalue { i64, i64 } %loadN, 1
%iNp186 = inttoptr i64 %ua.raw185 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_u8(ptr %0, ptr %iNp186)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.237: ; preds = %match.arm.49
%ua.raw184 = extractvalue { i64, i64 } %loadN, 1
%iNp185 = inttoptr i64 %ua.raw184 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_bool(ptr %0, ptr %iNp185)
%ua.raw188 = extractvalue { i64, i64 } %loadN, 1
%iNp189 = inttoptr i64 %ua.raw188 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_bool(ptr %0, ptr %iNp189)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.238: ; preds = %match.arm.49
%ua.raw187 = extractvalue { i64, i64 } %loadN, 1
%iNp188 = inttoptr i64 %ua.raw187 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_VL__string(ptr %0, ptr %iNp188)
%ua.raw191 = extractvalue { i64, i64 } %loadN, 1
%iNp192 = inttoptr i64 %ua.raw191 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_VL__string(ptr %0, ptr %iNp192)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.239: ; preds = %match.arm.49
%ua.raw190 = extractvalue { i64, i64 } %loadN, 1
%iNp191 = inttoptr i64 %ua.raw190 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_StrCell(ptr %0, ptr %iNp191)
%ua.raw194 = extractvalue { i64, i64 } %loadN, 1
%iNp195 = inttoptr i64 %ua.raw194 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_StrCell(ptr %0, ptr %iNp195)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
dispatch.case.240: ; preds = %match.arm.49
%ua.raw193 = extractvalue { i64, i64 } %loadN, 1
%iNp194 = inttoptr i64 %ua.raw193 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr___VL__string__Vtable(ptr %0, ptr %iNp194)
%ua.raw197 = extractvalue { i64, i64 } %loadN, 1
%iNp198 = inttoptr i64 %ua.raw197 to ptr
%callN = call { ptr, i64 } @pointer_to_string__ptr___VL__string__Vtable(ptr %0, ptr %iNp198)
store { ptr, i64 } %callN, ptr %allocaN, align 8
br label %dispatch.merge.214
}