Luce / engineering
Learn Luce LuciaOS

The embedded standard library

Importing std.json loads an embedded .luc file into the program's module graph. The compiler checks that source with the application, keeps reachable functions, and sends them through MIR and LLVM.

Follow one standard-library call

This program imports std.strings and calls strings.join. Open the MIR tab and search for strings.join: it is an ordinary Luce function. Open assembly and the original module boundary may be gone because LLVM is free to inline it.

Compiler traceFollow one program through four representations
compiler build information

Luce source. Names and indentation describe the program for a reader.

open source file

import std.strings

func main(args: list[str]):
    let parts = ["luce", str(len(args))]
    print(strings.join(parts, "-"))

Luce MIR. Types, registers, blocks, calls, and lifetime operations form the instruction plan sent to the LLVM backend.

open MIR file
MIR instruction guide hover, focus, or tap dotted terms

r7 is one typed intermediate value, %2 is a local storage slot, and b1 is a basic block. Read each block from top to bottom, then follow its final control-flow instruction.

Hover or focus a dotted term in the file for its explanation. On a touch screen, tap a term to keep the note open and tap elsewhere to close it. The list includes the operations that appear in this file.

func …
Starts one MIR function and lists the source-level parameters with their resolved types.
local %N
Reserves a typed local slot. The slot gives later blocks a stable place to read or replace.
b0, b1, …
Names a basic block. Control enters at the label and runs until a branch, jump, trap, or return chooses what happens next.
r0, r1, …
Names one typed intermediate result. Each register is assigned once, which makes data flow explicit.
local_get
Reads a local slot into a fresh MIR register so this use has a precise value and type.
local_set
Writes a register into a local slot. Later blocks read that slot after control-flow paths join.
const
Creates a typed literal such as 2 or 10 inside the instruction stream.
add.i64
Adds two signed 64-bit integers. The type suffix selects the overflow and representation rules.
greater.i64
Compares two signed 64-bit values and produces a Boolean register for a later branch.
less.i64
Tests signed less-than and produces a Boolean register.
intrinsic NAME
Invokes a language operation with runtime rules recorded by the compiler. The name identifies the operation.
intrinsic len
Reads the logical length defined by the value's type, such as argument count or Unicode-scalar count.
intrinsic str_value
Converts a typed value into owned text through Luce's string conversion rules.
intrinsic print
Sends text through the installed host output capability.
intrinsic append_value
Appends a value to a list and applies the element's ownership rule during storage.
intrinsic index_get
Checks an index and loads the selected element using the collection's value representation.
intrinsic release
Removes one strong owner and runs destruction when the count reaches zero.
intrinsic own_storage
Turns temporary storage into an owned value that can safely outlive the current expression.
intrinsic drop_storage
Releases any reference held by a temporary value and leaves that temporary in its empty state.
intrinsic export_storage
Moves owned temporary storage across a return boundary so the caller receives responsibility for releasing it.
call NAME
Calls a resolved function directly. MIR already knows the target and argument order.
heap_new
Allocates a runtime object row for a class or other reference-backed value.
branch CONDITION, TRUE, FALSE
Chooses one of two basic blocks from a Boolean register.
jump BLOCK
Continues execution at one known basic block.
ret
Returns the current function's result to its caller and closes the current control-flow path.

func main(args: list[str]) -> None
    local %1 (temporary): str
    local %2 (temporary): list[str]
    local %3 parts: list[str]
    local %4 (temporary): str
  b0:
    r0 = const data#0
    r1 = local_get %0
    r2 = intrinsic len, r1
    r3 = intrinsic str_value, r2
    r4 = heap_new list[str]
    r5 = intrinsic own_storage, r0
    intrinsic append_value, r4, r5
    intrinsic append_value, r4, r3
    local_set %3, r4
    r9 = local_get %3
    r10 = const data#1
    r11 = call strings.join, r9, r10
    local_set %4, r11
    intrinsic print, r11
    r14 = local_get %4
    r15 = intrinsic drop_storage, r14
    local_set %4, r15
    r17 = local_get %3
    intrinsic release, r17
    ret
func strings.join(parts: list[str], separator: str) -> str
    local %2 (temporary): builder
    local %3 out: builder
    local %4 (temporary): list[str]
    local %5 (temporary): i64
    local %6 i: i64
    local %7 piece: str
    local %8 (temporary): str
  b0:
    r0 = heap_new builder
    local_set %3, r0
    r2 = local_get %0
    local_set %4, r2
    r4 = const 0
    local_set %5, r4
    jump b1
  b1:
    r7 = local_get %4
    r8 = intrinsic len, r7
    r9 = local_get %5
    r10 = less.i64 r9, r8
    branch r10, b2, b4
  b2:
    r12 = local_get %5
    local_set %6, r12
    r14 = local_get %4
    r15 = local_get %5
    r16 = intrinsic index_get, r14, r15
    r17 = local_get %7
    r18 = intrinsic drop_storage, r17
    local_set %7, r18
    r20 = intrinsic own_storage, r16
    local_set %7, r20
    r22 = local_get %6
    r23 = const 0
    r24 = greater.i64 r22, r23
    branch r24, b5, b6
  b3:
    r34 = local_get %5
    r35 = const 1
    r36 = add.i64 r34, r35
    local_set %5, r36
    jump b1
  b4:
    r39 = local_get %7
    r40 = intrinsic drop_storage, r39
    local_set %7, r40
    r42 = local_get %3
    r43 = intrinsic str_value, r42
    r44 = intrinsic export_storage, r43
    r45 = local_get %3
    intrinsic release, r45
    ret r44
  b5:
    r26 = local_get %3
    r27 = local_get %1
    intrinsic append_value, r26, r27
    jump b6
  b6:
    r30 = local_get %3
    r31 = local_get %7
    intrinsic append_value, r30, r31
    jump b3

LLVM IR. The backend expands MIR into typed memory operations, calls, checks, and control-flow blocks for LLVM.

open LLVM IR file
LLVM IR instruction guide hover, focus, or tap dotted terms

%7 is an SSA value, i64 is a 64-bit integer type, ptr is a pointer, and @name is a module symbol. Numbered labels divide the function into basic blocks.

Hover or focus a dotted term in the file for its explanation. On a touch screen, tap a term to keep the note open and tap elsewhere to close it. The list includes the operations that appear in this file.

@name = …
Defines module data such as text constants, source positions, function records, and the artifact identity tag.
define … @name
Begins a generated function. The parameter attributes tell LLVM which pointers are valid, writable, or read-only.
declare … @name
Declares a runtime or LLVM helper whose body is provided elsewhere.
numeric label
Starts an LLVM basic block. Every branch names one of these labels as its destination.
%0, %1, …
Names an SSA value. Each name is assigned once, allowing LLVM to trace definitions and uses directly.
alloca
Reserves a stack slot for a local value, return area, or temporary aggregate.
getelementptr
Calculates the address of a field or indexed element while preserving LLVM's type and bounds information.
load
Copies a typed value from memory into an SSA value.
store
Copies an SSA value into a stack slot, object field, return area, or runtime structure.
icmp
Compares integers or pointers and produces the one-bit condition consumed by a branch or select.
br
Transfers control to another block. With an i1 operand it chooses between two destinations.
select
Chooses one of two SSA values from a condition, which can become a branch-free machine instruction.
call
Invokes a generated function, a runtime helper, a host callback, or an LLVM intrinsic.
extractvalue
Reads one field from an SSA aggregate, such as the result and overflow bit returned together.
insertvalue
Builds an SSA aggregate one field at a time.
ptrtoint
Encodes a pointer as an integer field inside Luce's uniform runtime value representation.
inttoptr
Recovers a pointer from the integer field of Luce's uniform runtime value representation.
zext
Widens an unsigned value by filling the new high bits with zero.
trunc
Keeps the low bits while converting to a narrower integer representation.
lshr
Shifts bits right and fills the high side with zero; this is useful for unpacking handle fields.
and
Combines or masks bits, often to inspect a flag in a packed handle or status value.
or
Sets or combines bits in a packed value.
add
Adds integer values or address-related offsets under the flags attached to the instruction.
sub
Subtracts integer values; the generated entry code also uses it to update the call-depth budget.
mul
Multiplies integers after the language-specific checks have been represented.
ret
Returns a status or value and ends the current basic block.
@llvm.sadd.with.overflow.i64
Returns a signed sum together with the overflow bit required by checked addition.
@llvm.memcpy.inline
Copies a small fixed-size value representation; LLVM can expand it directly for the target.
@luce_rt_open
Creates the per-run runtime state and installs the table used to turn function numbers into source-aware traces.
@luce_rt_close
Closes the per-run runtime state after the final status and reports have been collected.
@luce_rt_args_list
Builds the owned list[str] passed to main from the host's argument callbacks.
@luce_rt_status
Combines the generated function result with runtime trap, error, exhaustion, and exit state.
@luce_rt_report_error
Sends an uncaught recoverable error through the host's error-report callback.
@luce_rt_report
Sends the completed trap report through the host callback selected by the entry wrapper.
@luce_rt_leaked
Reads the live-object count used to detect references that remain after program cleanup.
@luce_rt_exhaust
Records allocation exhaustion in the current run so the entry wrapper returns the corresponding status.
@luce_rt_raise
Records a source-aware trap in the runtime so every execution path reports the same code and location.
@luce_rt_unwound
Adds one generated function frame while a trap or uncaught error travels toward the entry point.
@luce_rt_release
Removes a strong owner and triggers destruction at zero.
@luce_rt_own_storage
Turns temporary storage into an owned runtime value for a destination or result.
@luce_rt_export_storage
Transfers owned storage from a callee's temporary into its result value.
@luce_rt_drop_storage
Releases reference-bearing fields in a temporary runtime value.
@luce_rt_str
Converts a uniform runtime value into owned UTF-8 text.
@luce_rt_append
Appends an element through the runtime's list or builder storage and ownership rules.
@luce_rt_new_list
Allocates the runtime object that owns a list buffer.
@luce_rt_new_builder
Allocates the runtime object used for mutable text accumulation.
@luce_rt_files_install
Copies file-related callbacks from the host table into the current runtime context.
@luce_rt_sockets_install
Copies network callbacks from the host table into the current runtime context.
@luce_rt_graphics_install
Copies window and graphics callbacks from the host table into the current runtime context.
!prof
Attaches branch-probability metadata so LLVM can place common and failure paths efficiently.

; ModuleID = '/Users/sedov/Dev/luciaos/www/lucelang/examples/standard.luc'
source_filename = "/Users/sedov/Dev/luciaos/www/lucelang/examples/standard.luc"
target triple = "arm64-apple-darwin24.6.0"

@luce.text.0 = private unnamed_addr constant [0 x i8] zeroinitializer
@luce.text.1 = private unnamed_addr constant [4 x i8] c"luce"
@luce.text.2 = private unnamed_addr constant [21 x i8] c"null object reference"
@luce.text.3 = private unnamed_addr constant [22 x i8] c"object used after free"
@luce.text.4 = private unnamed_addr constant [1 x i8] c"-"
@luce.text.5 = private unnamed_addr constant [19 x i8] c"call depth exceeded"
@luce.text.6 = private unnamed_addr constant [24 x i8] c"host service unavailable"
@luce.text.7 = private unnamed_addr constant [19 x i8] c"index out of bounds"
@luce.text.8 = private unnamed_addr constant [16 x i8] c"integer overflow"
@luce.text.9 = private unnamed_addr constant [4 x i8] c"main"
@luce.text.10 = private unnamed_addr constant [59 x i8] c"/Users/sedov/Dev/luciaos/www/lucelang/examples/standard.luc"
@luce.origins.0 = private constant [20 x { i32, i32 }] [{ i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 4, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }, { i32, i32 } { i32 5, i32 5 }]
@luce.text.11 = private unnamed_addr constant [12 x i8] c"strings.join"
@luce.text.12 = private unnamed_addr constant [15 x i8] c"std/strings.luc"
@luce.origins.1 = private constant [48 x { i32, i32 }] [{ i32, i32 } { i32 182, i32 5 }, { i32, i32 } { i32 182, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 183, i32 5 }, { i32, i32 } { i32 184, i32 9 }, { i32, i32 } { i32 184, i32 9 }, { i32, i32 } { i32 184, i32 9 }, { i32, i32 } { i32 184, i32 9 }, { i32, i32 } { i32 185, i32 13 }, { i32, i32 } { i32 185, i32 13 }, { i32, i32 } { i32 185, i32 13 }, { i32, i32 } { i32 185, i32 13 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 186, i32 9 }, { i32, i32 } { i32 187, i32 5 }, { i32, i32 } { i32 187, i32 5 }, { i32, i32 } { i32 187, i32 5 }, { i32, i32 } { i32 187, i32 5 }, { i32, i32 } { i32 187, i32 5 }, { i32, i32 } { i32 187, i32 5 }]
@luce.functions = private constant [2 x { ptr, i64, ptr, i64, ptr, i64 }] [{ ptr, i64, ptr, i64, ptr, i64 } { ptr @luce.text.9, i64 4, ptr @luce.text.10, i64 59, ptr @luce.origins.0, i64 20 }, { ptr, i64, ptr, i64, ptr, i64 } { ptr @luce.text.11, i64 12, ptr @luce.text.12, i64 15, ptr @luce.origins.1, i64 48 }]
@luce_artifact = constant { i64, i64, i64, i32, i32, i32, i32, { i32, [52 x i8] } } { i64 23734338332087628, i64 0, i64 -7092229304759745108, i32 3, i32 29, i32 1, i32 0, { i32, [52 x i8] } { i32 18, [52 x i8] c"aarch64-macos-none\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" } }

define internal i32 @luce.0.main(ptr align 8 nocapture readonly nonnull dereferenceable(472) noundef %0, ptr align 8 nocapture nonnull noundef %1, i64 noundef %2, i64 %3) {
4:
  %5 = alloca i64, align 8
  %6 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  store i64 %3, ptr %5, align 8
  %10 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %6, i32 0, i32 0
  store i8 4, ptr %10, align 1
  %11 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %6, i32 0, i32 1
  store i8 -1, ptr %11, align 1
  %12 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 0
  %13 = ptrtoint ptr %12 to i64
  %14 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %6, i32 0, i32 3
  store i64 %13, ptr %14, align 8
  %15 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 1
  %16 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %6, i32 0, i32 4
  store i64 %15, ptr %16, align 8
  store i64 4294967295, ptr %7, align 8
  store i64 4294967295, ptr %8, align 8
  %17 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 0
  store i8 4, ptr %17, align 1
  %18 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 1
  store i8 -1, ptr %18, align 1
  %19 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 0
  %20 = ptrtoint ptr %19 to i64
  %21 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 3
  store i64 %20, ptr %21, align 8
  %22 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 1
  %23 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 4
  store i64 %22, ptr %23, align 8
  %24 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %25 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %24, i32 0, i32 0
  store i8 2, ptr %25, align 1
  %26 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %24, i32 0, i32 4
  store i64 0, ptr %26, align 8
  %27 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %28 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %29 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %28, i32 0, i32 0
  store i8 4, ptr %29, align 1
  %30 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %28, i32 0, i32 1
  store i8 -1, ptr %30, align 1
  %31 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %32 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %33 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 0
  store i8 4, ptr %33, align 1
  %34 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 1
  store i8 -1, ptr %34, align 1
  %35 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %36 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %37 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 0
  store i8 6, ptr %37, align 1
  %38 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 4
  store i64 0, ptr %38, align 8
  %39 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %40 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %39, i32 0, i32 0
  store i8 6, ptr %40, align 1
  %41 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %39, i32 0, i32 4
  store i64 0, ptr %41, align 8
  %42 = sub nsw i64 %2, 1
  %43 = alloca { ptr, i64 }, align 8
  %44 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %45 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %46 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %45, i32 0, i32 0
  store i8 6, ptr %46, align 1
  %47 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %45, i32 0, i32 4
  store i64 0, ptr %47, align 8
  br label %48

48:
  %49 = load i64, ptr %5, align 8
  %50 = trunc i64 %49 to i32
  %51 = lshr i64 %49, 32
  %52 = trunc i64 %51 to i32
  %53 = icmp eq i32 %50, -1
  br i1 %53, label %54, label %57, !prof !0

54:
  %55 = extractvalue { ptr, i64 } { ptr @luce.text.2, i64 21 }, 0
  %56 = extractvalue { ptr, i64 } { ptr @luce.text.2, i64 21 }, 1
  call void @luce_rt_raise(ptr %1, i32 14, ptr %55, i64 %56)
  call void @luce_rt_unwound(ptr %1, i32 0, i32 2)
  ret i32 1

57:
  %58 = getelementptr inbounds i8, ptr %1, i64 96
  %59 = load ptr, ptr %58, align 8!alias.scope !1, !noalias !2
  %60 = zext i32 %50 to i64
  %61 = mul nsw i64 %60, 112
  %62 = getelementptr inbounds i8, ptr %59, i64 %61
  %63 = getelementptr inbounds i8, ptr %62, i64 96
  %64 = load i32, ptr %63, align 4, !alias.scope !1, !noalias !2
  %65 = icmp ne i32 %64, %52
  br i1 %65, label %66, label %69, !prof !0

66:
  %67 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 0
  %68 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 1
  call void @luce_rt_raise(ptr %1, i32 13, ptr %67, i64 %68)
  call void @luce_rt_unwound(ptr %1, i32 0, i32 2)
  ret i32 1

69:
  %70 = and i32 %64, 1
  %71 = icmp ne i32 %70, 0
  br i1 %71, label %72, label %75, !prof !0

72:
  %73 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 0
  %74 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 1
  call void @luce_rt_raise(ptr %1, i32 13, ptr %73, i64 %74)
  call void @luce_rt_unwound(ptr %1, i32 0, i32 2)
  ret i32 1

75:
  %76 = getelementptr inbounds i8, ptr %62, i64 16
  %77 = load i64, ptr %76, align 8!alias.scope !1, !noalias !2
  %78 = load ptr, ptr %62, align 8, !alias.scope !1, !noalias !2
  %79 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %24, i32 0, i32 3
  store i64 %77, ptr %79, align 8
  %80 = call i32 @luce_rt_str(ptr %1, ptr %24, ptr %27)
  %81 = icmp ne i32 %80, 0
  br i1 %81, label %82, label %83, !prof !0

82:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 3)
  ret i32 1

83:
  %84 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %27, i32 0, i32 3
  %85 = load i64, ptr %84, align 8
  %86 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %27, i32 0, i32 1
  %87 = load i8, ptr %86, align 1
  %88 = icmp eq i8 %87, -1
  %89 = inttoptr i64 %85 to ptr
  %90 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %27, i32 0, i32 2
  %91 = select i1 %88, ptr %89, ptr %90
  %92 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %27, i32 0, i32 4
  %93 = load i64, ptr %92, align 8
  %94 = zext i8 %87 to i64
  %95 = select i1 %88, i64 %93, i64 %94
  %96 = insertvalue { ptr, i64 } poison, ptr %91, 0
  %97 = insertvalue { ptr, i64 } %96, i64 %95, 1
  %98 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 0
  %99 = ptrtoint ptr %98 to i64
  %100 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %28, i32 0, i32 3
  store i64 %99, ptr %100, align 8
  %101 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 1
  %102 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %28, i32 0, i32 4
  store i64 %101, ptr %102, align 8
  %103 = call i32 @luce_rt_new_list(ptr %1, ptr %28, ptr %31)
  %104 = icmp ne i32 %103, 0
  br i1 %104, label %105, label %106, !prof !0

105:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 4)
  ret i32 1

106:
  %107 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %31, i32 0, i32 3
  %108 = load i64, ptr %107, align 8
  %109 = extractvalue { ptr, i64 } { ptr @luce.text.1, i64 4 }, 0
  %110 = ptrtoint ptr %109 to i64
  %111 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 3
  store i64 %110, ptr %111, align 8
  %112 = extractvalue { ptr, i64 } { ptr @luce.text.1, i64 4 }, 1
  %113 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 4
  store i64 %112, ptr %113, align 8
  %114 = call i32 @luce_rt_own_storage(ptr %1, ptr %32, ptr %35)
  %115 = icmp ne i32 %114, 0
  br i1 %115, label %116, label %117, !prof !0

116:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 5)
  ret i32 1

117:
  %118 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 3
  %119 = load i64, ptr %118, align 8
  %120 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 1
  %121 = load i8, ptr %120, align 1
  %122 = icmp eq i8 %121, -1
  %123 = inttoptr i64 %119 to ptr
  %124 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 2
  %125 = select i1 %122, ptr %123, ptr %124
  %126 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 4
  %127 = load i64, ptr %126, align 8
  %128 = zext i8 %121 to i64
  %129 = select i1 %122, i64 %127, i64 %128
  %130 = insertvalue { ptr, i64 } poison, ptr %125, 0
  %131 = insertvalue { ptr, i64 } %130, i64 %129, 1
  %132 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 3
  store i64 %108, ptr %132, align 8
  %133 = call i32 @luce_rt_append(ptr %1, ptr %36, ptr %35)
  %134 = icmp ne i32 %133, 0
  br i1 %134, label %135, label %136, !prof !0

135:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 6)
  ret i32 1

136:
  %137 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %39, i32 0, i32 3
  store i64 %108, ptr %137, align 8
  %138 = call i32 @luce_rt_append(ptr %1, ptr %39, ptr %27)
  %139 = icmp ne i32 %138, 0
  br i1 %139, label %140, label %141, !prof !0

140:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 7)
  ret i32 1

141:
  store i64 %108, ptr %8, align 8
  %142 = load i64, ptr %8, align 8
  %143 = icmp slt i64 %42, 1
  br i1 %143, label %144, label %147, !prof !0

144:
  %145 = extractvalue { ptr, i64 } { ptr @luce.text.5, i64 19 }, 0
  %146 = extractvalue { ptr, i64 } { ptr @luce.text.5, i64 19 }, 1
  call void @luce_rt_raise(ptr %1, i32 6, ptr %145, i64 %146)
  call void @luce_rt_unwound(ptr %1, i32 0, i32 11)
  ret i32 1

147:
  %148 = call i32 @luce.1.strings.join(ptr %0, ptr %1, i64 %42, i64 %142, { ptr, i64 } { ptr @luce.text.4, i64 1 }, ptr %43)
  %149 = icmp ne i32 %148, 0
  br i1 %149, label %150, label %151, !prof !0

150:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 11)
  ret i32 1

151:
  %152 = load { ptr, i64 }, ptr %43, align 8
  %153 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 0
  store i8 4, ptr %153, align 1
  %154 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 1
  store i8 -1, ptr %154, align 1
  %155 = extractvalue { ptr, i64 } %152, 0
  %156 = ptrtoint ptr %155 to i64
  %157 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 3
  store i64 %156, ptr %157, align 8
  %158 = extractvalue { ptr, i64 } %152, 1
  %159 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 4
  store i64 %158, ptr %159, align 8
  %160 = extractvalue { ptr, i64 } %152, 0
  %161 = extractvalue { ptr, i64 } %152, 1
  %162 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 1
  %163 = load ptr, ptr %162, align 8
  %164 = icmp eq ptr %163, null
  br i1 %164, label %165, label %168, !prof !0

165:
  %166 = extractvalue { ptr, i64 } { ptr @luce.text.6, i64 24 }, 0
  %167 = extractvalue { ptr, i64 } { ptr @luce.text.6, i64 24 }, 1
  call void @luce_rt_raise(ptr %1, i32 9, ptr %166, i64 %167)
  call void @luce_rt_unwound(ptr %1, i32 0, i32 13)
  ret i32 1

168:
  %169 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 0
  %170 = load ptr, ptr %169, align 8
  %171 = call i32 %163(ptr %170, ptr %160, i64 %161)
  %172 = icmp eq i32 %171, -1
  br i1 %172, label %173, label %174, !prof !0

173:
  call void @luce_rt_exhaust(ptr %1)
  ret i32 1

174:
  %175 = icmp ne i32 %171, 0
  %176 = icmp ne i32 %171, 1
  %177 = and i1 %175, %176
  br i1 %177, label %178, label %181, !prof !0

178:
  %179 = extractvalue { ptr, i64 } { ptr @luce.text.6, i64 24 }, 0
  %180 = extractvalue { ptr, i64 } { ptr @luce.text.6, i64 24 }, 1
  call void @luce_rt_raise(ptr %1, i32 9, ptr %179, i64 %180)
  call void @luce_rt_unwound(ptr %1, i32 0, i32 13)
  ret i32 1

181:
  %182 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 3
  %183 = load i64, ptr %182, align 8
  %184 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 1
  %185 = load i8, ptr %184, align 1
  %186 = icmp eq i8 %185, -1
  %187 = inttoptr i64 %183 to ptr
  %188 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 2
  %189 = select i1 %186, ptr %187, ptr %188
  %190 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %9, i32 0, i32 4
  %191 = load i64, ptr %190, align 8
  %192 = zext i8 %185 to i64
  %193 = select i1 %186, i64 %191, i64 %192
  %194 = insertvalue { ptr, i64 } poison, ptr %189, 0
  %195 = insertvalue { ptr, i64 } %194, i64 %193, 1
  call void @luce_rt_drop_storage(ptr %1, ptr %9, ptr %44)
  %196 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %44, i32 0, i32 3
  %197 = load i64, ptr %196, align 8
  %198 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %44, i32 0, i32 1
  %199 = load i8, ptr %198, align 1
  %200 = icmp eq i8 %199, -1
  %201 = inttoptr i64 %197 to ptr
  %202 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %44, i32 0, i32 2
  %203 = select i1 %200, ptr %201, ptr %202
  %204 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %44, i32 0, i32 4
  %205 = load i64, ptr %204, align 8
  %206 = zext i8 %199 to i64
  %207 = select i1 %200, i64 %205, i64 %206
  %208 = insertvalue { ptr, i64 } poison, ptr %203, 0
  %209 = insertvalue { ptr, i64 } %208, i64 %207, 1
  call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %9, ptr align 8 %44, i64 24, i1 false)
  %210 = load i64, ptr %8, align 8
  %211 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %45, i32 0, i32 3
  store i64 %210, ptr %211, align 8
  %212 = call i32 @luce_rt_release(ptr %1, ptr %45)
  %213 = icmp ne i32 %212, 0
  br i1 %213, label %214, label %215, !prof !0

214:
  call void @luce_rt_unwound(ptr %1, i32 0, i32 18)
  ret i32 1

215:
  ret i32 0
}

define internal i32 @luce.1.strings.join(ptr align 8 nocapture readonly nonnull dereferenceable(472) noundef %0, ptr align 8 nocapture nonnull noundef %1, i64 noundef %2, i64 %3, { ptr, i64 } %4, ptr align 8 nocapture nonnull dereferenceable(16) writeonly noundef %5) {
6:
  %7 = alloca i64, align 8
  %8 = alloca { ptr, i64 }, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i64, align 8
  %14 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %15 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  store i64 %3, ptr %7, align 8
  store { ptr, i64 } %4, ptr %8, align 8
  store i64 4294967295, ptr %9, align 8
  store i64 4294967295, ptr %10, align 8
  store i64 4294967295, ptr %11, align 8
  store i64 0, ptr %12, align 8
  store i64 0, ptr %13, align 8
  %16 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 0
  store i8 4, ptr %16, align 1
  %17 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 1
  store i8 -1, ptr %17, align 1
  %18 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 0
  %19 = ptrtoint ptr %18 to i64
  %20 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 3
  store i64 %19, ptr %20, align 8
  %21 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 1
  %22 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 4
  store i64 %21, ptr %22, align 8
  %23 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %15, i32 0, i32 0
  store i8 4, ptr %23, align 1
  %24 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %15, i32 0, i32 1
  store i8 -1, ptr %24, align 1
  %25 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 0
  %26 = ptrtoint ptr %25 to i64
  %27 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %15, i32 0, i32 3
  store i64 %26, ptr %27, align 8
  %28 = extractvalue { ptr, i64 } { ptr @luce.text.0, i64 0 }, 1
  %29 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %15, i32 0, i32 4
  store i64 %28, ptr %29, align 8
  %30 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %31 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %32 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %33 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 0
  store i8 4, ptr %33, align 1
  %34 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 1
  store i8 -1, ptr %34, align 1
  %35 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %36 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %37 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %38 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %37, i32 0, i32 0
  store i8 6, ptr %38, align 1
  %39 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %37, i32 0, i32 4
  store i64 0, ptr %39, align 8
  %40 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %41 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %42 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %43 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %42, i32 0, i32 0
  store i8 6, ptr %43, align 1
  %44 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %42, i32 0, i32 4
  store i64 0, ptr %44, align 8
  %45 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %46 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %45, i32 0, i32 0
  store i8 6, ptr %46, align 1
  %47 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %45, i32 0, i32 4
  store i64 0, ptr %47, align 8
  %48 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %49 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %48, i32 0, i32 0
  store i8 4, ptr %49, align 1
  %50 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %48, i32 0, i32 1
  store i8 -1, ptr %50, align 1
  %51 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %52 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %51, i32 0, i32 0
  store i8 6, ptr %52, align 1
  %53 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %51, i32 0, i32 4
  store i64 0, ptr %53, align 8
  br label %54

54:
  %55 = call i32 @luce_rt_new_builder(ptr %1, ptr %30)
  %56 = icmp ne i32 %55, 0
  br i1 %56, label %139, label %140, !prof !0

57:
  %58 = load i64, ptr %11, align 8
  %59 = trunc i64 %58 to i32
  %60 = lshr i64 %58, 32
  %61 = trunc i64 %60 to i32
  %62 = icmp eq i32 %59, -1
  br i1 %62, label %144, label %147, !prof !0

63:
  %64 = load i64, ptr %12, align 8
  store i64 %64, ptr %13, align 8
  %65 = load i64, ptr %11, align 8
  %66 = load i64, ptr %12, align 8
  %67 = trunc i64 %65 to i32
  %68 = lshr i64 %65, 32
  %69 = trunc i64 %68 to i32
  %70 = icmp eq i32 %67, -1
  br i1 %70, label %171, label %174, !prof !0

71:
  %72 = load i64, ptr %12, align 8
  %73 = call { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %72, i64 1)
  %74 = extractvalue { i64, i1 } %73, 0
  %75 = extractvalue { i64, i1 } %73, 1
  br i1 %75, label %273, label %276, !prof !0

76:
  %77 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 3
  %78 = load i64, ptr %77, align 8
  %79 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 1
  %80 = load i8, ptr %79, align 1
  %81 = icmp eq i8 %80, -1
  %82 = inttoptr i64 %78 to ptr
  %83 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 2
  %84 = select i1 %81, ptr %82, ptr %83
  %85 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 4
  %86 = load i64, ptr %85, align 8
  %87 = zext i8 %80 to i64
  %88 = select i1 %81, i64 %86, i64 %87
  %89 = insertvalue { ptr, i64 } poison, ptr %84, 0
  %90 = insertvalue { ptr, i64 } %89, i64 %88, 1
  call void @luce_rt_drop_storage(ptr %1, ptr %14, ptr %36)
  %91 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 3
  %92 = load i64, ptr %91, align 8
  %93 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 1
  %94 = load i8, ptr %93, align 1
  %95 = icmp eq i8 %94, -1
  %96 = inttoptr i64 %92 to ptr
  %97 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 2
  %98 = select i1 %95, ptr %96, ptr %97
  %99 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %36, i32 0, i32 4
  %100 = load i64, ptr %99, align 8
  %101 = zext i8 %94 to i64
  %102 = select i1 %95, i64 %100, i64 %101
  %103 = insertvalue { ptr, i64 } poison, ptr %98, 0
  %104 = insertvalue { ptr, i64 } %103, i64 %102, 1
  call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %14, ptr align 8 %36, i64 24, i1 false)
  %105 = load i64, ptr %10, align 8
  %106 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %37, i32 0, i32 3
  store i64 %105, ptr %106, align 8
  %107 = call i32 @luce_rt_str(ptr %1, ptr %37, ptr %40)
  %108 = icmp ne i32 %107, 0
  br i1 %108, label %277, label %278, !prof !0

109:
  %110 = load i64, ptr %10, align 8
  %111 = load { ptr, i64 }, ptr %8, align 8
  %112 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %45, i32 0, i32 3
  store i64 %110, ptr %112, align 8
  %113 = extractvalue { ptr, i64 } %111, 0
  %114 = ptrtoint ptr %113 to i64
  %115 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %48, i32 0, i32 3
  store i64 %114, ptr %115, align 8
  %116 = extractvalue { ptr, i64 } %111, 1
  %117 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %48, i32 0, i32 4
  store i64 %116, ptr %117, align 8
  %118 = call i32 @luce_rt_append(ptr %1, ptr %45, ptr %48)
  %119 = icmp ne i32 %118, 0
  br i1 %119, label %317, label %318, !prof !0

120:
  %121 = load i64, ptr %10, align 8
  %122 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 3
  %123 = load i64, ptr %122, align 8
  %124 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 1
  %125 = load i8, ptr %124, align 1
  %126 = icmp eq i8 %125, -1
  %127 = inttoptr i64 %123 to ptr
  %128 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 2
  %129 = select i1 %126, ptr %127, ptr %128
  %130 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 4
  %131 = load i64, ptr %130, align 8
  %132 = zext i8 %125 to i64
  %133 = select i1 %126, i64 %131, i64 %132
  %134 = insertvalue { ptr, i64 } poison, ptr %129, 0
  %135 = insertvalue { ptr, i64 } %134, i64 %133, 1
  %136 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %51, i32 0, i32 3
  store i64 %121, ptr %136, align 8
  %137 = call i32 @luce_rt_append(ptr %1, ptr %51, ptr %14)
  %138 = icmp ne i32 %137, 0
  br i1 %138, label %319, label %320, !prof !0

139:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 0)
  ret i32 1

140:
  %141 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %30, i32 0, i32 3
  %142 = load i64, ptr %141, align 8
  store i64 %142, ptr %10, align 8
  %143 = load i64, ptr %7, align 8
  store i64 %143, ptr %11, align 8
  store i64 0, ptr %12, align 8
  br label %57

144:
  %145 = extractvalue { ptr, i64 } { ptr @luce.text.2, i64 21 }, 0
  %146 = extractvalue { ptr, i64 } { ptr @luce.text.2, i64 21 }, 1
  call void @luce_rt_raise(ptr %1, i32 14, ptr %145, i64 %146)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 8)
  ret i32 1

147:
  %148 = getelementptr inbounds i8, ptr %1, i64 96
  %149 = load ptr, ptr %148, align 8!alias.scope !1, !noalias !2
  %150 = zext i32 %59 to i64
  %151 = mul nsw i64 %150, 112
  %152 = getelementptr inbounds i8, ptr %149, i64 %151
  %153 = getelementptr inbounds i8, ptr %152, i64 96
  %154 = load i32, ptr %153, align 4, !alias.scope !1, !noalias !2
  %155 = icmp ne i32 %154, %61
  br i1 %155, label %156, label %159, !prof !0

156:
  %157 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 0
  %158 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 1
  call void @luce_rt_raise(ptr %1, i32 13, ptr %157, i64 %158)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 8)
  ret i32 1

159:
  %160 = and i32 %154, 1
  %161 = icmp ne i32 %160, 0
  br i1 %161, label %162, label %165, !prof !0

162:
  %163 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 0
  %164 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 1
  call void @luce_rt_raise(ptr %1, i32 13, ptr %163, i64 %164)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 8)
  ret i32 1

165:
  %166 = getelementptr inbounds i8, ptr %152, i64 16
  %167 = load i64, ptr %166, align 8!alias.scope !1, !noalias !2
  %168 = load ptr, ptr %152, align 8, !alias.scope !1, !noalias !2
  %169 = load i64, ptr %12, align 8
  %170 = icmp slt i64 %169, %167
  br i1 %170, label %63, label %76

171:
  %172 = extractvalue { ptr, i64 } { ptr @luce.text.2, i64 21 }, 0
  %173 = extractvalue { ptr, i64 } { ptr @luce.text.2, i64 21 }, 1
  call void @luce_rt_raise(ptr %1, i32 14, ptr %172, i64 %173)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 16)
  ret i32 1

174:
  %175 = getelementptr inbounds i8, ptr %1, i64 96
  %176 = load ptr, ptr %175, align 8!alias.scope !1, !noalias !2
  %177 = zext i32 %67 to i64
  %178 = mul nsw i64 %177, 112
  %179 = getelementptr inbounds i8, ptr %176, i64 %178
  %180 = getelementptr inbounds i8, ptr %179, i64 96
  %181 = load i32, ptr %180, align 4, !alias.scope !1, !noalias !2
  %182 = icmp ne i32 %181, %69
  br i1 %182, label %183, label %186, !prof !0

183:
  %184 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 0
  %185 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 1
  call void @luce_rt_raise(ptr %1, i32 13, ptr %184, i64 %185)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 16)
  ret i32 1

186:
  %187 = and i32 %181, 1
  %188 = icmp ne i32 %187, 0
  br i1 %188, label %189, label %192, !prof !0

189:
  %190 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 0
  %191 = extractvalue { ptr, i64 } { ptr @luce.text.3, i64 22 }, 1
  call void @luce_rt_raise(ptr %1, i32 13, ptr %190, i64 %191)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 16)
  ret i32 1

192:
  %193 = getelementptr inbounds i8, ptr %179, i64 16
  %194 = load i64, ptr %193, align 8!alias.scope !1, !noalias !2
  %195 = load ptr, ptr %179, align 8, !alias.scope !1, !noalias !2
  %196 = icmp slt i64 %66, 0
  %197 = icmp sge i64 %66, %194
  %198 = or i1 %196, %197
  br i1 %198, label %199, label %202, !prof !0

199:
  %200 = extractvalue { ptr, i64 } { ptr @luce.text.7, i64 19 }, 0
  %201 = extractvalue { ptr, i64 } { ptr @luce.text.7, i64 19 }, 1
  call void @luce_rt_raise(ptr %1, i32 10, ptr %200, i64 %201)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 16)
  ret i32 1

202:
  %203 = mul nsw i64 0, %194
  %204 = add nsw i64 %203, %66
  %205 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %195, i64 %204
  %206 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %205, i32 0, i32 3
  %207 = load i64, ptr %206, align 8
  %208 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %205, i32 0, i32 1
  %209 = load i8, ptr %208, align 1
  %210 = icmp eq i8 %209, -1
  %211 = inttoptr i64 %207 to ptr
  %212 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %205, i32 0, i32 2
  %213 = select i1 %210, ptr %211, ptr %212
  %214 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %205, i32 0, i32 4
  %215 = load i64, ptr %214, align 8
  %216 = zext i8 %209 to i64
  %217 = select i1 %210, i64 %215, i64 %216
  %218 = insertvalue { ptr, i64 } poison, ptr %213, 0
  %219 = insertvalue { ptr, i64 } %218, i64 %217, 1
  %220 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 3
  %221 = load i64, ptr %220, align 8
  %222 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 1
  %223 = load i8, ptr %222, align 1
  %224 = icmp eq i8 %223, -1
  %225 = inttoptr i64 %221 to ptr
  %226 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 2
  %227 = select i1 %224, ptr %225, ptr %226
  %228 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %14, i32 0, i32 4
  %229 = load i64, ptr %228, align 8
  %230 = zext i8 %223 to i64
  %231 = select i1 %224, i64 %229, i64 %230
  %232 = insertvalue { ptr, i64 } poison, ptr %227, 0
  %233 = insertvalue { ptr, i64 } %232, i64 %231, 1
  call void @luce_rt_drop_storage(ptr %1, ptr %14, ptr %31)
  %234 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %31, i32 0, i32 3
  %235 = load i64, ptr %234, align 8
  %236 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %31, i32 0, i32 1
  %237 = load i8, ptr %236, align 1
  %238 = icmp eq i8 %237, -1
  %239 = inttoptr i64 %235 to ptr
  %240 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %31, i32 0, i32 2
  %241 = select i1 %238, ptr %239, ptr %240
  %242 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %31, i32 0, i32 4
  %243 = load i64, ptr %242, align 8
  %244 = zext i8 %237 to i64
  %245 = select i1 %238, i64 %243, i64 %244
  %246 = insertvalue { ptr, i64 } poison, ptr %241, 0
  %247 = insertvalue { ptr, i64 } %246, i64 %245, 1
  call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %14, ptr align 8 %31, i64 24, i1 false)
  %248 = extractvalue { ptr, i64 } %219, 0
  %249 = ptrtoint ptr %248 to i64
  %250 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 3
  store i64 %249, ptr %250, align 8
  %251 = extractvalue { ptr, i64 } %219, 1
  %252 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %32, i32 0, i32 4
  store i64 %251, ptr %252, align 8
  %253 = call i32 @luce_rt_own_storage(ptr %1, ptr %32, ptr %35)
  %254 = icmp ne i32 %253, 0
  br i1 %254, label %255, label %256, !prof !0

255:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 20)
  ret i32 1

256:
  %257 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 3
  %258 = load i64, ptr %257, align 8
  %259 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 1
  %260 = load i8, ptr %259, align 1
  %261 = icmp eq i8 %260, -1
  %262 = inttoptr i64 %258 to ptr
  %263 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 2
  %264 = select i1 %261, ptr %262, ptr %263
  %265 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %35, i32 0, i32 4
  %266 = load i64, ptr %265, align 8
  %267 = zext i8 %260 to i64
  %268 = select i1 %261, i64 %266, i64 %267
  %269 = insertvalue { ptr, i64 } poison, ptr %264, 0
  %270 = insertvalue { ptr, i64 } %269, i64 %268, 1
  call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %14, ptr align 8 %35, i64 24, i1 false)
  %271 = load i64, ptr %13, align 8
  %272 = icmp sgt i64 %271, 0
  br i1 %272, label %109, label %120

273:
  %274 = extractvalue { ptr, i64 } { ptr @luce.text.8, i64 16 }, 0
  %275 = extractvalue { ptr, i64 } { ptr @luce.text.8, i64 16 }, 1
  call void @luce_rt_raise(ptr %1, i32 0, ptr %274, i64 %275)
  call void @luce_rt_unwound(ptr %1, i32 1, i32 36)
  ret i32 1

276:
  store i64 %74, ptr %12, align 8
  br label %57

277:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 43)
  ret i32 1

278:
  %279 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %40, i32 0, i32 3
  %280 = load i64, ptr %279, align 8
  %281 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %40, i32 0, i32 1
  %282 = load i8, ptr %281, align 1
  %283 = icmp eq i8 %282, -1
  %284 = inttoptr i64 %280 to ptr
  %285 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %40, i32 0, i32 2
  %286 = select i1 %283, ptr %284, ptr %285
  %287 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %40, i32 0, i32 4
  %288 = load i64, ptr %287, align 8
  %289 = zext i8 %282 to i64
  %290 = select i1 %283, i64 %288, i64 %289
  %291 = insertvalue { ptr, i64 } poison, ptr %286, 0
  %292 = insertvalue { ptr, i64 } %291, i64 %290, 1
  %293 = call i32 @luce_rt_export_storage(ptr %1, ptr %40, ptr %41)
  %294 = icmp ne i32 %293, 0
  br i1 %294, label %295, label %296, !prof !0

295:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 44)
  ret i32 1

296:
  %297 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %41, i32 0, i32 3
  %298 = load i64, ptr %297, align 8
  %299 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %41, i32 0, i32 1
  %300 = load i8, ptr %299, align 1
  %301 = icmp eq i8 %300, -1
  %302 = inttoptr i64 %298 to ptr
  %303 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %41, i32 0, i32 2
  %304 = select i1 %301, ptr %302, ptr %303
  %305 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %41, i32 0, i32 4
  %306 = load i64, ptr %305, align 8
  %307 = zext i8 %300 to i64
  %308 = select i1 %301, i64 %306, i64 %307
  %309 = insertvalue { ptr, i64 } poison, ptr %304, 0
  %310 = insertvalue { ptr, i64 } %309, i64 %308, 1
  %311 = load i64, ptr %10, align 8
  %312 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %42, i32 0, i32 3
  store i64 %311, ptr %312, align 8
  %313 = call i32 @luce_rt_release(ptr %1, ptr %42)
  %314 = icmp ne i32 %313, 0
  br i1 %314, label %315, label %316, !prof !0

315:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 46)
  ret i32 1

316:
  store { ptr, i64 } %310, ptr %5, align 8
  ret i32 0

317:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 28)
  ret i32 1

318:
  br label %120

319:
  call void @luce_rt_unwound(ptr %1, i32 1, i32 32)
  ret i32 1

320:
  br label %71
}

; Function Attrs: nounwind cold willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @luce_rt_raise(ptr nocapture nonnull noundef %0, i32 %1, ptr nocapture readonly %2, i64 %3) #0

; Function Attrs: nounwind cold willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @luce_rt_unwound(ptr nocapture nonnull noundef %0, i32 %1, i32 %2) #0

; Function Attrs: nounwind willreturn memory(read, argmem: readwrite, inaccessiblemem: readwrite)
declare i32 @luce_rt_str(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %2) #1

; Function Attrs: nounwind willreturn memory(readwrite)
declare i32 @luce_rt_new_list(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %2) #2

; Function Attrs: nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare i32 @luce_rt_own_storage(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %2) #3

; Function Attrs: nounwind willreturn memory(readwrite)
declare i32 @luce_rt_append(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %2) #2

; Function Attrs: nounwind cold willreturn memory(argmem: write)
declare void @luce_rt_exhaust(ptr nocapture nonnull noundef %0) #4

; Function Attrs: nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @luce_rt_drop_storage(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %2) #3

; Function Attrs: nounwind willreturn nofree nocallback memory(argmem: readwrite)
declare void @llvm.memcpy.inline.p0.p0.i64(ptr noalias nocapture writeonly %0, ptr noalias nocapture readonly %1, i64 %2, i1 immarg %3) #5

; Function Attrs: nounwind memory(readwrite)
declare i32 @luce_rt_release(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1) #6

; Function Attrs: nounwind willreturn memory(readwrite)
declare i32 @luce_rt_new_builder(ptr nocapture nonnull noundef %0, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %1) #2

; Function Attrs: nounwind speculatable willreturn nofree nosync nocallback memory(none)
declare { i64, i1 } @llvm.sadd.with.overflow.i64(i64 %0, i64 %1) #7

; Function Attrs: nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)
declare i32 @luce_rt_export_storage(ptr nocapture nonnull noundef %0, ptr align 8 nocapture readonly nonnull dereferenceable(24) noundef %1, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %2) #3

define i32 @luce_main(ptr align 8 nocapture readonly nonnull dereferenceable(472) noundef %0) {
1:
  %2 = alloca i64, align 8
  %3 = alloca i32, align 8
  store i64 256, ptr %2, align 8
  %4 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 0
  %5 = load ptr, ptr %4, align 8
  %6 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 14
  %7 = load ptr, ptr %6, align 8
  %8 = icmp eq ptr %7, null
  br i1 %8, label %11, label %9

9:
  %10 = call i64 %7(ptr %5)
  store i64 %10, ptr %2, align 8
  br label %11

11:
  %12 = load i64, ptr %2, align 8
  %13 = call ptr @luce_rt_open(ptr @luce.functions, i64 2)
  %14 = icmp eq ptr %13, null
  br i1 %14, label %15, label %16, !prof !0

15:
  ret i32 2

16:
  %17 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 28
  %18 = load ptr, ptr %17, align 8
  %19 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 54
  %20 = load ptr, ptr %19, align 8
  %21 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 55
  %22 = load ptr, ptr %21, align 8
  %23 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 56
  %24 = load ptr, ptr %23, align 8
  %25 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 57
  %26 = load ptr, ptr %25, align 8
  %27 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 58
  %28 = load ptr, ptr %27, align 8
  %29 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 29
  %30 = load ptr, ptr %29, align 8
  %31 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 30
  %32 = load ptr, ptr %31, align 8
  %33 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 31
  %34 = load ptr, ptr %33, align 8
  %35 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 32
  %36 = load ptr, ptr %35, align 8
  call void @luce_rt_files_install(ptr %13, ptr %5, ptr %18, ptr %20, ptr %22, ptr %24, ptr %26, ptr %28, ptr %30, ptr %32, ptr %34, ptr %36)
  %37 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 48
  %38 = load ptr, ptr %37, align 8
  %39 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 49
  %40 = load ptr, ptr %39, align 8
  %41 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 50
  %42 = load ptr, ptr %41, align 8
  %43 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 51
  %44 = load ptr, ptr %43, align 8
  %45 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 52
  %46 = load ptr, ptr %45, align 8
  call void @luce_rt_sockets_install(ptr %13, ptr %5, ptr %38, ptr %40, ptr %42, ptr %44, ptr %46)
  %47 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 40
  %48 = load ptr, ptr %47, align 8
  %49 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 41
  %50 = load ptr, ptr %49, align 8
  %51 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 42
  %52 = load ptr, ptr %51, align 8
  %53 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 43
  %54 = load ptr, ptr %53, align 8
  %55 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 44
  %56 = load ptr, ptr %55, align 8
  %57 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 45
  %58 = load ptr, ptr %57, align 8
  %59 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 46
  %60 = load ptr, ptr %59, align 8
  %61 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 47
  %62 = load ptr, ptr %61, align 8
  call void @luce_rt_graphics_install(ptr %13, ptr %5, ptr %48, ptr %50, ptr %52, ptr %54, ptr %56, ptr %58, ptr %60, ptr %62)
  %63 = icmp slt i64 %12, 1
  br i1 %63, label %64, label %65, !prof !0

64:
  call void @luce_rt_raise(ptr %13, i32 6, ptr @luce.text.5, i64 19)
  store i32 1, ptr %3, align 8
  br label %73

65:
  %66 = alloca { i8, i8, [6 x i8], i64, i64 }, align 8
  %67 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 4
  %68 = load ptr, ptr %67, align 8
  %69 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 5
  %70 = load ptr, ptr %69, align 8
  %71 = call i32 @luce_rt_args_list(ptr %13, ptr %5, ptr %68, ptr %70, ptr %66)
  %72 = icmp ne i32 %71, 0
  br i1 %72, label %77, label %78, !prof !0

73:
  %74 = load i32, ptr %3, align 8
  %75 = icmp eq i32 %74, 1
  %76 = icmp eq i32 %74, 2
  br i1 %75, label %83, label %86, !prof !0

77:
  store i32 1, ptr %3, align 8
  br label %73

78:
  %79 = getelementptr inbounds { i8, i8, [6 x i8], i64, i64 }, ptr %66, i32 0, i32 3
  %80 = load i64, ptr %79, align 8
  %81 = call i32 @luce.0.main(ptr %0, ptr %13, i64 %12, i64 %80)
  store i32 %81, ptr %3, align 8
  %82 = call i32 @luce_rt_release(ptr %13, ptr %66)
  br label %73

83:
  %84 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 2
  %85 = load ptr, ptr %84, align 8
  call void @luce_rt_report(ptr %13, ptr %5, ptr %85)
  br label %86

86:
  br i1 %76, label %87, label %90, !prof !0

87:
  %88 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 15
  %89 = load ptr, ptr %88, align 8
  call void @luce_rt_report_error(ptr %13, ptr %5, ptr %89)
  br label %90

90:
  %91 = call i32 @luce_rt_status(ptr %13, i32 %74)
  %92 = icmp eq i32 %91, 2
  %93 = getelementptr inbounds { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }, ptr %0, i32 0, i32 3
  %94 = load ptr, ptr %93, align 8
  %95 = icmp eq ptr %94, null
  %96 = or i1 %95, %92
  br i1 %96, label %97, label %98

97:
  call void @luce_rt_close(ptr %13)
  ret i32 %91

98:
  %99 = call i64 @luce_rt_leaked(ptr %13)
  call void %94(ptr %5, i64 %99)
  br label %97
}

; Function Attrs: nounwind willreturn memory(argmem: read, inaccessiblemem: readwrite)
declare noalias ptr @luce_rt_open(ptr readonly %0, i64 %1) #8

; Function Attrs: nounwind willreturn memory(argmem: readwrite)
declare void @luce_rt_files_install(ptr nocapture nonnull noundef %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %8, ptr %9, ptr %10, ptr %11) #9

; Function Attrs: nounwind willreturn memory(readwrite)
declare void @luce_rt_sockets_install(ptr nocapture nonnull noundef %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5, ptr %6) #2

; Function Attrs: nounwind willreturn memory(argmem: readwrite)
declare void @luce_rt_graphics_install(ptr nocapture nonnull noundef %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5, ptr %6, ptr %7, ptr %8, ptr %9) #9

; Function Attrs: nounwind memory(readwrite)
declare i32 @luce_rt_args_list(ptr nocapture nonnull noundef %0, ptr %1, ptr %2, ptr %3, ptr align 8 nocapture nonnull dereferenceable(24) writeonly noundef %4) #6

; Function Attrs: cold
declare void @luce_rt_report(ptr nocapture nonnull noundef %0, ptr %1, ptr %2) #10

; Function Attrs: cold
declare void @luce_rt_report_error(ptr nocapture nonnull noundef %0, ptr %1, ptr %2) #10

; Function Attrs: nounwind willreturn memory(argmem: read)
declare i32 @luce_rt_status(ptr nocapture nonnull noundef %0, i32 %1) #11

; Function Attrs: nounwind willreturn memory(argmem: read)
declare i64 @luce_rt_leaked(ptr nocapture nonnull noundef %0) #11

; Function Attrs: nounwind memory(readwrite)
declare void @luce_rt_close(ptr nocapture nonnull noundef %0) #6

attributes #0 = { nounwind cold willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) }
attributes #1 = { nounwind willreturn memory(read, argmem: readwrite, inaccessiblemem: readwrite) }
attributes #2 = { nounwind willreturn memory(readwrite) }
attributes #3 = { nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite) }
attributes #4 = { nounwind cold willreturn memory(argmem: write) }
attributes #5 = { nounwind willreturn nofree nocallback memory(argmem: readwrite) }
attributes #6 = { nounwind memory(readwrite) }
attributes #7 = { nounwind speculatable willreturn nofree nosync nocallback memory(none) }
attributes #8 = { nounwind willreturn memory(argmem: read, inaccessiblemem: readwrite) }
attributes #9 = { nounwind willreturn memory(argmem: readwrite) }
attributes #10 = { cold }
attributes #11 = { nounwind willreturn memory(argmem: read) }

!0 = !{!"branch_weights", i32 1, i32 2000}
!1 = !{!3}
!2 = !{!4}
!3 = !{!"luce.rows", !5}
!4 = !{!"luce.elements", !5}
!5 = !{!"luce.alias"}

ARM64 object code. LLVM selected these instructions, registers, calls, and branch conditions for this target.

open assembly file
ARM64 instruction guide hover, focus, or tap dotted terms

x8 is a 64-bit register; w8 is its low 32 bits. A leading # marks a constant, brackets describe a memory address, and conditional instructions read the processor flags set by the preceding arithmetic or comparison.

Hover or focus a dotted term in the file for its explanation. On a touch screen, tap a term to keep the note open and tap elsewhere to close it. The list includes the operations that appear in this file.

mov
Copies a register value or loads a small constant. Calls also use it to place arguments in the required registers.
add
Adds registers or a constant. Address setup and stack restoration frequently use this instruction.
sub
Subtracts registers or a constant. Function prologues use it to reserve stack space.
cmp
Performs a subtraction solely to set condition flags; a following branch or select consumes those flags.
cmn
Performs an addition solely to set condition flags. The checked multiply-by-two path uses it to recognize unsafe inputs.
csel
Selects one of two registers from the current condition flags. The clamp uses it to choose the doubled value or limit.
ldr
Loads a register from memory using a scaled address offset.
str
Stores one register into memory using a scaled address offset.
ldp
Loads two adjacent registers, often restoring saved registers or reading neighboring fields.
stp
Stores two adjacent registers, often saving the caller's registers in a function prologue.
ldur
Loads from an unscaled byte offset, which is useful for stack slots below the frame pointer.
stur
Stores to an unscaled byte offset, which is useful for stack slots below the frame pointer.
ldrb
Loads one byte and widens it into a register.
strb
Stores the low byte of a register.
strh
Stores the low 16 bits of a register.
sturh
Stores 16 bits using an unscaled byte offset.
adrp
Loads the page address of a symbol. The linker fills in the final page-relative relocation.
bl
Calls a direct target and records the return address in x30.
blr
Calls the function address held in a register, as required for host callbacks and function values.
b
Jumps to another instruction address.
b.eq
Branches when the previous comparison reported equality.
b.ne
Branches when the previous comparison reported different values.
b.lt
Branches when the signed left operand was smaller.
b.le
Branches when the signed left operand was smaller or equal.
b.ge
Branches when the signed left operand was greater or equal.
b.hs
Branches when an unsigned comparison found higher-or-same, represented by a set carry flag.
cbz
Compares a register with zero and branches when it is zero.
cbnz
Compares a register with zero and branches when it contains a nonzero value.
tbnz
Tests one selected bit and branches when that bit is set; packed runtime flags use this form.
lsl
Shifts bits left. A shift by one multiplies by two after the overflow check has established a safe range.
lsr
Shifts bits right and fills with zero, often extracting the upper field of a packed handle.
umaddl
Widens two 32-bit unsigned operands, multiplies them, and adds a 64-bit base address.
orr
Combines bits, commonly setting tag or flag bits in a packed value.
ret
Returns to the address in x30 and ends the current machine function.


/Users/sedov/Dev/luciaos/www/lucelang/out/traces/standard.o:	file format mach-o arm64

Disassembly of section __TEXT,__text:

0000000000000000 <ltmp0>:
; luce_main():
       0:      	stp	x28, x27, [sp, #-0x60]!
       4:      	stp	x26, x25, [sp, #0x10]
       8:      	stp	x24, x23, [sp, #0x20]
       c:      	stp	x22, x21, [sp, #0x30]
      10:      	stp	x20, x19, [sp, #0x40]
      14:      	stp	x29, x30, [sp, #0x50]
      18:      	add	x29, sp, #0x50
      1c:      	sub	sp, sp, #0x290
      20:      	mov	x19, sp
      24:      	ldr	x8, [x0, #0x70]
      28:      	ldr	x25, [x0]
      2c:      	mov	x27, x0
      30:      	cbz	x8, 0x5c <ltmp0+0x5c>
      34:      	mov	x0, x25
      38:      	blr	x8
      3c:      	mov	x24, x0
      40:      	adrp	x0, 0x0 <ltmp0>
      44:      	add	x0, x0, #0x0
      48:      	mov	w1, #0x2                ; =2
      4c:      	mov	w23, #0x2               ; =2
      50:      	bl	0x50 <ltmp0+0x50>
      54:      	cbnz	x0, 0x78 <ltmp0+0x78>
      58:      	b	0x534 <ltmp0+0x534>
      5c:      	mov	w24, #0x100             ; =256
      60:      	adrp	x0, 0x0 <ltmp0>
      64:      	add	x0, x0, #0x0
      68:      	mov	w1, #0x2                ; =2
      6c:      	mov	w23, #0x2               ; =2
      70:      	bl	0x70 <ltmp0+0x70>
      74:      	cbz	x0, 0x534 <ltmp0+0x534>
      78:      	ldp	x3, x4, [x27, #0x1b0]
      7c:      	mov	x22, x0
      80:      	ldp	x5, x6, [x27, #0x1c0]
      84:      	ldr	x2, [x27, #0xe0]
      88:      	ldp	x8, x9, [x27, #0xf8]
      8c:      	ldr	x7, [x27, #0x1d0]
      90:      	ldur	q0, [x27, #0xe8]
      94:      	sub	sp, sp, #0x20
      98:      	mov	x1, x25
      9c:      	stp	x8, x9, [sp, #0x10]
      a0:      	str	q0, [sp]
      a4:      	bl	0xa4 <ltmp0+0xa4>
      a8:      	add	sp, sp, #0x20
      ac:      	ldp	x2, x3, [x27, #0x180]
      b0:      	mov	x0, x22
      b4:      	ldp	x4, x5, [x27, #0x190]
      b8:      	mov	x1, x25
      bc:      	ldr	x6, [x27, #0x1a0]
      c0:      	bl	0xc0 <ltmp0+0xc0>
      c4:      	ldp	x8, x9, [x27, #0x170]
      c8:      	ldp	x2, x3, [x27, #0x140]
      cc:      	ldp	x4, x5, [x27, #0x150]
      d0:      	ldp	x6, x7, [x27, #0x160]
      d4:      	stp	x8, x9, [sp, #-0x10]!
      d8:      	mov	x0, x22
      dc:      	mov	x1, x25
      e0:      	bl	0xe0 <ltmp0+0xe0>
      e4:      	add	sp, sp, #0x10
      e8:      	cmp	x24, #0x0
      ec:      	b.le	0x628 <ltmp0+0x628>
      f0:      	sub	x28, sp, #0x20
      f4:      	mov	sp, x28
      f8:      	ldp	x2, x3, [x27, #0x20]
      fc:      	mov	x0, x22
     100:      	mov	x1, x25
     104:      	mov	x4, x28
     108:      	bl	0x108 <ltmp0+0x108>
     10c:      	cbnz	w0, 0x59c <ltmp0+0x59c>
     110:      	mov	w8, #0xff04             ; =65284
     114:      	mov	w9, #0x2                ; =2
     118:      	adrp	x26, 0x0 <ltmp0>
     11c:      	add	x26, x26, #0x0
     120:      	strh	w8, [x19, #0x128]
     124:      	strh	w8, [x19, #0xe0]
     128:      	strh	w8, [x19, #0xb0]
     12c:      	ldr	x8, [x28, #0x8]
     130:      	strb	w9, [x19, #0x110]
     134:      	mov	w9, #0x6                ; =6
     138:      	cmn	w8, #0x1
     13c:      	stp	x26, xzr, [x19, #0x130]
     140:      	str	xzr, [x19, #0x120]
     144:      	strb	w9, [x19, #0x80]
     148:      	str	xzr, [x19, #0x90]
     14c:      	strb	w9, [x19, #0x68]
     150:      	str	xzr, [x19, #0x78]
     154:      	strb	w9, [x19, #0x38]
     158:      	str	xzr, [x19, #0x48]
     15c:      	b.eq	0x644 <ltmp0+0x644>
     160:      	mov	w9, #0x70               ; =112
     164:      	ldr	x10, [x22, #0x60]
     168:      	umaddl	x9, w8, w9, x10
     16c:      	lsr	x8, x8, #32
     170:      	ldr	w10, [x9, #0x60]
     174:      	cmp	w10, w8
     178:      	b.ne	0x5e8 <ltmp0+0x5e8>
     17c:      	tbnz	w8, #0x0, 0x5e8 <ltmp0+0x5e8>
     180:      	ldr	x8, [x9, #0x10]
     184:      	add	x1, x19, #0x110
     188:      	add	x2, x19, #0xf8
     18c:      	mov	x0, x22
     190:      	str	x8, [x19, #0x118]
     194:      	bl	0x194 <ltmp0+0x194>
     198:      	cbnz	w0, 0x66c <ltmp0+0x66c>
     19c:      	add	x1, x19, #0xe0
     1a0:      	add	x2, x19, #0xc8
     1a4:      	mov	x0, x22
     1a8:      	stp	x26, xzr, [x19, #0xe8]
     1ac:      	bl	0x1ac <ltmp0+0x1ac>
     1b0:      	cbnz	w0, 0x67c <ltmp0+0x67c>
     1b4:      	adrp	x8, 0x0 <ltmp0>
     1b8:      	add	x8, x8, #0x0
     1bc:      	ldr	x20, [x19, #0xd0]
     1c0:      	mov	w9, #0x4                ; =4
     1c4:      	add	x1, x19, #0xb0
     1c8:      	add	x2, x19, #0x98
     1cc:      	mov	x0, x22
     1d0:      	stp	x8, x9, [x19, #0xb8]
     1d4:      	bl	0x1d4 <ltmp0+0x1d4>
     1d8:      	cbnz	w0, 0x68c <ltmp0+0x68c>
     1dc:      	add	x1, x19, #0x80
     1e0:      	add	x2, x19, #0x98
     1e4:      	mov	x0, x22
     1e8:      	str	x20, [x19, #0x88]
     1ec:      	bl	0x1ec <ltmp0+0x1ec>
     1f0:      	cbnz	w0, 0x69c <ltmp0+0x69c>
     1f4:      	add	x1, x19, #0x68
     1f8:      	add	x2, x19, #0xf8
     1fc:      	mov	x0, x22
     200:      	str	x20, [x19, #0x70]
     204:      	bl	0x204 <ltmp0+0x204>
     208:      	cbnz	w0, 0x6ac <ltmp0+0x6ac>
     20c:      	cmp	x24, #0x1
     210:      	b.eq	0x6bc <ltmp0+0x6bc>
     214:      	mov	w8, #0xff04             ; =65284
     218:      	mov	w9, #0x6                ; =6
     21c:      	sub	x1, x29, #0x98
     220:      	mov	x0, x22
     224:      	sturh	w8, [x29, #-0x80]
     228:      	stp	x26, xzr, [x29, #-0x78]
     22c:      	sturh	w8, [x29, #-0xc8]
     230:      	strb	w9, [x19, #0x1d0]
     234:      	str	xzr, [x19, #0x1e0]
     238:      	strb	w9, [x19, #0x188]
     23c:      	str	xzr, [x19, #0x198]
     240:      	strb	w9, [x19, #0x170]
     244:      	str	xzr, [x19, #0x180]
     248:      	strh	w8, [x19, #0x158]
     24c:      	strb	w9, [x19, #0x140]
     250:      	str	xzr, [x19, #0x150]
     254:      	bl	0x254 <ltmp0+0x254>
     258:      	cbnz	w0, 0x6d8 <ltmp0+0x6d8>
     25c:      	cmn	w20, #0x1
     260:      	b.eq	0x5c8 <ltmp0+0x5c8>
     264:      	mov	w8, w20
     268:      	lsr	x10, x20, #32
     26c:      	stp	x28, x27, [x19, #0x10]
     270:      	lsl	x8, x8, #7
     274:      	str	x20, [x19, #0x8]
     278:      	str	x10, [x19, #0x30]
     27c:      	sub	x9, x8, w20, uxtw #4
     280:      	ldr	x8, [x22, #0x60]
     284:      	add	x8, x8, x9
     288:      	stp	x25, x9, [x19, #0x20]
     28c:      	ldr	w9, [x8, #0x60]
     290:      	cmp	w9, w10
     294:      	b.ne	0x404 <ltmp0+0x404>
     298:      	ldr	x9, [x19, #0x30]
     29c:      	tbnz	w9, #0x0, 0x404 <ltmp0+0x404>
     2a0:      	ldr	x9, [x8, #0x10]
     2a4:      	ldur	x24, [x29, #-0x90]
     2a8:      	cmp	x9, #0x1
     2ac:      	b.lt	0x424 <ltmp0+0x424>
     2b0:      	ldr	x8, [x8]
     2b4:      	sub	x1, x29, #0x80
     2b8:      	sub	x2, x29, #0xb0
     2bc:      	mov	x0, x22
     2c0:      	ldp	x21, x23, [x8, #0x8]
     2c4:      	ldrb	w20, [x8, #0x1]
     2c8:      	add	x25, x8, #0x2
     2cc:      	bl	0x2cc <ltmp0+0x2cc>
     2d0:      	cmp	w20, #0xff
     2d4:      	sub	x1, x29, #0xc8
     2d8:      	sub	x2, x29, #0xe0
     2dc:      	csel	x8, x21, x25, eq
     2e0:      	csel	x9, x23, x20, eq
     2e4:      	mov	x0, x22
     2e8:      	stp	x8, x9, [x29, #-0xc0]
     2ec:      	bl	0x2ec <ltmp0+0x2ec>
     2f0:      	cbnz	w0, 0x558 <ltmp0+0x558>
     2f4:      	sub	x28, x29, #0xe0
     2f8:      	ldur	x8, [x29, #-0xd0]
     2fc:      	add	x1, x19, #0x140
     300:      	ldr	q0, [x28]
     304:      	sub	x2, x29, #0xe0
     308:      	mov	x0, x22
     30c:      	stur	x8, [x29, #-0x70]
     310:      	str	q0, [x28, #0x60]
     314:      	str	x24, [x19, #0x148]
     318:      	bl	0x318 <ltmp0+0x318>
     31c:      	cbnz	w0, 0x560 <ltmp0+0x560>
     320:      	ldp	x9, x10, [x19, #0x28]
     324:      	ldr	x8, [x22, #0x60]
     328:      	add	x8, x8, x9
     32c:      	ldr	w9, [x8, #0x60]
     330:      	cmp	w9, w10
     334:      	b.ne	0x404 <ltmp0+0x404>
     338:      	mov	x23, xzr
     33c:      	mov	x20, xzr
     340:      	ldr	x9, [x8, #0x10]
     344:      	add	x23, x23, #0x1
     348:      	cmp	x23, x9
     34c:      	b.ge	0x424 <ltmp0+0x424>
     350:      	ldr	x8, [x8]
     354:      	sub	x1, x29, #0x80
     358:      	sub	x2, x29, #0xb0
     35c:      	mov	x0, x22
     360:      	add	x25, x8, x20
     364:      	ldp	x26, x27, [x25, #0x20]
     368:      	ldrb	w21, [x25, #0x19]
     36c:      	bl	0x36c <ltmp0+0x36c>
     370:      	cmp	w21, #0xff
     374:      	add	x8, x25, #0x1a
     378:      	sub	x1, x29, #0xc8
     37c:      	csel	x8, x26, x8, eq
     380:      	csel	x9, x27, x21, eq
     384:      	sub	x2, x29, #0xe0
     388:      	mov	x0, x22
     38c:      	stp	x8, x9, [x29, #-0xc0]
     390:      	bl	0x390 <ltmp0+0x390>
     394:      	cbnz	w0, 0x558 <ltmp0+0x558>
     398:      	ldur	x8, [x29, #-0xd0]
     39c:      	ldr	q0, [x28]
     3a0:      	add	x1, x19, #0x170
     3a4:      	add	x2, x19, #0x158
     3a8:      	mov	x0, x22
     3ac:      	str	x24, [x19, #0x178]
     3b0:      	stur	x8, [x29, #-0x70]
     3b4:      	adrp	x8, 0x0 <ltmp0>
     3b8:      	add	x9, x8, #0x0
     3bc:      	mov	w8, #0x1                ; =1
     3c0:      	str	q0, [x28, #0x60]
     3c4:      	stp	x9, x8, [x19, #0x160]
     3c8:      	bl	0x3c8 <ltmp0+0x3c8>
     3cc:      	cbnz	w0, 0x568 <ltmp0+0x568>
     3d0:      	add	x1, x19, #0x140
     3d4:      	sub	x2, x29, #0xe0
     3d8:      	mov	x0, x22
     3dc:      	str	x24, [x19, #0x148]
     3e0:      	bl	0x3e0 <ltmp0+0x3e0>
     3e4:      	cbnz	w0, 0x560 <ltmp0+0x560>
     3e8:      	ldp	x9, x10, [x19, #0x28]
     3ec:      	add	x20, x20, #0x18
     3f0:      	ldr	x8, [x22, #0x60]
     3f4:      	add	x8, x8, x9
     3f8:      	ldr	w9, [x8, #0x60]
     3fc:      	cmp	w9, w10
     400:      	b.eq	0x340 <ltmp0+0x340>
     404:      	adrp	x2, 0x0 <ltmp0>
     408:      	add	x2, x2, #0x0
     40c:      	mov	x0, x22
     410:      	mov	w1, #0xd                ; =13
     414:      	mov	w3, #0x16               ; =22
     418:      	bl	0x418 <ltmp0+0x418>
     41c:      	mov	w2, #0x8                ; =8
     420:      	b	0x56c <ltmp0+0x56c>
     424:      	sub	x1, x29, #0x80
     428:      	sub	x2, x29, #0xf8
     42c:      	mov	x0, x22
     430:      	bl	0x430 <ltmp0+0x430>
     434:      	add	x1, x19, #0x1d0
     438:      	add	x2, x19, #0x1b8
     43c:      	mov	x0, x22
     440:      	str	x24, [x19, #0x1d8]
     444:      	bl	0x444 <ltmp0+0x444>
     448:      	ldp	x27, x25, [x19, #0x18]
     44c:      	ldr	x28, [x19, #0x10]
     450:      	cbnz	w0, 0x6e0 <ltmp0+0x6e0>
     454:      	add	x1, x19, #0x1b8
     458:      	add	x2, x19, #0x1a0
     45c:      	mov	x0, x22
     460:      	bl	0x460 <ltmp0+0x460>
     464:      	cbnz	w0, 0x6e8 <ltmp0+0x6e8>
     468:      	ldp	x21, x23, [x19, #0x1a8]
     46c:      	add	x1, x19, #0x188
     470:      	ldrb	w20, [x19, #0x1a1]
     474:      	mov	x0, x22
     478:      	str	x24, [x19, #0x190]
     47c:      	bl	0x47c <ltmp0+0x47c>
     480:      	cbnz	w0, 0x6f0 <ltmp0+0x6f0>
     484:      	add	x8, x19, #0x1a0
     488:      	cmp	w20, #0xff
     48c:      	mov	w9, #0xff04             ; =65284
     490:      	orr	x10, x8, #0x2
     494:      	ldr	x8, [x27, #0x8]
     498:      	csel	x2, x23, x20, eq
     49c:      	csel	x1, x21, x10, eq
     4a0:      	strh	w9, [x19, #0x128]
     4a4:      	stp	x1, x2, [x19, #0x130]
     4a8:      	cbz	x8, 0x600 <ltmp0+0x600>
     4ac:      	ldr	x0, [x27]
     4b0:      	blr	x8
     4b4:      	cmn	w0, #0x1
     4b8:      	b.eq	0x6f8 <ltmp0+0x6f8>
     4bc:      	cmp	w0, #0x2
     4c0:      	b.hs	0x600 <ltmp0+0x600>
     4c4:      	add	x1, x19, #0x128
     4c8:      	add	x2, x19, #0x50
     4cc:      	mov	x0, x22
     4d0:      	bl	0x4d0 <ltmp0+0x4d0>
     4d4:      	ldr	x8, [x19, #0x8]
     4d8:      	add	x1, x19, #0x38
     4dc:      	mov	x0, x22
     4e0:      	str	x8, [x19, #0x40]
     4e4:      	bl	0x4e4 <ltmp0+0x4e4>
     4e8:      	cbnz	w0, 0x704 <ltmp0+0x704>
     4ec:      	mov	x0, x22
     4f0:      	mov	x1, x28
     4f4:      	bl	0x4f4 <ltmp0+0x4f4>
     4f8:      	mov	w1, wzr
     4fc:      	mov	x0, x22
     500:      	bl	0x500 <ltmp0+0x500>
     504:      	mov	w23, w0
     508:      	cmp	w0, #0x2
     50c:      	b.eq	0x52c <ltmp0+0x52c>
     510:      	ldr	x20, [x27, #0x18]
     514:      	cbz	x20, 0x52c <ltmp0+0x52c>
     518:      	mov	x0, x22
     51c:      	bl	0x51c <ltmp0+0x51c>
     520:      	mov	x1, x0
     524:      	mov	x0, x25
     528:      	blr	x20
     52c:      	mov	x0, x22
     530:      	bl	0x530 <ltmp0+0x530>
     534:      	mov	w0, w23
     538:      	sub	sp, x29, #0x50
     53c:      	ldp	x29, x30, [sp, #0x50]
     540:      	ldp	x20, x19, [sp, #0x40]
     544:      	ldp	x22, x21, [sp, #0x30]
     548:      	ldp	x24, x23, [sp, #0x20]
     54c:      	ldp	x26, x25, [sp, #0x10]
     550:      	ldp	x28, x27, [sp], #0x60
     554:      	ret
     558:      	mov	w2, #0x14               ; =20
     55c:      	b	0x56c <ltmp0+0x56c>
     560:      	mov	w2, #0x20               ; =32
     564:      	b	0x56c <ltmp0+0x56c>
     568:      	mov	w2, #0x1c               ; =28
     56c:      	ldp	x27, x25, [x19, #0x18]
     570:      	ldr	x28, [x19, #0x10]
     574:      	mov	x0, x22
     578:      	mov	w1, #0x1                ; =1
     57c:      	bl	0x57c <ltmp0+0x57c>
     580:      	mov	x0, x22
     584:      	mov	w1, wzr
     588:      	mov	w2, #0xb                ; =11
     58c:      	bl	0x58c <ltmp0+0x58c>
     590:      	mov	x0, x22
     594:      	mov	x1, x28
     598:      	bl	0x598 <ltmp0+0x598>
     59c:      	ldr	x2, [x27, #0x10]
     5a0:      	mov	x0, x22
     5a4:      	mov	x1, x25
     5a8:      	bl	0x5a8 <ltmp0+0x5a8>
     5ac:      	mov	w1, #0x1                ; =1
     5b0:      	mov	x0, x22
     5b4:      	bl	0x5b4 <ltmp0+0x5b4>
     5b8:      	mov	w23, w0
     5bc:      	cmp	w0, #0x2
     5c0:      	b.ne	0x510 <ltmp0+0x510>
     5c4:      	b	0x52c <ltmp0+0x52c>
     5c8:      	adrp	x2, 0x0 <ltmp0>
     5cc:      	add	x2, x2, #0x0
     5d0:      	mov	x0, x22
     5d4:      	mov	w1, #0xe                ; =14
     5d8:      	mov	w3, #0x15               ; =21
     5dc:      	bl	0x5dc <ltmp0+0x5dc>
     5e0:      	mov	w2, #0x8                ; =8
     5e4:      	b	0x574 <ltmp0+0x574>
     5e8:      	adrp	x2, 0x0 <ltmp0>
     5ec:      	add	x2, x2, #0x0
     5f0:      	mov	x0, x22
     5f4:      	mov	w1, #0xd                ; =13
     5f8:      	mov	w3, #0x16               ; =22
     5fc:      	b	0x658 <ltmp0+0x658>
     600:      	adrp	x2, 0x0 <ltmp0>
     604:      	add	x2, x2, #0x0
     608:      	mov	x0, x22
     60c:      	mov	w1, #0x9                ; =9
     610:      	mov	w3, #0x18               ; =24
     614:      	bl	0x614 <ltmp0+0x614>
     618:      	mov	x0, x22
     61c:      	mov	w1, wzr
     620:      	mov	w2, #0xd                ; =13
     624:      	b	0x58c <ltmp0+0x58c>
     628:      	adrp	x2, 0x0 <ltmp0>
     62c:      	add	x2, x2, #0x0
     630:      	mov	x0, x22
     634:      	mov	w1, #0x6                ; =6
     638:      	mov	w3, #0x13               ; =19
     63c:      	bl	0x63c <ltmp0+0x63c>
     640:      	b	0x59c <ltmp0+0x59c>
     644:      	adrp	x2, 0x0 <ltmp0>
     648:      	add	x2, x2, #0x0
     64c:      	mov	x0, x22
     650:      	mov	w1, #0xe                ; =14
     654:      	mov	w3, #0x15               ; =21
     658:      	bl	0x658 <ltmp0+0x658>
     65c:      	mov	x0, x22
     660:      	mov	w1, wzr
     664:      	mov	w2, #0x2                ; =2
     668:      	b	0x58c <ltmp0+0x58c>
     66c:      	mov	x0, x22
     670:      	mov	w1, wzr
     674:      	mov	w2, #0x3                ; =3
     678:      	b	0x58c <ltmp0+0x58c>
     67c:      	mov	x0, x22
     680:      	mov	w1, wzr
     684:      	mov	w2, #0x4                ; =4
     688:      	b	0x58c <ltmp0+0x58c>
     68c:      	mov	x0, x22
     690:      	mov	w1, wzr
     694:      	mov	w2, #0x5                ; =5
     698:      	b	0x58c <ltmp0+0x58c>
     69c:      	mov	x0, x22
     6a0:      	mov	w1, wzr
     6a4:      	mov	w2, #0x6                ; =6
     6a8:      	b	0x58c <ltmp0+0x58c>
     6ac:      	mov	x0, x22
     6b0:      	mov	w1, wzr
     6b4:      	mov	w2, #0x7                ; =7
     6b8:      	b	0x58c <ltmp0+0x58c>
     6bc:      	adrp	x2, 0x0 <ltmp0>
     6c0:      	add	x2, x2, #0x0
     6c4:      	mov	x0, x22
     6c8:      	mov	w1, #0x6                ; =6
     6cc:      	mov	w3, #0x13               ; =19
     6d0:      	bl	0x6d0 <ltmp0+0x6d0>
     6d4:      	b	0x580 <ltmp0+0x580>
     6d8:      	mov	w2, wzr
     6dc:      	b	0x574 <ltmp0+0x574>
     6e0:      	mov	w2, #0x2b               ; =43
     6e4:      	b	0x574 <ltmp0+0x574>
     6e8:      	mov	w2, #0x2c               ; =44
     6ec:      	b	0x574 <ltmp0+0x574>
     6f0:      	mov	w2, #0x2e               ; =46
     6f4:      	b	0x574 <ltmp0+0x574>
     6f8:      	mov	x0, x22
     6fc:      	bl	0x6fc <ltmp0+0x6fc>
     700:      	b	0x590 <ltmp0+0x590>
     704:      	mov	x0, x22
     708:      	mov	w1, wzr
     70c:      	mov	w2, #0x12               ; =18
     710:      	b	0x58c <ltmp0+0x58c>

The shipped modules

ImportImplementation characterResponsibility
std.iopure LuceReader/Writer contracts and shared drain/send loops
std.mathLuce over numeric primitivesconstants, transcendentals, reductions, transforms, deterministic RNG
std.stringspure Luce over core textsearch, classes, trim, case, replace, split/join, width, formatting
std.listsLuce template routed as methodstable comparator sorting specialized for element type
std.pathspure Luceportable parsing, joining, and normalization of path text
std.filesLuce wrapper + host channelpath queries, whole-file helpers, directories, ARC File class
std.osLuce wrapper + host servicesconsole, clocks, environment, processes, streams, machine facts
std.termLuce API + terminal hostframes, styles, events, clipboard, dimensions
std.jsonpure LuceRFC 8259 tree union, parser, typed access, compact/pretty writer
std.zipcodec in LuceZIP archive structure, DEFLATE, CRC, extraction and writing
std.gpuLuce wrapper + graphics hostbackend-neutral surface operations
std.networkLuce classes + socket channelTCP Connection and Listener resources
std.httpHTTP/1.1 in Luceclient, requests, response parsing, JSON/text convenience
std.uiLuce class + window hostwindow identity and its owned GPU surface

How import becomes source

  1. Recognize std.nameThe source loader consults the one embedded-module table.
  2. Register ordinary bytesThe .luc file receives a source identity and line table like any project module.
  3. Check ordinary declarationsPublic/private rules, types, ARC, failure, interfaces, and calls are unchanged.
  4. Prune unreachable declarationsOnly the functions and effects reached by the program survive into native code.

How a standard module asks the host for help

Pure modules use language operations. Hosted modules invoke synthetic Builtin rows that semantics recognizes for embedded standard source. Reachability records each host operation the selected program can call, so importing a module by itself adds neither an artifact callback requirement nor generated code.

Compiler-routed methods

Some algorithms read naturally as receiver calls while remaining library source. After std.lists is imported, values.sort_by(before) routes to a type-specialized function defined in lists.luc. Diagnostics name the required import, which makes the method's library dependency visible.

What a new module costs

A module needs one .luc source, one embedded-table row, positive and negative differential specs, explicit host fixtures if hosted, any justified method routing, and a public Library page whose signatures pass the coverage audit. A host-table change may additionally bump the ABI; a pure private helper does not.