From e388687f1af008cca06e91a84c205d4e82667305 Mon Sep 17 00:00:00 2001 From: agra Date: Tue, 19 May 2026 18:50:26 +0300 Subject: [PATCH] ffi 1.8b: sret transform for #objc_call(>16 B non-HFA struct) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 104/104 regression tests pass. The Triple round-trip (triple_imp writes {11, 22, 33} on the IMP side → #objc_call(Triple) reads them back) is the test of record. emit_llvm.zig changes: 1. `objc_msg_send` arm — when `needsByval(ret_ty)` (same predicate the plain-foreign-call path uses), apply the sret transform: - ret type collapses to void - prepend a `ptr` param at index 0 (call site provides an alloca slot) - mirror `sret()` on the call site so the AArch64 x8 / SysV-AMD64 hidden-ptr ABI lowers correctly - load the result from the slot post-call The IR shape now matches clang exactly: call void @objc_msgSend(ptr sret({...}) %slot, ptr %recv, ptr %sel) 2. `.ret` arm — the body-side counterpart for sx fns whose declared return type is sret-shaped (sx-defined IMPs registered via `class_addMethod` produce these). When the current function's `needsByval(func.ret)` predicate holds, store the IR ret value through the prepended sret slot (param 0) and emit `ret void`. Previously the unconditional coerceArg path turned the struct value into `undef` and emitted `ret void undef` — illegal LLVM. Test mechanics: registers `SxTripleProbe : NSObject` at runtime via `objc_allocateClassPair` + `class_addMethod`, IMP returns Triple{11, 22, 33}. `#objc_call(Triple)(instance, "tripleValue")` gets them back, round-trip pinned in the .txt snapshot and the IR-shape snapshot. --- examples/ffi-objc-call-06-sret-return.sx | 55 +- src/ir/emit_llvm.zig | 68 +- .../expected/ffi-objc-call-06-sret-return.ir | 1285 ++++++++++------- .../expected/ffi-objc-call-06-sret-return.txt | 3 +- 4 files changed, 860 insertions(+), 551 deletions(-) diff --git a/examples/ffi-objc-call-06-sret-return.sx b/examples/ffi-objc-call-06-sret-return.sx index 85ea444..04b5ec4 100644 --- a/examples/ffi-objc-call-06-sret-return.sx +++ b/examples/ffi-objc-call-06-sret-return.sx @@ -1,37 +1,48 @@ // Phase 1 step 1.8 (PLAN-FFI.md): >16 B non-HFA struct returns // through `#objc_call`. AAPCS64 routes these through the indirect- // return convention: caller allocates the result slot, passes its -// pointer as a hidden `x8` arg with the `sret()` attribute, -// callee writes through it and returns void. +// pointer in x8 with the `sret()` attribute, callee writes +// through it and returns void. // -// 1.6's `objc_msg_send` lowering hands the IR struct type straight -// to LLVMBuildCall2 — works for ≤16 B aggregates and HFAs of any -// size (since those stay register-resident) but breaks >16 B int -// aggregates: LLVM accepts the signature but the AArch64 backend -// expects the result in x0/x1, the runtime stub doesn't populate -// those for sret-shaped returns, and the upper fields come back -// as garbage. -// -// 1.8a (this commit): xfail. Snapshot shows garbage in the third -// field — pins the broken behavior. -// 1.8b (next commit): emit_llvm.zig applies the sret transform -// (ret type collapses to void, prepend ptr sret param, alloca -// slot at call site, load result post-call) for non-HFA >16 B -// returns. Snapshot flips to all-zeros (Obj-C runtime contract). +// Register a runtime-built Obj-C class with a method that returns +// a fixed `Triple`. The IMP is a plain sx fn (callconv .c) — its +// sret-shaped lowering already works (Phase 0.3 fix for plain +// `#foreign` returns). The `#objc_call` dispatch side now produces +// the matching call shape: `call void @objc_msgSend(ptr sret %slot, +// ...)` + load. The two halves must agree on the ABI for the +// round-trip to return the right bytes. #import "modules/std.sx"; #import "modules/compiler.sx"; +#import "modules/std/objc.sx"; -// 24 B non-HFA integer aggregate. Distinct from any HFA path — -// no all-float / all-double check fires. Triple :: struct { a: s64; b: s64; c: s64; } +// IMP for the runtime-installed method. Obj-C convention: implicit +// (self, _cmd) prefix, then declared args. Returns the value bytes. +triple_imp :: (self: *void, _cmd: *void) -> Triple callconv(.c) { + Triple.{ a = 11, b = 22, c = 33 }; +} + main :: () -> s32 { inline if OS == .macos { - t := #objc_call(Triple)(null, "tripleValue"); - // Per the [nil structReturn] = 0 contract, all three fields - // should be 0 after 1.8b lands. Today: a/b correct, c is - // whatever the callee-saves left in the high register. + // Build the class: + // @interface SxTripleProbe : NSObject + // - (Triple)tripleValue; + // @end + ns_object := objc_getClass("NSObject".ptr); + my_cls := objc_allocateClassPair(ns_object, "SxTripleProbe".ptr, 0); + sel := sel_registerName("tripleValue".ptr); + // Type encoding: {Triple=qqq}@: → returns 24 B struct of 3 s64, + // implicit (self: id, _cmd: SEL). + ok := class_addMethod(my_cls, sel, xx triple_imp, "{Triple=qqq}@:".ptr); + print("addMethod = {}\n", ok); + objc_registerClassPair(my_cls); + + // Call through #objc_call — sret transform applies because + // Triple is 24 B non-HFA. + instance := class_createInstance(my_cls, 0); + t := #objc_call(Triple)(instance, "tripleValue"); print("triple = ({}, {}, {})\n", t.a, t.b, t.c); } inline if OS != .macos { diff --git a/src/ir/emit_llvm.zig b/src/ir/emit_llvm.zig index 205d9e7..34e4ad0 100644 --- a/src/ir/emit_llvm.zig +++ b/src/ir/emit_llvm.zig @@ -1041,25 +1041,36 @@ pub const LLVMEmitter = struct { // ── Calls ───────────────────────────────────────────── .objc_msg_send => |msg| { const msg_send = self.getObjcMsgSendValue(); - // Per-call-site LLVM function type. The Obj-C ABI uses - // the C calling convention: recv + sel in the first - // two int registers, additional args follow the C - // rules for their types. We hand the precise type to - // LLVMBuildCall2 — opaque pointers make the function - // value type-agnostic. - const ret_ty = self.toLLVMType(instruction.ty); - const total_params: usize = 2 + msg.args.len; + // Detect the sret case: >16 B non-HFA struct return. + // Same predicate as the plain-foreign-call path so the + // two arms stay in lockstep. + const raw_ret_ty = self.toLLVMType(instruction.ty); + const uses_sret = self.needsByval(instruction.ty, raw_ret_ty); + const ret_ty = if (uses_sret) self.cached_void else raw_ret_ty; + + // Slot layout: + // uses_sret = false → [recv, sel, args...] + // uses_sret = true → [sret_slot, recv, sel, args...] + const sret_off: usize = if (uses_sret) 1 else 0; + const total_params: usize = 2 + msg.args.len + sret_off; const param_types = self.alloc.alloc(c.LLVMTypeRef, total_params) catch unreachable; defer self.alloc.free(param_types); const call_args = self.alloc.alloc(c.LLVMValueRef, total_params) catch unreachable; defer self.alloc.free(call_args); + var sret_slot: c.LLVMValueRef = null; + if (uses_sret) { + sret_slot = c.LLVMBuildAlloca(self.builder, raw_ret_ty, "objc.sret"); + param_types[0] = self.cached_ptr; + call_args[0] = sret_slot; + } + // recv (typed *void from the IR) - param_types[0] = self.cached_ptr; - call_args[0] = self.coerceArg(self.resolveRef(msg.recv), self.cached_ptr); + param_types[sret_off] = self.cached_ptr; + call_args[sret_off] = self.coerceArg(self.resolveRef(msg.recv), self.cached_ptr); // sel (loaded SEL — opaque ptr) - param_types[1] = self.cached_ptr; - call_args[1] = self.coerceArg(self.resolveRef(msg.sel), self.cached_ptr); + param_types[sret_off + 1] = self.cached_ptr; + call_args[sret_off + 1] = self.coerceArg(self.resolveRef(msg.sel), self.cached_ptr); // additional args take their IR types, with ABI // coercion applied so structs / strings decay the // same way they do for any C foreign call. @@ -1067,13 +1078,23 @@ pub const LLVMEmitter = struct { const raw_ty = self.getRefIRType(arg_ref) orelse .void; const raw_llvm = self.toLLVMType(raw_ty); const coerced_ty = self.abiCoerceParamType(raw_ty, raw_llvm); - param_types[i + 2] = coerced_ty; - call_args[i + 2] = self.coerceArg(self.resolveRef(arg_ref), coerced_ty); + param_types[i + 2 + sret_off] = coerced_ty; + call_args[i + 2 + sret_off] = self.coerceArg(self.resolveRef(arg_ref), coerced_ty); } const fn_ty = c.LLVMFunctionType(ret_ty, param_types.ptr, @intCast(total_params), 0); - const call_label: [*:0]const u8 = if (instruction.ty == .void) "" else "objc.msg"; - const result = c.LLVMBuildCall2(self.builder, fn_ty, msg_send, call_args.ptr, @intCast(total_params), call_label); + const call_label: [*:0]const u8 = if (instruction.ty == .void or uses_sret) "" else "objc.msg"; + var result = c.LLVMBuildCall2(self.builder, fn_ty, msg_send, call_args.ptr, @intCast(total_params), call_label); + if (uses_sret) { + // Tag the call's arg 0 (sret slot) with the sret + // attribute so the AArch64 / SysV backends route + // through the x8 / hidden-pointer convention. + const sret_kind = c.LLVMGetEnumAttributeKindForName("sret", 4); + const sret_attr = c.LLVMCreateTypeAttribute(self.context, sret_kind, raw_ret_ty); + const param1_idx: c.LLVMAttributeIndex = @bitCast(@as(i32, 1)); + c.LLVMAddCallSiteAttribute(result, param1_idx, sret_attr); + result = c.LLVMBuildLoad2(self.builder, raw_ret_ty, sret_slot, "objc.sret.load"); + } // Always mapRef — the IR Ref counter for this // instruction advances regardless of return type, // so skipping it would misalign every subsequent @@ -1254,6 +1275,21 @@ pub const LLVMEmitter = struct { // ── Terminators ──────────────────────────────────────── .ret => |un| { var val = self.resolveRef(un.operand); + // sret-shaped function: declared return-type-in-IR is + // the struct, but the LLVM signature is void with a + // prepended ptr sret param. Store the value through + // the sret slot and emit ret void. + const func = &self.ir_mod.functions.items[self.current_func_idx]; + const needs_c_abi = func.is_extern or func.call_conv == .c; + const raw_ret = self.toLLVMType(func.ret); + if (needs_c_abi and self.needsByval(func.ret, raw_ret)) { + const llvm_func2 = c.LLVMGetBasicBlockParent(c.LLVMGetInsertBlock(self.builder)); + const sret_ptr = c.LLVMGetParam(llvm_func2, 0); + _ = c.LLVMBuildStore(self.builder, val, sret_ptr); + _ = c.LLVMBuildRetVoid(self.builder); + self.advanceRefCounter(); + return; + } // Coerce return value to match the function's LLVM return type const llvm_func = c.LLVMGetBasicBlockParent(c.LLVMGetInsertBlock(self.builder)); const fn_ty = c.LLVMGlobalGetValueType(llvm_func); diff --git a/tests/expected/ffi-objc-call-06-sret-return.ir b/tests/expected/ffi-objc-call-06-sret-return.ir index 0d8c34a..7ab9a67 100644 --- a/tests/expected/ffi-objc-call-06-sret-return.ir +++ b/tests/expected/ffi-objc-call-06-sret-return.ir @@ -15,144 +15,159 @@ @str.8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @str.9 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @str.10 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@str.11 = private unnamed_addr constant [23 x i8] c"triple = ({}, {}, {})\0A\00", align 1 -@str.12 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@str.13 = private unnamed_addr constant [10 x i8] c"Allocator\00", align 1 -@str.14 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.15 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.16 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@str.11 = private unnamed_addr constant [9 x i8] c"NSObject\00", align 1 +@str.12 = private unnamed_addr constant [14 x i8] c"SxTripleProbe\00", align 1 +@str.13 = private unnamed_addr constant [12 x i8] c"tripleValue\00", align 1 +@str.14 = private unnamed_addr constant [15 x i8] c"{Triple=qqq}@:\00", align 1 +@str.15 = private unnamed_addr constant [16 x i8] c"addMethod = {}\0A\00", align 1 +@str.16 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@str.17 = private unnamed_addr constant [23 x i8] c"triple = ({}, {}, {})\0A\00", align 1 +@str.18 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@str.19 = private unnamed_addr constant [10 x i8] c"Allocator\00", align 1 +@str.20 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.21 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.22 = private unnamed_addr constant [3 x i8] c", \00", align 1 @fld.str = private constant [4 x i8] c"ctx\00" -@fld.str.17 = private constant [6 x i8] c"alloc\00" -@fld.str.18 = private constant [8 x i8] c"dealloc\00" -@field_names = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str, i64 3 }, { ptr, i64 } { ptr @fld.str.17, i64 5 }, { ptr, i64 } { ptr @fld.str.18, i64 7 }] -@str.19 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.20 = private unnamed_addr constant [4 x i8] c"GPA\00", align 1 -@str.21 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.22 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.23 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@fld.str.24 = private constant [12 x i8] c"alloc_count\00" -@field_names.25 = private constant [1 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.24, i64 11 }] -@str.26 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.27 = private unnamed_addr constant [11 x i8] c"ArenaChunk\00", align 1 -@str.28 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.29 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.30 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@fld.str.31 = private constant [5 x i8] c"next\00" -@fld.str.32 = private constant [4 x i8] c"cap\00" -@field_names.33 = private constant [2 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.31, i64 4 }, { ptr, i64 } { ptr @fld.str.32, i64 3 }] -@str.34 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.35 = private unnamed_addr constant [6 x i8] c"Arena\00", align 1 -@str.36 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.37 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.38 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@fld.str.39 = private constant [6 x i8] c"first\00" -@fld.str.40 = private constant [10 x i8] c"end_index\00" -@fld.str.41 = private constant [7 x i8] c"parent\00" -@field_names.42 = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.39, i64 5 }, { ptr, i64 } { ptr @fld.str.40, i64 9 }, { ptr, i64 } { ptr @fld.str.41, i64 6 }] -@str.43 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.44 = private unnamed_addr constant [9 x i8] c"BufAlloc\00", align 1 -@str.45 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.46 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.47 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@fld.str.48 = private constant [4 x i8] c"buf\00" -@fld.str.49 = private constant [4 x i8] c"len\00" -@fld.str.50 = private constant [4 x i8] c"pos\00" -@field_names.51 = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.48, i64 3 }, { ptr, i64 } { ptr @fld.str.49, i64 3 }, { ptr, i64 } { ptr @fld.str.50, i64 3 }] -@str.52 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.53 = private unnamed_addr constant [8 x i8] c"Context\00", align 1 -@str.54 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.55 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.56 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@fld.str.57 = private constant [10 x i8] c"allocator\00" -@fld.str.58 = private constant [5 x i8] c"data\00" -@field_names.59 = private constant [2 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.57, i64 9 }, { ptr, i64 } { ptr @fld.str.58, i64 4 }] -@str.60 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.61 = private unnamed_addr constant [13 x i8] c"BuildOptions\00", align 1 -@str.62 = private unnamed_addr constant [2 x i8] c"{\00", align 1 -@str.63 = private unnamed_addr constant [2 x i8] c"}\00", align 1 -@str.64 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@field_names.65 = private constant [0 x { ptr, i64 }] zeroinitializer +@fld.str.23 = private constant [6 x i8] c"alloc\00" +@fld.str.24 = private constant [8 x i8] c"dealloc\00" +@field_names = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str, i64 3 }, { ptr, i64 } { ptr @fld.str.23, i64 5 }, { ptr, i64 } { ptr @fld.str.24, i64 7 }] +@str.25 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.26 = private unnamed_addr constant [4 x i8] c"GPA\00", align 1 +@str.27 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.28 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.29 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@fld.str.30 = private constant [12 x i8] c"alloc_count\00" +@field_names.31 = private constant [1 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.30, i64 11 }] +@str.32 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.33 = private unnamed_addr constant [11 x i8] c"ArenaChunk\00", align 1 +@str.34 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.35 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.36 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@fld.str.37 = private constant [5 x i8] c"next\00" +@fld.str.38 = private constant [4 x i8] c"cap\00" +@field_names.39 = private constant [2 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.37, i64 4 }, { ptr, i64 } { ptr @fld.str.38, i64 3 }] +@str.40 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.41 = private unnamed_addr constant [6 x i8] c"Arena\00", align 1 +@str.42 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.43 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.44 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@fld.str.45 = private constant [6 x i8] c"first\00" +@fld.str.46 = private constant [10 x i8] c"end_index\00" +@fld.str.47 = private constant [7 x i8] c"parent\00" +@field_names.48 = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.45, i64 5 }, { ptr, i64 } { ptr @fld.str.46, i64 9 }, { ptr, i64 } { ptr @fld.str.47, i64 6 }] +@str.49 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.50 = private unnamed_addr constant [9 x i8] c"BufAlloc\00", align 1 +@str.51 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.52 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.53 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@fld.str.54 = private constant [4 x i8] c"buf\00" +@fld.str.55 = private constant [4 x i8] c"len\00" +@fld.str.56 = private constant [4 x i8] c"pos\00" +@field_names.57 = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.54, i64 3 }, { ptr, i64 } { ptr @fld.str.55, i64 3 }, { ptr, i64 } { ptr @fld.str.56, i64 3 }] +@str.58 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.59 = private unnamed_addr constant [8 x i8] c"Context\00", align 1 +@str.60 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.61 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.62 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@fld.str.63 = private constant [10 x i8] c"allocator\00" +@fld.str.64 = private constant [5 x i8] c"data\00" +@field_names.65 = private constant [2 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.63, i64 9 }, { ptr, i64 } { ptr @fld.str.64, i64 4 }] @str.66 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.67 = private unnamed_addr constant [7 x i8] c"Triple\00", align 1 +@str.67 = private unnamed_addr constant [13 x i8] c"BuildOptions\00", align 1 @str.68 = private unnamed_addr constant [2 x i8] c"{\00", align 1 @str.69 = private unnamed_addr constant [2 x i8] c"}\00", align 1 @str.70 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@fld.str.71 = private constant [2 x i8] c"a\00" -@fld.str.72 = private constant [2 x i8] c"b\00" -@fld.str.73 = private constant [2 x i8] c"c\00" -@field_names.74 = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.71, i64 1 }, { ptr, i64 } { ptr @fld.str.72, i64 1 }, { ptr, i64 } { ptr @fld.str.73, i64 1 }] -@str.75 = private unnamed_addr constant [3 x i8] c": \00", align 1 -@str.76 = private unnamed_addr constant [2 x i8] c".\00", align 1 -@fld.str.77 = private constant [6 x i8] c"macos\00" -@fld.str.78 = private constant [6 x i8] c"linux\00" -@fld.str.79 = private constant [8 x i8] c"windows\00" -@fld.str.80 = private constant [5 x i8] c"wasm\00" -@fld.str.81 = private constant [4 x i8] c"ios\00" -@fld.str.82 = private constant [8 x i8] c"android\00" -@fld.str.83 = private constant [8 x i8] c"unknown\00" -@field_names.84 = private constant [7 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.77, i64 5 }, { ptr, i64 } { ptr @fld.str.78, i64 5 }, { ptr, i64 } { ptr @fld.str.79, i64 7 }, { ptr, i64 } { ptr @fld.str.80, i64 4 }, { ptr, i64 } { ptr @fld.str.81, i64 3 }, { ptr, i64 } { ptr @fld.str.82, i64 7 }, { ptr, i64 } { ptr @fld.str.83, i64 7 }] -@str.85 = private unnamed_addr constant [2 x i8] c"(\00", align 1 -@str.86 = private unnamed_addr constant [2 x i8] c")\00", align 1 -@str.87 = private unnamed_addr constant [2 x i8] c".\00", align 1 -@fld.str.88 = private constant [8 x i8] c"aarch64\00" -@fld.str.89 = private constant [7 x i8] c"x86_64\00" -@fld.str.90 = private constant [7 x i8] c"wasm32\00" -@fld.str.91 = private constant [7 x i8] c"wasm64\00" -@fld.str.92 = private constant [8 x i8] c"unknown\00" -@field_names.93 = private constant [5 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.88, i64 7 }, { ptr, i64 } { ptr @fld.str.89, i64 6 }, { ptr, i64 } { ptr @fld.str.90, i64 6 }, { ptr, i64 } { ptr @fld.str.91, i64 6 }, { ptr, i64 } { ptr @fld.str.92, i64 7 }] -@str.94 = private unnamed_addr constant [2 x i8] c"(\00", align 1 -@str.95 = private unnamed_addr constant [2 x i8] c")\00", align 1 -@str.96 = private unnamed_addr constant [2 x i8] c"[\00", align 1 -@str.97 = private unnamed_addr constant [2 x i8] c"]\00", align 1 -@str.98 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@str.99 = private unnamed_addr constant [2 x i8] c"[\00", align 1 -@str.100 = private unnamed_addr constant [2 x i8] c"]\00", align 1 -@str.101 = private unnamed_addr constant [3 x i8] c", \00", align 1 -@str.102 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.103 = private unnamed_addr constant [6 x i8] c"*void\00", align 1 -@str.104 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 -@str.105 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.106 = private unnamed_addr constant [5 x i8] c"*GPA\00", align 1 -@str.107 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 -@str.108 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.109 = private unnamed_addr constant [12 x i8] c"*ArenaChunk\00", align 1 -@str.110 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 +@field_names.71 = private constant [0 x { ptr, i64 }] zeroinitializer +@str.72 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.73 = private unnamed_addr constant [7 x i8] c"Triple\00", align 1 +@str.74 = private unnamed_addr constant [2 x i8] c"{\00", align 1 +@str.75 = private unnamed_addr constant [2 x i8] c"}\00", align 1 +@str.76 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@fld.str.77 = private constant [2 x i8] c"a\00" +@fld.str.78 = private constant [2 x i8] c"b\00" +@fld.str.79 = private constant [2 x i8] c"c\00" +@field_names.80 = private constant [3 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.77, i64 1 }, { ptr, i64 } { ptr @fld.str.78, i64 1 }, { ptr, i64 } { ptr @fld.str.79, i64 1 }] +@str.81 = private unnamed_addr constant [3 x i8] c": \00", align 1 +@str.82 = private unnamed_addr constant [2 x i8] c".\00", align 1 +@fld.str.83 = private constant [6 x i8] c"macos\00" +@fld.str.84 = private constant [6 x i8] c"linux\00" +@fld.str.85 = private constant [8 x i8] c"windows\00" +@fld.str.86 = private constant [5 x i8] c"wasm\00" +@fld.str.87 = private constant [4 x i8] c"ios\00" +@fld.str.88 = private constant [8 x i8] c"android\00" +@fld.str.89 = private constant [8 x i8] c"unknown\00" +@field_names.90 = private constant [7 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.83, i64 5 }, { ptr, i64 } { ptr @fld.str.84, i64 5 }, { ptr, i64 } { ptr @fld.str.85, i64 7 }, { ptr, i64 } { ptr @fld.str.86, i64 4 }, { ptr, i64 } { ptr @fld.str.87, i64 3 }, { ptr, i64 } { ptr @fld.str.88, i64 7 }, { ptr, i64 } { ptr @fld.str.89, i64 7 }] +@str.91 = private unnamed_addr constant [2 x i8] c"(\00", align 1 +@str.92 = private unnamed_addr constant [2 x i8] c")\00", align 1 +@str.93 = private unnamed_addr constant [2 x i8] c".\00", align 1 +@fld.str.94 = private constant [8 x i8] c"aarch64\00" +@fld.str.95 = private constant [7 x i8] c"x86_64\00" +@fld.str.96 = private constant [7 x i8] c"wasm32\00" +@fld.str.97 = private constant [7 x i8] c"wasm64\00" +@fld.str.98 = private constant [8 x i8] c"unknown\00" +@field_names.99 = private constant [5 x { ptr, i64 }] [{ ptr, i64 } { ptr @fld.str.94, i64 7 }, { ptr, i64 } { ptr @fld.str.95, i64 6 }, { ptr, i64 } { ptr @fld.str.96, i64 6 }, { ptr, i64 } { ptr @fld.str.97, i64 6 }, { ptr, i64 } { ptr @fld.str.98, i64 7 }] +@str.100 = private unnamed_addr constant [2 x i8] c"(\00", align 1 +@str.101 = private unnamed_addr constant [2 x i8] c")\00", align 1 +@str.102 = private unnamed_addr constant [2 x i8] c"[\00", align 1 +@str.103 = private unnamed_addr constant [2 x i8] c"]\00", align 1 +@str.104 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@str.105 = private unnamed_addr constant [2 x i8] c"[\00", align 1 +@str.106 = private unnamed_addr constant [2 x i8] c"]\00", align 1 +@str.107 = private unnamed_addr constant [3 x i8] c", \00", align 1 +@str.108 = private unnamed_addr constant [2 x i8] c"[\00", align 1 +@str.109 = private unnamed_addr constant [2 x i8] c"]\00", align 1 +@str.110 = private unnamed_addr constant [3 x i8] c", \00", align 1 @str.111 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.112 = private unnamed_addr constant [7 x i8] c"*Arena\00", align 1 +@str.112 = private unnamed_addr constant [6 x i8] c"*void\00", align 1 @str.113 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.114 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.115 = private unnamed_addr constant [6 x i8] c"[*]u8\00", align 1 +@str.115 = private unnamed_addr constant [5 x i8] c"*GPA\00", align 1 @str.116 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.117 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.118 = private unnamed_addr constant [10 x i8] c"*BufAlloc\00", align 1 +@str.118 = private unnamed_addr constant [12 x i8] c"*ArenaChunk\00", align 1 @str.119 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.120 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.121 = private unnamed_addr constant [6 x i8] c"**GPA\00", align 1 +@str.121 = private unnamed_addr constant [7 x i8] c"*Arena\00", align 1 @str.122 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.123 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.124 = private unnamed_addr constant [5 x i8] c"*s64\00", align 1 +@str.124 = private unnamed_addr constant [6 x i8] c"[*]u8\00", align 1 @str.125 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.126 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.127 = private unnamed_addr constant [7 x i8] c"**void\00", align 1 +@str.127 = private unnamed_addr constant [10 x i8] c"*BufAlloc\00", align 1 @str.128 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.129 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.130 = private unnamed_addr constant [8 x i8] c"*Triple\00", align 1 +@str.130 = private unnamed_addr constant [6 x i8] c"**GPA\00", align 1 @str.131 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.132 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.133 = private unnamed_addr constant [8 x i8] c"*[3]Any\00", align 1 +@str.133 = private unnamed_addr constant [5 x i8] c"*s64\00", align 1 @str.134 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.135 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.136 = private unnamed_addr constant [5 x i8] c"*Any\00", align 1 +@str.136 = private unnamed_addr constant [7 x i8] c"**void\00", align 1 @str.137 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.138 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.139 = private unnamed_addr constant [7 x i8] c"*[]Any\00", align 1 +@str.139 = private unnamed_addr constant [6 x i8] c"*bool\00", align 1 @str.140 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.141 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.142 = private unnamed_addr constant [8 x i8] c"*string\00", align 1 +@str.142 = private unnamed_addr constant [8 x i8] c"*[1]Any\00", align 1 @str.143 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.144 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.145 = private unnamed_addr constant [4 x i8] c"*u8\00", align 1 +@str.145 = private unnamed_addr constant [5 x i8] c"*Any\00", align 1 @str.146 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 +@str.147 = private unnamed_addr constant [5 x i8] c"null\00", align 1 +@str.148 = private unnamed_addr constant [7 x i8] c"*[]Any\00", align 1 +@str.149 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 +@str.150 = private unnamed_addr constant [5 x i8] c"null\00", align 1 +@str.151 = private unnamed_addr constant [8 x i8] c"*string\00", align 1 +@str.152 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 +@str.153 = private unnamed_addr constant [5 x i8] c"null\00", align 1 +@str.154 = private unnamed_addr constant [4 x i8] c"*u8\00", align 1 +@str.155 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 +@str.156 = private unnamed_addr constant [5 x i8] c"null\00", align 1 +@str.157 = private unnamed_addr constant [8 x i8] c"*Triple\00", align 1 +@str.158 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 +@str.159 = private unnamed_addr constant [5 x i8] c"null\00", align 1 +@str.160 = private unnamed_addr constant [8 x i8] c"*[3]Any\00", align 1 +@str.161 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @OBJC_METH_VAR_NAME_ = private unnamed_addr constant [12 x i8] c"tripleValue\00" @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__sx_objc_selector_init, ptr null }] @@ -532,39 +547,39 @@ entry: %loadN = load i64, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 store i64 %loadN, ptr %allocaN, align 8 - br label %while.hdr.144 + br label %while.hdr.152 -while.hdr.144: ; preds = %if.merge.149, %entry +while.hdr.152: ; preds = %if.merge.157, %entry %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp sge i64 %loadN, %loadN - br i1 %icmp, label %while.body.145, label %while.exit.146 + br i1 %icmp, label %while.body.153, label %while.exit.154 -while.body.145: ; preds = %while.hdr.144 +while.body.153: ; preds = %while.hdr.152 %loadN = load i64, ptr %allocaN, align 8 %srem = srem i64 %loadN, 16 %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 10 - br i1 %icmpN, label %if.then.147, label %if.else.148 + br i1 %icmpN, label %if.then.155, label %if.else.156 -while.exit.146: ; preds = %while.hdr.144 +while.exit.154: ; preds = %while.hdr.152 ret void -if.then.147: ; preds = %while.body.145 +if.then.155: ; preds = %while.body.153 %loadN = load i64, ptr %allocaN, align 8 %addN = add i64 %loadN, 48 - br label %if.merge.149 + br label %if.merge.157 -if.else.148: ; preds = %while.body.145 +if.else.156: ; preds = %while.body.153 %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, 10 %addN = add i64 %sub, 97 - br label %if.merge.149 + br label %if.merge.157 -if.merge.149: ; preds = %if.else.148, %if.then.147 - %bp = phi i64 [ %addN, %if.then.147 ], [ %addN, %if.else.148 ] +if.merge.157: ; preds = %if.else.156, %if.then.155 + %bp = phi i64 [ %addN, %if.then.155 ], [ %addN, %if.else.156 ] %loadN = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %alloca, align 8 %igp.data = extractvalue { ptr, i64 } %loadN, 0 @@ -577,7 +592,7 @@ if.merge.149: ; preds = %if.else.148, %if.th %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, 1 store i64 %subN, ptr %allocaN, align 8 - br label %while.hdr.144 + br label %while.hdr.152 } ; Function Attrs: nounwind @@ -587,27 +602,27 @@ entry: store i64 %0, ptr %alloca, align 8 %load = load i64, ptr %alloca, align 8 %icmp = icmp eq i64 %load, 0 - br i1 %icmp, label %if.then.134, label %if.merge.135 + br i1 %icmp, label %if.then.142, label %if.merge.143 -if.then.134: ; preds = %entry +if.then.142: ; preds = %entry ret { ptr, i64 } { ptr @str.3, i64 1 } -if.merge.135: ; preds = %entry +if.merge.143: ; preds = %entry %loadN = load i64, ptr %alloca, align 8 %srem = srem i64 %loadN, 65536 %allocaN = alloca i64, align 8 store i64 %srem, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 - br i1 %icmpN, label %if.then.136, label %if.merge.137 + br i1 %icmpN, label %if.then.144, label %if.merge.145 -if.then.136: ; preds = %if.merge.135 +if.then.144: ; preds = %if.merge.143 %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, 65536 store i64 %add, ptr %allocaN, align 8 - br label %if.merge.137 + br label %if.merge.145 -if.merge.137: ; preds = %if.then.136, %if.merge.135 +if.merge.145: ; preds = %if.then.144, %if.merge.143 %loadN = load i64, ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 %sub = sub i64 %loadN, %loadN @@ -620,15 +635,15 @@ if.merge.137: ; preds = %if.then.136, %if.me store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 - br i1 %icmpN, label %if.then.138, label %if.merge.139 + br i1 %icmpN, label %if.then.146, label %if.merge.147 -if.then.138: ; preds = %if.merge.137 +if.then.146: ; preds = %if.merge.145 %loadN = load i64, ptr %allocaN, align 8 %addN = add i64 %loadN, 65536 store i64 %addN, ptr %allocaN, align 8 - br label %if.merge.139 + br label %if.merge.147 -if.merge.139: ; preds = %if.then.138, %if.merge.137 +if.merge.147: ; preds = %if.then.146, %if.merge.145 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN @@ -641,15 +656,15 @@ if.merge.139: ; preds = %if.then.138, %if.me store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 - br i1 %icmpN, label %if.then.140, label %if.merge.141 + br i1 %icmpN, label %if.then.148, label %if.merge.149 -if.then.140: ; preds = %if.merge.139 +if.then.148: ; preds = %if.merge.147 %loadN = load i64, ptr %allocaN, align 8 %addN = add i64 %loadN, 65536 store i64 %addN, ptr %allocaN, align 8 - br label %if.merge.141 + br label %if.merge.149 -if.merge.141: ; preds = %if.then.140, %if.merge.139 +if.merge.149: ; preds = %if.then.148, %if.merge.147 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %subN = sub i64 %loadN, %loadN @@ -662,15 +677,15 @@ if.merge.141: ; preds = %if.then.140, %if.me store i64 %sremN, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 0 - br i1 %icmpN, label %if.then.142, label %if.merge.143 + br i1 %icmpN, label %if.then.150, label %if.merge.151 -if.then.142: ; preds = %if.merge.141 +if.then.150: ; preds = %if.merge.149 %loadN = load i64, ptr %allocaN, align 8 %addN = add i64 %loadN, 65536 store i64 %addN, ptr %allocaN, align 8 - br label %if.merge.143 + br label %if.merge.151 -if.merge.143: ; preds = %if.then.142, %if.merge.141 +if.merge.151: ; preds = %if.then.150, %if.merge.149 %call = call { ptr, i64 } @cstring(i64 16) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 @@ -688,14 +703,14 @@ if.merge.143: ; preds = %if.then.142, %if.me call void @hex_group({ ptr, i64 } %loadN, i64 12, i64 %loadN) %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - br label %while.hdr.150 + br label %while.hdr.158 -while.hdr.150: ; preds = %if.merge.154, %if.merge.143 +while.hdr.158: ; preds = %if.merge.162, %if.merge.151 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp slt i64 %loadN, 15 - br i1 %icmpN, label %while.body.151, label %while.exit.152 + br i1 %icmpN, label %while.body.159, label %while.exit.160 -while.body.151: ; preds = %while.hdr.150 +while.body.159: ; preds = %while.hdr.158 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %ig.data = extractvalue { ptr, i64 } %loadN, 0 @@ -703,9 +718,9 @@ while.body.151: ; preds = %while.hdr.150 %ig.val = load i8, ptr %ig.ptr, align 1 %cmp.ext = zext i8 %ig.val to i64 %icmpN = icmp ne i64 %cmp.ext, 48 - br i1 %icmpN, label %if.then.153, label %if.merge.154 + br i1 %icmpN, label %if.then.161, label %if.merge.162 -while.exit.152: ; preds = %if.then.153, %while.hdr.150 +while.exit.160: ; preds = %if.then.161, %while.hdr.158 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -713,14 +728,14 @@ while.exit.152: ; preds = %if.then.153, %while %callN = call { ptr, i64 } @substr({ ptr, i64 } %loadN, i64 %loadN, i64 %subN) ret { ptr, i64 } %callN -if.then.153: ; preds = %while.body.151 - br label %while.exit.152 +if.then.161: ; preds = %while.body.159 + br label %while.exit.160 -if.merge.154: ; preds = %while.body.151 +if.merge.162: ; preds = %while.body.159 %loadN = load i64, ptr %allocaN, align 8 %addN = add i64 %loadN, 1 store i64 %addN, ptr %allocaN, align 8 - br label %while.hdr.150 + br label %while.hdr.158 } ; Function Attrs: nounwind @@ -826,6 +841,7 @@ entry: i64 29, label %match.arm.7 i64 30, label %match.arm.7 i64 38, label %match.arm.9 + i64 45, label %match.arm.9 i64 37, label %match.arm.10 i64 17, label %match.arm.11 i64 20, label %match.arm.11 @@ -842,10 +858,12 @@ entry: i64 41, label %match.arm.11 i64 42, label %match.arm.11 i64 43, label %match.arm.11 + i64 44, label %match.arm.11 + i64 46, label %match.arm.11 i64 13, label %match.arm.12 ] -match.merge.0: ; preds = %dispatch.merge.114, %dispatch.merge.106, %dispatch.merge.98, %dispatch.merge.90, %dispatch.merge.40, %float.merge.29, %match.unr.13, %match.arm.12, %match.arm.4, %match.arm.3, %match.arm.2, %match.arm.1 +match.merge.0: ; preds = %dispatch.merge.120, %dispatch.merge.112, %dispatch.merge.98, %dispatch.merge.90, %dispatch.merge.40, %float.merge.29, %match.unr.13, %match.arm.12, %match.arm.4, %match.arm.3, %match.arm.2, %match.arm.1 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 ret { ptr, i64 } %loadN @@ -913,42 +931,45 @@ match.arm.7: ; preds = %entry, %entry match.arm.8: ; No predecessors! unreachable -match.arm.9: ; preds = %entry +match.arm.9: ; preds = %entry, %entry %loadN = load i64, ptr %allocaN, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 switch i64 %loadN, label %dispatch.default.99 [ i64 38, label %dispatch.case.100 + i64 45, label %dispatch.case.101 ] match.arm.10: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 - switch i64 %loadN, label %dispatch.default.107 [ - i64 37, label %dispatch.case.108 + switch i64 %loadN, label %dispatch.default.113 [ + i64 37, label %dispatch.case.114 ] -match.arm.11: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry +match.arm.11: ; preds = %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry, %entry %loadN = load i64, ptr %allocaN, align 8 %loadN = load { i64, i64 }, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 - switch i64 %loadN, label %dispatch.default.115 [ - i64 17, label %dispatch.case.116 - i64 20, label %dispatch.case.117 - i64 22, label %dispatch.case.118 - i64 24, label %dispatch.case.119 - i64 25, label %dispatch.case.120 - i64 27, label %dispatch.case.121 - i64 33, label %dispatch.case.122 - i64 34, label %dispatch.case.123 - i64 35, label %dispatch.case.124 - i64 36, label %dispatch.case.125 - i64 39, label %dispatch.case.126 - i64 40, label %dispatch.case.127 - i64 41, label %dispatch.case.128 - i64 42, label %dispatch.case.129 - i64 43, label %dispatch.case.130 + switch i64 %loadN, label %dispatch.default.121 [ + i64 17, label %dispatch.case.122 + i64 20, label %dispatch.case.123 + i64 22, label %dispatch.case.124 + i64 24, label %dispatch.case.125 + i64 25, label %dispatch.case.126 + i64 27, label %dispatch.case.127 + i64 33, label %dispatch.case.128 + i64 34, label %dispatch.case.129 + i64 35, label %dispatch.case.130 + i64 36, label %dispatch.case.131 + i64 39, label %dispatch.case.132 + i64 40, label %dispatch.case.133 + i64 41, label %dispatch.case.134 + i64 42, label %dispatch.case.135 + i64 43, label %dispatch.case.136 + i64 44, label %dispatch.case.137 + i64 46, label %dispatch.case.138 ] match.arm.12: ; preds = %entry @@ -1079,7 +1100,7 @@ dispatch.case.93: ; preds = %match.arm.7 store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %dispatch.merge.90 -dispatch.merge.98: ; preds = %dispatch.case.100, %dispatch.default.99 +dispatch.merge.98: ; preds = %dispatch.case.101, %dispatch.case.100, %dispatch.default.99 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 store { ptr, i64 } %loadN, ptr %allocaN, align 8 br label %match.merge.0 @@ -1091,141 +1112,163 @@ dispatch.default.99: ; preds = %match.arm.9 dispatch.case.100: ; preds = %match.arm.9 %ua.raw80 = extractvalue { i64, i64 } %loadN, 1 %ua.ptr81 = inttoptr i64 %ua.raw80 to ptr - %ua.load82 = load [3 x { i64, i64 }], ptr %ua.ptr81, align 8 - %callN = call { ptr, i64 } @array_to_string__AR_3_Any([3 x { i64, i64 }] %ua.load82) + %ua.load82 = load [1 x { i64, i64 }], ptr %ua.ptr81, align 8 + %callN = call { ptr, i64 } @array_to_string__AR_1_Any([1 x { i64, i64 }] %ua.load82) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %dispatch.merge.98 -dispatch.merge.106: ; preds = %dispatch.case.108, %dispatch.default.107 +dispatch.case.101: ; preds = %match.arm.9 + %ua.raw84 = extractvalue { i64, i64 } %loadN, 1 + %ua.ptr85 = inttoptr i64 %ua.raw84 to ptr + %ua.load86 = load [3 x { i64, i64 }], ptr %ua.ptr85, align 8 + %callN = call { ptr, i64 } @array_to_string__AR_3_Any([3 x { i64, i64 }] %ua.load86) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.98 + +dispatch.merge.112: ; preds = %dispatch.case.114, %dispatch.default.113 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 store { ptr, i64 } %loadN, ptr %allocaN, align 8 br label %match.merge.0 -dispatch.default.107: ; preds = %match.arm.10 +dispatch.default.113: ; preds = %match.arm.10 store { ptr, i64 } { ptr @str.9, i64 0 }, ptr %allocaN, align 8 - br label %dispatch.merge.106 + br label %dispatch.merge.112 -dispatch.case.108: ; preds = %match.arm.10 - %ua.raw85 = extractvalue { i64, i64 } %loadN, 1 - %ua.ptr86 = inttoptr i64 %ua.raw85 to ptr - %ua.load87 = load { ptr, i64 }, ptr %ua.ptr86, align 8 - %callN = call { ptr, i64 } @slice_to_string__Any({ ptr, i64 } %ua.load87) +dispatch.case.114: ; preds = %match.arm.10 + %ua.raw89 = extractvalue { i64, i64 } %loadN, 1 + %ua.ptr90 = inttoptr i64 %ua.raw89 to ptr + %ua.load91 = load { ptr, i64 }, ptr %ua.ptr90, align 8 + %callN = call { ptr, i64 } @slice_to_string__Any({ ptr, i64 } %ua.load91) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.106 + br label %dispatch.merge.112 -dispatch.merge.114: ; preds = %dispatch.case.130, %dispatch.case.129, %dispatch.case.128, %dispatch.case.127, %dispatch.case.126, %dispatch.case.125, %dispatch.case.124, %dispatch.case.123, %dispatch.case.122, %dispatch.case.121, %dispatch.case.120, %dispatch.case.119, %dispatch.case.118, %dispatch.case.117, %dispatch.case.116, %dispatch.default.115 +dispatch.merge.120: ; preds = %dispatch.case.138, %dispatch.case.137, %dispatch.case.136, %dispatch.case.135, %dispatch.case.134, %dispatch.case.133, %dispatch.case.132, %dispatch.case.131, %dispatch.case.130, %dispatch.case.129, %dispatch.case.128, %dispatch.case.127, %dispatch.case.126, %dispatch.case.125, %dispatch.case.124, %dispatch.case.123, %dispatch.case.122, %dispatch.default.121 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 store { ptr, i64 } %loadN, ptr %allocaN, align 8 br label %match.merge.0 -dispatch.default.115: ; preds = %match.arm.11 +dispatch.default.121: ; preds = %match.arm.11 store { ptr, i64 } { ptr @str.10, i64 0 }, ptr %allocaN, align 8 - br label %dispatch.merge.114 - -dispatch.case.116: ; preds = %match.arm.11 - %ua.raw90 = extractvalue { i64, i64 } %loadN, 1 - %iNp = inttoptr i64 %ua.raw90 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_void(ptr %iNp) - store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 - -dispatch.case.117: ; preds = %match.arm.11 - %ua.raw92 = extractvalue { i64, i64 } %loadN, 1 - %iNp93 = inttoptr i64 %ua.raw92 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_GPA(ptr %iNp93) - store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 - -dispatch.case.118: ; preds = %match.arm.11 - %ua.raw95 = extractvalue { i64, i64 } %loadN, 1 - %iNp96 = inttoptr i64 %ua.raw95 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_ArenaChunk(ptr %iNp96) - store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 - -dispatch.case.119: ; preds = %match.arm.11 - %ua.raw98 = extractvalue { i64, i64 } %loadN, 1 - %iNp99 = inttoptr i64 %ua.raw98 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_Arena(ptr %iNp99) - store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 - -dispatch.case.120: ; preds = %match.arm.11 - %ua.raw101 = extractvalue { i64, i64 } %loadN, 1 - %iNp102 = inttoptr i64 %ua.raw101 to ptr - %callN = call { ptr, i64 } @pointer_to_string__mptr_u8(ptr %iNp102) - store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 - -dispatch.case.121: ; preds = %match.arm.11 - %ua.raw104 = extractvalue { i64, i64 } %loadN, 1 - %iNp105 = inttoptr i64 %ua.raw104 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_BufAlloc(ptr %iNp105) - store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.122: ; preds = %match.arm.11 - %ua.raw107 = extractvalue { i64, i64 } %loadN, 1 - %iNp108 = inttoptr i64 %ua.raw107 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_GPA(ptr %iNp108) + %ua.raw94 = extractvalue { i64, i64 } %loadN, 1 + %iNp = inttoptr i64 %ua.raw94 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_void(ptr %iNp) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.123: ; preds = %match.arm.11 - %ua.raw110 = extractvalue { i64, i64 } %loadN, 1 - %iNp111 = inttoptr i64 %ua.raw110 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_s64(ptr %iNp111) + %ua.raw96 = extractvalue { i64, i64 } %loadN, 1 + %iNp97 = inttoptr i64 %ua.raw96 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_GPA(ptr %iNp97) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.124: ; preds = %match.arm.11 - %ua.raw113 = extractvalue { i64, i64 } %loadN, 1 - %iNp114 = inttoptr i64 %ua.raw113 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_void(ptr %iNp114) + %ua.raw99 = extractvalue { i64, i64 } %loadN, 1 + %iNp100 = inttoptr i64 %ua.raw99 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_ArenaChunk(ptr %iNp100) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.125: ; preds = %match.arm.11 - %ua.raw116 = extractvalue { i64, i64 } %loadN, 1 - %iNp117 = inttoptr i64 %ua.raw116 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_Triple(ptr %iNp117) + %ua.raw102 = extractvalue { i64, i64 } %loadN, 1 + %iNp103 = inttoptr i64 %ua.raw102 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_Arena(ptr %iNp103) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.126: ; preds = %match.arm.11 - %ua.raw119 = extractvalue { i64, i64 } %loadN, 1 - %iNp120 = inttoptr i64 %ua.raw119 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_AR_3_Any(ptr %iNp120) + %ua.raw105 = extractvalue { i64, i64 } %loadN, 1 + %iNp106 = inttoptr i64 %ua.raw105 to ptr + %callN = call { ptr, i64 } @pointer_to_string__mptr_u8(ptr %iNp106) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.127: ; preds = %match.arm.11 - %ua.raw122 = extractvalue { i64, i64 } %loadN, 1 - %iNp123 = inttoptr i64 %ua.raw122 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_Any(ptr %iNp123) + %ua.raw108 = extractvalue { i64, i64 } %loadN, 1 + %iNp109 = inttoptr i64 %ua.raw108 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_BufAlloc(ptr %iNp109) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.128: ; preds = %match.arm.11 - %ua.raw125 = extractvalue { i64, i64 } %loadN, 1 - %iNp126 = inttoptr i64 %ua.raw125 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_SL_Any(ptr %iNp126) + %ua.raw111 = extractvalue { i64, i64 } %loadN, 1 + %iNp112 = inttoptr i64 %ua.raw111 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_GPA(ptr %iNp112) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.129: ; preds = %match.arm.11 - %ua.raw128 = extractvalue { i64, i64 } %loadN, 1 - %iNp129 = inttoptr i64 %ua.raw128 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_string(ptr %iNp129) + %ua.raw114 = extractvalue { i64, i64 } %loadN, 1 + %iNp115 = inttoptr i64 %ua.raw114 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_s64(ptr %iNp115) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 dispatch.case.130: ; preds = %match.arm.11 - %ua.raw131 = extractvalue { i64, i64 } %loadN, 1 - %iNp132 = inttoptr i64 %ua.raw131 to ptr - %callN = call { ptr, i64 } @pointer_to_string__ptr_u8(ptr %iNp132) + %ua.raw117 = extractvalue { i64, i64 } %loadN, 1 + %iNp118 = inttoptr i64 %ua.raw117 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_ptr_void(ptr %iNp118) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %dispatch.merge.114 + br label %dispatch.merge.120 + +dispatch.case.131: ; preds = %match.arm.11 + %ua.raw120 = extractvalue { i64, i64 } %loadN, 1 + %iNp121 = inttoptr i64 %ua.raw120 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_bool(ptr %iNp121) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.132: ; preds = %match.arm.11 + %ua.raw123 = extractvalue { i64, i64 } %loadN, 1 + %iNp124 = inttoptr i64 %ua.raw123 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_AR_1_Any(ptr %iNp124) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.133: ; preds = %match.arm.11 + %ua.raw126 = extractvalue { i64, i64 } %loadN, 1 + %iNp127 = inttoptr i64 %ua.raw126 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_Any(ptr %iNp127) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.134: ; preds = %match.arm.11 + %ua.raw129 = extractvalue { i64, i64 } %loadN, 1 + %iNp130 = inttoptr i64 %ua.raw129 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_SL_Any(ptr %iNp130) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.135: ; preds = %match.arm.11 + %ua.raw132 = extractvalue { i64, i64 } %loadN, 1 + %iNp133 = inttoptr i64 %ua.raw132 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_string(ptr %iNp133) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.136: ; preds = %match.arm.11 + %ua.raw135 = extractvalue { i64, i64 } %loadN, 1 + %iNp136 = inttoptr i64 %ua.raw135 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_u8(ptr %iNp136) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.137: ; preds = %match.arm.11 + %ua.raw138 = extractvalue { i64, i64 } %loadN, 1 + %iNp139 = inttoptr i64 %ua.raw138 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_Triple(ptr %iNp139) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 + +dispatch.case.138: ; preds = %match.arm.11 + %ua.raw141 = extractvalue { i64, i64 } %loadN, 1 + %iNp142 = inttoptr i64 %ua.raw141 to ptr + %callN = call { ptr, i64 } @pointer_to_string__ptr_AR_3_Any(ptr %iNp142) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %dispatch.merge.120 } ; Function Attrs: nounwind @@ -1246,6 +1289,59 @@ declare void @BuildOptions.set_wasm_shell(i64, ptr) #0 ; Function Attrs: nounwind declare i64 @build_options() #0 +; Function Attrs: nounwind +declare ptr @objc_getClass(ptr) #0 + +; Function Attrs: nounwind +declare ptr @objc_lookUpClass(ptr) #0 + +; Function Attrs: nounwind +declare ptr @sel_registerName(ptr) #0 + +; Function Attrs: nounwind +declare ptr @class_createInstance(ptr, i64) #0 + +; Function Attrs: nounwind +declare ptr @object_getClass(ptr) #0 + +; Function Attrs: nounwind +declare ptr @objc_msgSend(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @objc_allocateClassPair(ptr, ptr, i64) #0 + +; Function Attrs: nounwind +declare i1 @class_addMethod(ptr, ptr, ptr, ptr) #0 + +; Function Attrs: nounwind +declare i1 @class_addProtocol(ptr, ptr) #0 + +; Function Attrs: nounwind +declare ptr @objc_getProtocol(ptr) #0 + +; Function Attrs: nounwind +declare void @objc_registerClassPair(ptr) #0 + +; Function Attrs: nounwind +declare void @NSLog(ptr) #0 + +; Function Attrs: nounwind +declare ptr @ns_string(ptr) #0 + +; Function Attrs: nounwind +declare ptr @c_string(ptr) #0 + +; Function Attrs: nounwind +define internal void @triple_imp(ptr sret({ i64, i64, i64 }) %0, ptr %1, ptr %2) #0 { +entry: + %alloca = alloca ptr, align 8 + store ptr %0, ptr %alloca, align 8 + %allocaN = alloca ptr, align 8 + store ptr %1, ptr %allocaN, align 8 + store { i64, i64, i64 } { i64 11, i64 22, i64 33 }, ptr %0, align 8 + ret void +} + ; Function Attrs: nounwind define i32 @main() #0 { entry: @@ -1258,40 +1354,41 @@ entry: %siN = insertvalue { { ptr, ptr, ptr }, ptr } undef, { ptr, ptr, ptr } %siN, 0 %siN = insertvalue { { ptr, ptr, ptr }, ptr } %siN, ptr null, 1 store { { ptr, ptr, ptr }, ptr } %siN, ptr @context, align 8 - %load = load ptr, ptr @OBJC_SELECTOR_REFERENCES_tripleValue, align 8 - %objc.msg = call { i64, i64, i64 } @objc_msgSend(ptr null, ptr %load) - %allocaN = alloca { i64, i64, i64 }, align 8 - store { i64, i64, i64 } %objc.msg, ptr %allocaN, align 8 - %allocaN = alloca [3 x { i64, i64 }], align 8 - %loadN = load { i64, i64, i64 }, ptr %allocaN, align 8 - %sg = extractvalue { i64, i64, i64 } %loadN, 0 - %ba.val = insertvalue { i64, i64 } { i64 5, i64 undef }, i64 %sg, 1 + %call = call ptr @objc_getClass(ptr @str.11) + %allocaN = alloca ptr, align 8 + store ptr %call, ptr %allocaN, align 8 + %load = load ptr, ptr %allocaN, align 8 + %callN = call ptr @objc_allocateClassPair(ptr %load, ptr @str.12, i64 0) + %allocaN = alloca ptr, align 8 + store ptr %callN, ptr %allocaN, align 8 + %callN = call ptr @sel_registerName(ptr @str.13) + %allocaN = alloca ptr, align 8 + store ptr %callN, ptr %allocaN, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + %callN = call i1 @class_addMethod(ptr %loadN, ptr %loadN, ptr @triple_imp, ptr @str.14) + %allocaN = alloca i1, align 1 + store i1 %callN, ptr %allocaN, align 1 + %allocaN = alloca [1 x { i64, i64 }], align 8 + %loadN = load i1, ptr %allocaN, align 1 + %zN = zext i1 %loadN to i64 + %ba.val = insertvalue { i64, i64 } { i64 1, i64 undef }, i64 %zN, 1 %igp.ptr = getelementptr { i64, i64 }, ptr %allocaN, i64 0 store { i64, i64 } %ba.val, ptr %igp.ptr, align 8 - %loadN = load { i64, i64, i64 }, ptr %allocaN, align 8 - %sgN = extractvalue { i64, i64, i64 } %loadN, 1 - %ba.val10 = insertvalue { i64, i64 } { i64 5, i64 undef }, i64 %sgN, 1 - %igp.ptr11 = getelementptr { i64, i64 }, ptr %allocaN, i64 1 - store { i64, i64 } %ba.val10, ptr %igp.ptr11, align 8 - %loadN = load { i64, i64, i64 }, ptr %allocaN, align 8 - %sgN = extractvalue { i64, i64, i64 } %loadN, 2 - %ba.val14 = insertvalue { i64, i64 } { i64 5, i64 undef }, i64 %sgN, 1 - %igp.ptr15 = getelementptr { i64, i64 }, ptr %allocaN, i64 2 - store { i64, i64 } %ba.val14, ptr %igp.ptr15, align 8 %allocaN = alloca { ptr, i64 }, align 8 %igp.ptr17 = getelementptr { i64, i64 }, ptr %allocaN, i64 0 %gep = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0 store ptr %igp.ptr17, ptr %gep, align 8 %gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1 - store i64 3, ptr %gepN, align 8 + store i64 1, ptr %gepN, align 8 %allocaN = alloca { ptr, i64 }, align 8 - store { ptr, i64 } { ptr @str.11, i64 22 }, ptr %allocaN, align 8 + store { ptr, i64 } { ptr @str.15, i64 15 }, ptr %allocaN, align 8 %allocaN = alloca { ptr, i64 }, align 8 - store { ptr, i64 } { ptr @str.12, i64 0 }, ptr %allocaN, align 8 + store { ptr, i64 } { ptr @str.16, i64 0 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %call = call { ptr, i64 } @substr({ ptr, i64 } %loadN, i64 0, i64 10) - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %call) + %callN = call { ptr, i64 } @substr({ ptr, i64 } %loadN, i64 0, i64 12) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -1303,15 +1400,76 @@ entry: store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %callN = call { ptr, i64 } @substr({ ptr, i64 } %loadN, i64 14, i64 1) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %str.ptr = extractvalue { ptr, i64 } %loadN, 0 + %str.len = extractvalue { ptr, i64 } %loadN, 1 + %0 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len) + %loadN = load ptr, ptr %allocaN, align 8 + call void @objc_registerClassPair(ptr %loadN) + %loadN = load ptr, ptr %allocaN, align 8 + %callN = call ptr @class_createInstance(ptr %loadN, i64 0) + %allocaN = alloca ptr, align 8 + store ptr %callN, ptr %allocaN, align 8 + %loadN = load ptr, ptr %allocaN, align 8 + %loadN = load ptr, ptr @OBJC_SELECTOR_REFERENCES_tripleValue, align 8 + %objc.sret = alloca { i64, i64, i64 }, align 8 + call void @objc_msgSend(ptr sret({ i64, i64, i64 }) %objc.sret, ptr %loadN, ptr %loadN) + %objc.sret.load = load { i64, i64, i64 }, ptr %objc.sret, align 8 + %allocaN = alloca { i64, i64, i64 }, align 8 + store { i64, i64, i64 } %objc.sret.load, ptr %allocaN, align 8 + %allocaN = alloca [3 x { i64, i64 }], align 8 + %loadN = load { i64, i64, i64 }, ptr %allocaN, align 8 + %sg = extractvalue { i64, i64, i64 } %loadN, 0 + %ba.val43 = insertvalue { i64, i64 } { i64 5, i64 undef }, i64 %sg, 1 + %igp.ptr44 = getelementptr { i64, i64 }, ptr %allocaN, i64 0 + store { i64, i64 } %ba.val43, ptr %igp.ptr44, align 8 + %loadN = load { i64, i64, i64 }, ptr %allocaN, align 8 + %sgN = extractvalue { i64, i64, i64 } %loadN, 1 + %ba.val47 = insertvalue { i64, i64 } { i64 5, i64 undef }, i64 %sgN, 1 + %igp.ptr48 = getelementptr { i64, i64 }, ptr %allocaN, i64 1 + store { i64, i64 } %ba.val47, ptr %igp.ptr48, align 8 + %loadN = load { i64, i64, i64 }, ptr %allocaN, align 8 + %sgN = extractvalue { i64, i64, i64 } %loadN, 2 + %ba.val51 = insertvalue { i64, i64 } { i64 5, i64 undef }, i64 %sgN, 1 + %igp.ptr52 = getelementptr { i64, i64 }, ptr %allocaN, i64 2 + store { i64, i64 } %ba.val51, ptr %igp.ptr52, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + %igp.ptr54 = getelementptr { i64, i64 }, ptr %allocaN, i64 0 + %gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 0 + store ptr %igp.ptr54, ptr %gepN, align 8 + %gepN = getelementptr inbounds { ptr, i64 }, ptr %allocaN, i32 0, i32 1 + store i64 3, ptr %gepN, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + store { ptr, i64 } { ptr @str.17, i64 22 }, ptr %allocaN, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + store { ptr, i64 } { ptr @str.18, i64 0 }, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %callN = call { ptr, i64 } @substr({ ptr, i64 } %loadN, i64 0, i64 10) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %ig.data65 = extractvalue { ptr, i64 } %loadN, 0 + %ig.ptr66 = getelementptr { i64, i64 }, ptr %ig.data65, i64 0 + %ig.val67 = load { i64, i64 }, ptr %ig.ptr66, align 8 + %callN = call { ptr, i64 } @any_to_string({ i64, i64 } %ig.val67) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %callN = call { ptr, i64 } @substr({ ptr, i64 } %loadN, i64 12, i64 2) %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %ig.data34 = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr35 = getelementptr { i64, i64 }, ptr %ig.data34, i64 1 - %ig.val36 = load { i64, i64 }, ptr %ig.ptr35, align 8 - %callN = call { ptr, i64 } @any_to_string({ i64, i64 } %ig.val36) + %ig.data76 = extractvalue { ptr, i64 } %loadN, 0 + %ig.ptr77 = getelementptr { i64, i64 }, ptr %ig.data76, i64 1 + %ig.val78 = load { i64, i64 }, ptr %ig.ptr77, align 8 + %callN = call { ptr, i64 } @any_to_string({ i64, i64 } %ig.val78) %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -1321,10 +1479,10 @@ entry: store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %ig.data45 = extractvalue { ptr, i64 } %loadN, 0 - %ig.ptr46 = getelementptr { i64, i64 }, ptr %ig.data45, i64 2 - %ig.val47 = load { i64, i64 }, ptr %ig.ptr46, align 8 - %callN = call { ptr, i64 } @any_to_string({ i64, i64 } %ig.val47) + %ig.data87 = extractvalue { ptr, i64 } %loadN, 0 + %ig.ptr88 = getelementptr { i64, i64 }, ptr %ig.data87, i64 2 + %ig.val89 = load { i64, i64 }, ptr %ig.ptr88, align 8 + %callN = call { ptr, i64 } @any_to_string({ i64, i64 } %ig.val89) %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 @@ -1333,9 +1491,9 @@ entry: %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %str.ptr = extractvalue { ptr, i64 } %loadN, 0 - %str.len = extractvalue { ptr, i64 } %loadN, 1 - %0 = call i64 @write(i32 1, ptr %str.ptr, i64 %str.len) + %str.ptr97 = extractvalue { ptr, i64 } %loadN, 0 + %str.len98 = extractvalue { ptr, i64 } %loadN, 1 + %1 = call i64 @write(i32 1, ptr %str.ptr97, i64 %str.len98) ret i32 0 } @@ -1358,7 +1516,7 @@ define internal { ptr, i64 } @struct_to_string__Allocator({ ptr, ptr, ptr } %0) entry: %alloca = alloca { ptr, ptr, ptr }, align 8 store { ptr, ptr, ptr } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.13, i64 9 }, { ptr, i64 } { ptr @str.14, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.19, i64 9 }, { ptr, i64 } { ptr @str.20, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1377,12 +1535,12 @@ while.body.51: ; preds = %while.hdr.50 while.exit.52: ; preds = %while.hdr.50 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.15, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.21, i64 1 }) ret { ptr, i64 } %callN if.then.53: ; preds = %while.body.51 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.16, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.22, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.54 @@ -1394,7 +1552,7 @@ if.merge.54: ; preds = %if.then.53, %while. %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.19, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.25, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, ptr, ptr }, ptr %alloca, align 8 @@ -1442,7 +1600,7 @@ define internal { ptr, i64 } @struct_to_string__GPA({ i64 } %0) #0 { entry: %alloca = alloca { i64 }, align 8 store { i64 } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.20, i64 3 }, { ptr, i64 } { ptr @str.21, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.26, i64 3 }, { ptr, i64 } { ptr @str.27, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1461,24 +1619,24 @@ while.body.56: ; preds = %while.hdr.55 while.exit.57: ; preds = %while.hdr.55 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.22, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.28, i64 1 }) ret { ptr, i64 } %callN if.then.58: ; preds = %while.body.56 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.23, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.29, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.59 if.merge.59: ; preds = %if.then.58, %while.body.56 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [1 x { ptr, i64 }], ptr @field_names.25, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [1 x { ptr, i64 }], ptr @field_names.31, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.26, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.32, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { i64 }, ptr %alloca, align 8 @@ -1511,7 +1669,7 @@ define internal { ptr, i64 } @struct_to_string__ArenaChunk({ ptr, i64 } %0) #0 { entry: %alloca = alloca { ptr, i64 }, align 8 store { ptr, i64 } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.27, i64 10 }, { ptr, i64 } { ptr @str.28, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.33, i64 10 }, { ptr, i64 } { ptr @str.34, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1530,24 +1688,24 @@ while.body.61: ; preds = %while.hdr.60 while.exit.62: ; preds = %while.hdr.60 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.29, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.35, i64 1 }) ret { ptr, i64 } %callN if.then.63: ; preds = %while.body.61 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.30, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.36, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.64 if.merge.64: ; preds = %if.then.63, %while.body.61 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [2 x { ptr, i64 }], ptr @field_names.33, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [2 x { ptr, i64 }], ptr @field_names.39, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.34, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.40, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %alloca, align 8 @@ -1587,7 +1745,7 @@ define internal { ptr, i64 } @struct_to_string__Arena({ ptr, i64, { ptr, ptr, pt entry: %alloca = alloca { ptr, i64, { ptr, ptr, ptr } }, align 8 store { ptr, i64, { ptr, ptr, ptr } } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.35, i64 5 }, { ptr, i64 } { ptr @str.36, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.41, i64 5 }, { ptr, i64 } { ptr @str.42, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1606,24 +1764,24 @@ while.body.66: ; preds = %while.hdr.65 while.exit.67: ; preds = %while.hdr.65 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.37, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.43, i64 1 }) ret { ptr, i64 } %callN if.then.68: ; preds = %while.body.66 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.38, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.44, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.69 if.merge.69: ; preds = %if.then.68, %while.body.66 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [3 x { ptr, i64 }], ptr @field_names.42, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [3 x { ptr, i64 }], ptr @field_names.48, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.43, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.49, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64, { ptr, ptr, ptr } }, ptr %alloca, align 8 @@ -1672,7 +1830,7 @@ define internal { ptr, i64 } @struct_to_string__BufAlloc({ ptr, i64, i64 } %0) # entry: %alloca = alloca { ptr, i64, i64 }, align 8 store { ptr, i64, i64 } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.44, i64 8 }, { ptr, i64 } { ptr @str.45, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.50, i64 8 }, { ptr, i64 } { ptr @str.51, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1691,24 +1849,24 @@ while.body.71: ; preds = %while.hdr.70 while.exit.72: ; preds = %while.hdr.70 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.46, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.52, i64 1 }) ret { ptr, i64 } %callN if.then.73: ; preds = %while.body.71 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.47, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.53, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.74 if.merge.74: ; preds = %if.then.73, %while.body.71 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [3 x { ptr, i64 }], ptr @field_names.51, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [3 x { ptr, i64 }], ptr @field_names.57, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.52, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.58, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64, i64 }, ptr %alloca, align 8 @@ -1754,7 +1912,7 @@ define internal { ptr, i64 } @struct_to_string__Context({ { ptr, ptr, ptr }, ptr entry: %alloca = alloca { { ptr, ptr, ptr }, ptr }, align 8 store { { ptr, ptr, ptr }, ptr } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.53, i64 7 }, { ptr, i64 } { ptr @str.54, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.59, i64 7 }, { ptr, i64 } { ptr @str.60, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1773,24 +1931,24 @@ while.body.76: ; preds = %while.hdr.75 while.exit.77: ; preds = %while.hdr.75 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.55, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.61, i64 1 }) ret { ptr, i64 } %callN if.then.78: ; preds = %while.body.76 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.56, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.62, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.79 if.merge.79: ; preds = %if.then.78, %while.body.76 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [2 x { ptr, i64 }], ptr @field_names.59, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [2 x { ptr, i64 }], ptr @field_names.65, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.60, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.66, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { { ptr, ptr, ptr }, ptr }, ptr %alloca, align 8 @@ -1833,7 +1991,7 @@ define internal { ptr, i64 } @struct_to_string__BuildOptions({} %0) #0 { entry: %alloca = alloca {}, align 8 store {} %0, ptr %alloca, align 1 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.61, i64 12 }, { ptr, i64 } { ptr @str.62, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.67, i64 12 }, { ptr, i64 } { ptr @str.68, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1852,24 +2010,24 @@ while.body.81: ; preds = %while.hdr.80 while.exit.82: ; preds = %while.hdr.80 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.63, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.69, i64 1 }) ret { ptr, i64 } %callN if.then.83: ; preds = %while.body.81 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.64, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.70, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.84 if.merge.84: ; preds = %if.then.83, %while.body.81 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [0 x { ptr, i64 }], ptr @field_names.65, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [0 x { ptr, i64 }], ptr @field_names.71, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.66, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.72, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load {}, ptr %alloca, align 1 @@ -1888,7 +2046,7 @@ define internal { ptr, i64 } @struct_to_string__Triple({ i64, i64, i64 } %0) #0 entry: %alloca = alloca { i64, i64, i64 }, align 8 store { i64, i64, i64 } %0, ptr %alloca, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.67, i64 6 }, { ptr, i64 } { ptr @str.68, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.73, i64 6 }, { ptr, i64 } { ptr @str.74, i64 1 }) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 @@ -1907,24 +2065,24 @@ while.body.86: ; preds = %while.hdr.85 while.exit.87: ; preds = %while.hdr.85 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.69, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.75, i64 1 }) ret { ptr, i64 } %callN if.then.88: ; preds = %while.body.86 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.70, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.76, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.89 if.merge.89: ; preds = %if.then.88, %while.body.86 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [3 x { ptr, i64 }], ptr @field_names.74, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [3 x { ptr, i64 }], ptr @field_names.80, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %fn.load) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.75, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.81, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { i64, i64, i64 }, ptr %alloca, align 8 @@ -1973,9 +2131,9 @@ entry: %allocaN = alloca i64, align 8 store i64 %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [7 x { ptr, i64 }], ptr @field_names.84, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [7 x { ptr, i64 }], ptr @field_names.90, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.76, i64 1 }, { ptr, i64 } %fn.load) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.82, i64 1 }, { ptr, i64 } %fn.load) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 @@ -1994,8 +2152,8 @@ entry: if.then.94: ; preds = %entry %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.86, i64 1 }) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.85, i64 1 }, { ptr, i64 } %callN) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.92, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.91, i64 1 }, { ptr, i64 } %callN) %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.95 @@ -2014,9 +2172,9 @@ entry: %allocaN = alloca i64, align 8 store i64 %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 - %fn.gep = getelementptr inbounds [5 x { ptr, i64 }], ptr @field_names.93, i64 0, i64 %loadN + %fn.gep = getelementptr inbounds [5 x { ptr, i64 }], ptr @field_names.99, i64 0, i64 %loadN %fn.load = load { ptr, i64 }, ptr %fn.gep, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.87, i64 1 }, { ptr, i64 } %fn.load) + %call = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.93, i64 1 }, { ptr, i64 } %fn.load) %allocaN = alloca { ptr, i64 }, align 8 store { ptr, i64 } %call, ptr %allocaN, align 8 %loadN = load i64, ptr %alloca, align 8 @@ -2035,8 +2193,8 @@ entry: if.then.96: ; preds = %entry %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.95, i64 1 }) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.94, i64 1 }, { ptr, i64 } %callN) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.101, i64 1 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.100, i64 1 }, { ptr, i64 } %callN) %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) store { ptr, i64 } %callN, ptr %allocaN, align 8 br label %if.merge.97 @@ -2046,39 +2204,92 @@ if.merge.97: ; preds = %if.then.96, %entry ret { ptr, i64 } %loadN } +; Function Attrs: nounwind +define internal { ptr, i64 } @array_to_string__AR_1_Any([1 x { i64, i64 }] %0) #0 { +entry: + %alloca = alloca [1 x { i64, i64 }], align 8 + store [1 x { i64, i64 }] %0, ptr %alloca, align 8 + %allocaN = alloca { ptr, i64 }, align 8 + store { ptr, i64 } { ptr @str.102, i64 1 }, ptr %allocaN, align 8 + %allocaN = alloca i64, align 8 + store i64 0, ptr %allocaN, align 8 + br label %while.hdr.102 + +while.hdr.102: ; preds = %if.merge.106, %entry + %load = load i64, ptr %allocaN, align 8 + %icmp = icmp slt i64 %load, 1 + br i1 %icmp, label %while.body.103, label %while.exit.104 + +while.body.103: ; preds = %while.hdr.102 + %loadN = load i64, ptr %allocaN, align 8 + %icmpN = icmp sgt i64 %loadN, 0 + br i1 %icmpN, label %if.then.105, label %if.merge.106 + +while.exit.104: ; preds = %while.hdr.102 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %call = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.103, i64 1 }) + ret { ptr, i64 } %call + +if.then.105: ; preds = %while.body.103 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.104, i64 2 }) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + br label %if.merge.106 + +if.merge.106: ; preds = %if.then.105, %while.body.103 + %loadN = load { ptr, i64 }, ptr %allocaN, align 8 + %loadN = load [1 x { i64, i64 }], ptr %alloca, align 8 + %loadN = load i64, ptr %allocaN, align 8 + %ig.tmp = alloca [1 x { i64, i64 }], align 8 + store [1 x { i64, i64 }] %loadN, ptr %ig.tmp, align 8 + %ig.ptr = getelementptr [1 x { i64, i64 }], ptr %ig.tmp, i64 0, i64 %loadN + %ig.val = load { i64, i64 }, ptr %ig.ptr, align 8 + %ba.tmp = alloca { i64, i64 }, align 8 + store { i64, i64 } %ig.val, ptr %ba.tmp, align 8 + %ba.p2i = ptrtoint ptr %ba.tmp to i64 + %ba.val = insertvalue { i64, i64 } { i64 13, i64 undef }, i64 %ba.p2i, 1 + %callN = call { ptr, i64 } @any_to_string({ i64, i64 } %ba.val) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } %callN) + store { ptr, i64 } %callN, ptr %allocaN, align 8 + %loadN = load i64, ptr %allocaN, align 8 + %add = add i64 %loadN, 1 + store i64 %add, ptr %allocaN, align 8 + br label %while.hdr.102 +} + ; Function Attrs: nounwind define internal { ptr, i64 } @array_to_string__AR_3_Any([3 x { i64, i64 }] %0) #0 { entry: %alloca = alloca [3 x { i64, i64 }], align 8 store [3 x { i64, i64 }] %0, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 - store { ptr, i64 } { ptr @str.96, i64 1 }, ptr %allocaN, align 8 + store { ptr, i64 } { ptr @str.105, i64 1 }, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - br label %while.hdr.101 + br label %while.hdr.107 -while.hdr.101: ; preds = %if.merge.105, %entry +while.hdr.107: ; preds = %if.merge.111, %entry %load = load i64, ptr %allocaN, align 8 %icmp = icmp slt i64 %load, 3 - br i1 %icmp, label %while.body.102, label %while.exit.103 + br i1 %icmp, label %while.body.108, label %while.exit.109 -while.body.102: ; preds = %while.hdr.101 +while.body.108: ; preds = %while.hdr.107 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp sgt i64 %loadN, 0 - br i1 %icmpN, label %if.then.104, label %if.merge.105 + br i1 %icmpN, label %if.then.110, label %if.merge.111 -while.exit.103: ; preds = %while.hdr.101 +while.exit.109: ; preds = %while.hdr.107 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.97, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.106, i64 1 }) ret { ptr, i64 } %call -if.then.104: ; preds = %while.body.102 +if.then.110: ; preds = %while.body.108 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.98, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.107, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %if.merge.105 + br label %if.merge.111 -if.merge.105: ; preds = %if.then.104, %while.body.102 +if.merge.111: ; preds = %if.then.110, %while.body.108 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load [3 x { i64, i64 }], ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -2096,7 +2307,7 @@ if.merge.105: ; preds = %if.then.104, %while %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, 1 store i64 %add, ptr %allocaN, align 8 - br label %while.hdr.101 + br label %while.hdr.107 } ; Function Attrs: nounwind @@ -2105,35 +2316,35 @@ entry: %alloca = alloca { ptr, i64 }, align 8 store { ptr, i64 } %0, ptr %alloca, align 8 %allocaN = alloca { ptr, i64 }, align 8 - store { ptr, i64 } { ptr @str.99, i64 1 }, ptr %allocaN, align 8 + store { ptr, i64 } { ptr @str.108, i64 1 }, ptr %allocaN, align 8 %allocaN = alloca i64, align 8 store i64 0, ptr %allocaN, align 8 - br label %while.hdr.109 + br label %while.hdr.115 -while.hdr.109: ; preds = %if.merge.113, %entry +while.hdr.115: ; preds = %if.merge.119, %entry %load = load i64, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %alloca, align 8 %len = extractvalue { ptr, i64 } %loadN, 1 %icmp = icmp slt i64 %load, %len - br i1 %icmp, label %while.body.110, label %while.exit.111 + br i1 %icmp, label %while.body.116, label %while.exit.117 -while.body.110: ; preds = %while.hdr.109 +while.body.116: ; preds = %while.hdr.115 %loadN = load i64, ptr %allocaN, align 8 %icmpN = icmp sgt i64 %loadN, 0 - br i1 %icmpN, label %if.then.112, label %if.merge.113 + br i1 %icmpN, label %if.then.118, label %if.merge.119 -while.exit.111: ; preds = %while.hdr.109 +while.exit.117: ; preds = %while.hdr.115 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %call = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.100, i64 1 }) + %call = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.109, i64 1 }) ret { ptr, i64 } %call -if.then.112: ; preds = %while.body.110 +if.then.118: ; preds = %while.body.116 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 - %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.101, i64 2 }) + %callN = call { ptr, i64 } @concat({ ptr, i64 } %loadN, { ptr, i64 } { ptr @str.110, i64 2 }) store { ptr, i64 } %callN, ptr %allocaN, align 8 - br label %if.merge.113 + br label %if.merge.119 -if.merge.113: ; preds = %if.then.112, %while.body.110 +if.merge.119: ; preds = %if.then.118, %while.body.116 %loadN = load { ptr, i64 }, ptr %allocaN, align 8 %loadN = load { ptr, i64 }, ptr %alloca, align 8 %loadN = load i64, ptr %allocaN, align 8 @@ -2150,7 +2361,7 @@ if.merge.113: ; preds = %if.then.112, %while %loadN = load i64, ptr %allocaN, align 8 %add = add i64 %loadN, 1 store i64 %add, ptr %allocaN, align 8 - br label %while.hdr.109 + br label %while.hdr.115 } ; Function Attrs: nounwind @@ -2163,20 +2374,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.131, label %if.else.132 + br i1 %icmp, label %if.then.139, label %if.else.140 -if.then.131: ; preds = %entry - br label %if.merge.133 +if.then.139: ; preds = %entry + br label %if.merge.141 -if.else.132: ; preds = %entry +if.else.140: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.104, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.103, i64 5 }, { ptr, i64 } %callN) - br label %if.merge.133 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.113, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.112, i64 5 }, { ptr, i64 } %callN) + br label %if.merge.141 -if.merge.133: ; preds = %if.else.132, %if.then.131 - %bp = phi { ptr, i64 } [ { ptr @str.102, i64 4 }, %if.then.131 ], [ %callN, %if.else.132 ] +if.merge.141: ; preds = %if.else.140, %if.then.139 + %bp = phi { ptr, i64 } [ { ptr @str.111, i64 4 }, %if.then.139 ], [ %callN, %if.else.140 ] ret { ptr, i64 } %bp } @@ -2190,20 +2401,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.155, label %if.else.156 + br i1 %icmp, label %if.then.163, label %if.else.164 -if.then.155: ; preds = %entry - br label %if.merge.157 +if.then.163: ; preds = %entry + br label %if.merge.165 -if.else.156: ; preds = %entry +if.else.164: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.107, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.106, i64 4 }, { ptr, i64 } %callN) - br label %if.merge.157 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.116, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.115, i64 4 }, { ptr, i64 } %callN) + br label %if.merge.165 -if.merge.157: ; preds = %if.else.156, %if.then.155 - %bp = phi { ptr, i64 } [ { ptr @str.105, i64 4 }, %if.then.155 ], [ %callN, %if.else.156 ] +if.merge.165: ; preds = %if.else.164, %if.then.163 + %bp = phi { ptr, i64 } [ { ptr @str.114, i64 4 }, %if.then.163 ], [ %callN, %if.else.164 ] ret { ptr, i64 } %bp } @@ -2217,20 +2428,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.158, label %if.else.159 + br i1 %icmp, label %if.then.166, label %if.else.167 -if.then.158: ; preds = %entry - br label %if.merge.160 +if.then.166: ; preds = %entry + br label %if.merge.168 -if.else.159: ; preds = %entry +if.else.167: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.110, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.109, i64 11 }, { ptr, i64 } %callN) - br label %if.merge.160 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.119, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.118, i64 11 }, { ptr, i64 } %callN) + br label %if.merge.168 -if.merge.160: ; preds = %if.else.159, %if.then.158 - %bp = phi { ptr, i64 } [ { ptr @str.108, i64 4 }, %if.then.158 ], [ %callN, %if.else.159 ] +if.merge.168: ; preds = %if.else.167, %if.then.166 + %bp = phi { ptr, i64 } [ { ptr @str.117, i64 4 }, %if.then.166 ], [ %callN, %if.else.167 ] ret { ptr, i64 } %bp } @@ -2244,20 +2455,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.161, label %if.else.162 + br i1 %icmp, label %if.then.169, label %if.else.170 -if.then.161: ; preds = %entry - br label %if.merge.163 +if.then.169: ; preds = %entry + br label %if.merge.171 -if.else.162: ; preds = %entry +if.else.170: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.113, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.112, i64 6 }, { ptr, i64 } %callN) - br label %if.merge.163 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.122, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.121, i64 6 }, { ptr, i64 } %callN) + br label %if.merge.171 -if.merge.163: ; preds = %if.else.162, %if.then.161 - %bp = phi { ptr, i64 } [ { ptr @str.111, i64 4 }, %if.then.161 ], [ %callN, %if.else.162 ] +if.merge.171: ; preds = %if.else.170, %if.then.169 + %bp = phi { ptr, i64 } [ { ptr @str.120, i64 4 }, %if.then.169 ], [ %callN, %if.else.170 ] ret { ptr, i64 } %bp } @@ -2271,20 +2482,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.164, label %if.else.165 + br i1 %icmp, label %if.then.172, label %if.else.173 -if.then.164: ; preds = %entry - br label %if.merge.166 +if.then.172: ; preds = %entry + br label %if.merge.174 -if.else.165: ; preds = %entry +if.else.173: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.116, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.115, i64 5 }, { ptr, i64 } %callN) - br label %if.merge.166 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.125, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.124, i64 5 }, { ptr, i64 } %callN) + br label %if.merge.174 -if.merge.166: ; preds = %if.else.165, %if.then.164 - %bp = phi { ptr, i64 } [ { ptr @str.114, i64 4 }, %if.then.164 ], [ %callN, %if.else.165 ] +if.merge.174: ; preds = %if.else.173, %if.then.172 + %bp = phi { ptr, i64 } [ { ptr @str.123, i64 4 }, %if.then.172 ], [ %callN, %if.else.173 ] ret { ptr, i64 } %bp } @@ -2298,20 +2509,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.167, label %if.else.168 + br i1 %icmp, label %if.then.175, label %if.else.176 -if.then.167: ; preds = %entry - br label %if.merge.169 +if.then.175: ; preds = %entry + br label %if.merge.177 -if.else.168: ; preds = %entry +if.else.176: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.119, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.118, i64 9 }, { ptr, i64 } %callN) - br label %if.merge.169 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.128, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.127, i64 9 }, { ptr, i64 } %callN) + br label %if.merge.177 -if.merge.169: ; preds = %if.else.168, %if.then.167 - %bp = phi { ptr, i64 } [ { ptr @str.117, i64 4 }, %if.then.167 ], [ %callN, %if.else.168 ] +if.merge.177: ; preds = %if.else.176, %if.then.175 + %bp = phi { ptr, i64 } [ { ptr @str.126, i64 4 }, %if.then.175 ], [ %callN, %if.else.176 ] ret { ptr, i64 } %bp } @@ -2325,20 +2536,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.170, label %if.else.171 + br i1 %icmp, label %if.then.178, label %if.else.179 -if.then.170: ; preds = %entry - br label %if.merge.172 +if.then.178: ; preds = %entry + br label %if.merge.180 -if.else.171: ; preds = %entry +if.else.179: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.122, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.121, i64 5 }, { ptr, i64 } %callN) - br label %if.merge.172 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.131, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.130, i64 5 }, { ptr, i64 } %callN) + br label %if.merge.180 -if.merge.172: ; preds = %if.else.171, %if.then.170 - %bp = phi { ptr, i64 } [ { ptr @str.120, i64 4 }, %if.then.170 ], [ %callN, %if.else.171 ] +if.merge.180: ; preds = %if.else.179, %if.then.178 + %bp = phi { ptr, i64 } [ { ptr @str.129, i64 4 }, %if.then.178 ], [ %callN, %if.else.179 ] ret { ptr, i64 } %bp } @@ -2352,20 +2563,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.173, label %if.else.174 + br i1 %icmp, label %if.then.181, label %if.else.182 -if.then.173: ; preds = %entry - br label %if.merge.175 +if.then.181: ; preds = %entry + br label %if.merge.183 -if.else.174: ; preds = %entry +if.else.182: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.125, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.124, i64 4 }, { ptr, i64 } %callN) - br label %if.merge.175 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.134, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.133, i64 4 }, { ptr, i64 } %callN) + br label %if.merge.183 -if.merge.175: ; preds = %if.else.174, %if.then.173 - %bp = phi { ptr, i64 } [ { ptr @str.123, i64 4 }, %if.then.173 ], [ %callN, %if.else.174 ] +if.merge.183: ; preds = %if.else.182, %if.then.181 + %bp = phi { ptr, i64 } [ { ptr @str.132, i64 4 }, %if.then.181 ], [ %callN, %if.else.182 ] ret { ptr, i64 } %bp } @@ -2379,25 +2590,25 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.176, label %if.else.177 + br i1 %icmp, label %if.then.184, label %if.else.185 -if.then.176: ; preds = %entry - br label %if.merge.178 +if.then.184: ; preds = %entry + br label %if.merge.186 -if.else.177: ; preds = %entry +if.else.185: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.128, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.127, i64 6 }, { ptr, i64 } %callN) - br label %if.merge.178 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.137, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.136, i64 6 }, { ptr, i64 } %callN) + br label %if.merge.186 -if.merge.178: ; preds = %if.else.177, %if.then.176 - %bp = phi { ptr, i64 } [ { ptr @str.126, i64 4 }, %if.then.176 ], [ %callN, %if.else.177 ] +if.merge.186: ; preds = %if.else.185, %if.then.184 + %bp = phi { ptr, i64 } [ { ptr @str.135, i64 4 }, %if.then.184 ], [ %callN, %if.else.185 ] ret { ptr, i64 } %bp } ; Function Attrs: nounwind -define internal { ptr, i64 } @pointer_to_string__ptr_Triple(ptr %0) #0 { +define internal { ptr, i64 } @pointer_to_string__ptr_bool(ptr %0) #0 { entry: %alloca = alloca ptr, align 8 store ptr %0, ptr %alloca, align 8 @@ -2406,25 +2617,25 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.179, label %if.else.180 + br i1 %icmp, label %if.then.187, label %if.else.188 -if.then.179: ; preds = %entry - br label %if.merge.181 +if.then.187: ; preds = %entry + br label %if.merge.189 -if.else.180: ; preds = %entry +if.else.188: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.131, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.130, i64 7 }, { ptr, i64 } %callN) - br label %if.merge.181 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.140, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.139, i64 5 }, { ptr, i64 } %callN) + br label %if.merge.189 -if.merge.181: ; preds = %if.else.180, %if.then.179 - %bp = phi { ptr, i64 } [ { ptr @str.129, i64 4 }, %if.then.179 ], [ %callN, %if.else.180 ] +if.merge.189: ; preds = %if.else.188, %if.then.187 + %bp = phi { ptr, i64 } [ { ptr @str.138, i64 4 }, %if.then.187 ], [ %callN, %if.else.188 ] ret { ptr, i64 } %bp } ; Function Attrs: nounwind -define internal { ptr, i64 } @pointer_to_string__ptr_AR_3_Any(ptr %0) #0 { +define internal { ptr, i64 } @pointer_to_string__ptr_AR_1_Any(ptr %0) #0 { entry: %alloca = alloca ptr, align 8 store ptr %0, ptr %alloca, align 8 @@ -2433,20 +2644,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.182, label %if.else.183 + br i1 %icmp, label %if.then.190, label %if.else.191 -if.then.182: ; preds = %entry - br label %if.merge.184 +if.then.190: ; preds = %entry + br label %if.merge.192 -if.else.183: ; preds = %entry +if.else.191: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.134, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.133, i64 7 }, { ptr, i64 } %callN) - br label %if.merge.184 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.143, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.142, i64 7 }, { ptr, i64 } %callN) + br label %if.merge.192 -if.merge.184: ; preds = %if.else.183, %if.then.182 - %bp = phi { ptr, i64 } [ { ptr @str.132, i64 4 }, %if.then.182 ], [ %callN, %if.else.183 ] +if.merge.192: ; preds = %if.else.191, %if.then.190 + %bp = phi { ptr, i64 } [ { ptr @str.141, i64 4 }, %if.then.190 ], [ %callN, %if.else.191 ] ret { ptr, i64 } %bp } @@ -2460,20 +2671,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.185, label %if.else.186 + br i1 %icmp, label %if.then.193, label %if.else.194 -if.then.185: ; preds = %entry - br label %if.merge.187 +if.then.193: ; preds = %entry + br label %if.merge.195 -if.else.186: ; preds = %entry +if.else.194: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.137, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.136, i64 4 }, { ptr, i64 } %callN) - br label %if.merge.187 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.146, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.145, i64 4 }, { ptr, i64 } %callN) + br label %if.merge.195 -if.merge.187: ; preds = %if.else.186, %if.then.185 - %bp = phi { ptr, i64 } [ { ptr @str.135, i64 4 }, %if.then.185 ], [ %callN, %if.else.186 ] +if.merge.195: ; preds = %if.else.194, %if.then.193 + %bp = phi { ptr, i64 } [ { ptr @str.144, i64 4 }, %if.then.193 ], [ %callN, %if.else.194 ] ret { ptr, i64 } %bp } @@ -2487,20 +2698,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.188, label %if.else.189 + br i1 %icmp, label %if.then.196, label %if.else.197 -if.then.188: ; preds = %entry - br label %if.merge.190 +if.then.196: ; preds = %entry + br label %if.merge.198 -if.else.189: ; preds = %entry +if.else.197: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.140, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.139, i64 6 }, { ptr, i64 } %callN) - br label %if.merge.190 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.149, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.148, i64 6 }, { ptr, i64 } %callN) + br label %if.merge.198 -if.merge.190: ; preds = %if.else.189, %if.then.188 - %bp = phi { ptr, i64 } [ { ptr @str.138, i64 4 }, %if.then.188 ], [ %callN, %if.else.189 ] +if.merge.198: ; preds = %if.else.197, %if.then.196 + %bp = phi { ptr, i64 } [ { ptr @str.147, i64 4 }, %if.then.196 ], [ %callN, %if.else.197 ] ret { ptr, i64 } %bp } @@ -2514,20 +2725,20 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.191, label %if.else.192 + br i1 %icmp, label %if.then.199, label %if.else.200 -if.then.191: ; preds = %entry - br label %if.merge.193 +if.then.199: ; preds = %entry + br label %if.merge.201 -if.else.192: ; preds = %entry +if.else.200: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.143, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.142, i64 7 }, { ptr, i64 } %callN) - br label %if.merge.193 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.152, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.151, i64 7 }, { ptr, i64 } %callN) + br label %if.merge.201 -if.merge.193: ; preds = %if.else.192, %if.then.191 - %bp = phi { ptr, i64 } [ { ptr @str.141, i64 4 }, %if.then.191 ], [ %callN, %if.else.192 ] +if.merge.201: ; preds = %if.else.200, %if.then.199 + %bp = phi { ptr, i64 } [ { ptr @str.150, i64 4 }, %if.then.199 ], [ %callN, %if.else.200 ] ret { ptr, i64 } %bp } @@ -2541,29 +2752,79 @@ entry: store ptr %load, ptr %allocaN, align 8 %loadN = load i64, ptr %allocaN, align 8 %icmp = icmp eq i64 %loadN, 0 - br i1 %icmp, label %if.then.194, label %if.else.195 + br i1 %icmp, label %if.then.202, label %if.else.203 -if.then.194: ; preds = %entry - br label %if.merge.196 +if.then.202: ; preds = %entry + br label %if.merge.204 -if.else.195: ; preds = %entry +if.else.203: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.146, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.145, i64 3 }, { ptr, i64 } %callN) - br label %if.merge.196 + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.155, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.154, i64 3 }, { ptr, i64 } %callN) + br label %if.merge.204 -if.merge.196: ; preds = %if.else.195, %if.then.194 - %bp = phi { ptr, i64 } [ { ptr @str.144, i64 4 }, %if.then.194 ], [ %callN, %if.else.195 ] +if.merge.204: ; preds = %if.else.203, %if.then.202 + %bp = phi { ptr, i64 } [ { ptr @str.153, i64 4 }, %if.then.202 ], [ %callN, %if.else.203 ] ret { ptr, i64 } %bp } -declare ptr @objc_msgSend(ptr, ptr) +; Function Attrs: nounwind +define internal { ptr, i64 } @pointer_to_string__ptr_Triple(ptr %0) #0 { +entry: + %alloca = alloca ptr, align 8 + store ptr %0, ptr %alloca, align 8 + %allocaN = alloca i64, align 8 + %load = load ptr, ptr %alloca, align 8 + store ptr %load, ptr %allocaN, align 8 + %loadN = load i64, ptr %allocaN, align 8 + %icmp = icmp eq i64 %loadN, 0 + br i1 %icmp, label %if.then.205, label %if.else.206 + +if.then.205: ; preds = %entry + br label %if.merge.207 + +if.else.206: ; preds = %entry + %loadN = load i64, ptr %allocaN, align 8 + %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.158, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.157, i64 7 }, { ptr, i64 } %callN) + br label %if.merge.207 + +if.merge.207: ; preds = %if.else.206, %if.then.205 + %bp = phi { ptr, i64 } [ { ptr @str.156, i64 4 }, %if.then.205 ], [ %callN, %if.else.206 ] + ret { ptr, i64 } %bp +} + +; Function Attrs: nounwind +define internal { ptr, i64 } @pointer_to_string__ptr_AR_3_Any(ptr %0) #0 { +entry: + %alloca = alloca ptr, align 8 + store ptr %0, ptr %alloca, align 8 + %allocaN = alloca i64, align 8 + %load = load ptr, ptr %alloca, align 8 + store ptr %load, ptr %allocaN, align 8 + %loadN = load i64, ptr %allocaN, align 8 + %icmp = icmp eq i64 %loadN, 0 + br i1 %icmp, label %if.then.208, label %if.else.209 + +if.then.208: ; preds = %entry + br label %if.merge.210 + +if.else.209: ; preds = %entry + %loadN = load i64, ptr %allocaN, align 8 + %call = call { ptr, i64 } @int_to_hex_string(i64 %loadN) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.161, i64 3 }, { ptr, i64 } %call) + %callN = call { ptr, i64 } @concat({ ptr, i64 } { ptr @str.160, i64 7 }, { ptr, i64 } %callN) + br label %if.merge.210 + +if.merge.210: ; preds = %if.else.209, %if.then.208 + %bp = phi { ptr, i64 } [ { ptr @str.159, i64 4 }, %if.then.208 ], [ %callN, %if.else.209 ] + ret { ptr, i64 } %bp +} declare i64 @write(i32, ptr, i64) -declare ptr @sel_registerName(ptr) - define internal void @__sx_objc_selector_init() { entry: %sel = call ptr @sel_registerName(ptr @OBJC_METH_VAR_NAME_) diff --git a/tests/expected/ffi-objc-call-06-sret-return.txt b/tests/expected/ffi-objc-call-06-sret-return.txt index 8620621..1fae850 100644 --- a/tests/expected/ffi-objc-call-06-sret-return.txt +++ b/tests/expected/ffi-objc-call-06-sret-return.txt @@ -1 +1,2 @@ -triple = (0, 0, 0) +addMethod = true +triple = (11, 22, 33)